MyBatis日记(五):一对一关系,一对多关系
一对一关系:
首先在数据库中新增地址表(t_address)用于存储人员的地址信息:
CREATE TABLE `t_address` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(100) DEFAULT NULL,
`city` varchar(100) DEFAULT NULL,
`district` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
然后在人员信息表(t_person)中增加addressId字段:
ALTER TABLE t_person ADD addressId int(11);
在com.Aiden.domain中新增地址信息的实体类(Address.java):
package com.Aiden.domain;
public class Address {
private Integer id;
private String country;
private String city;
private String district;
public Address() {
super();
}
public Address(String country, String city, String district) {
super();
this.country = country;
this.city = city;
this.district = district;
}
public Address(Integer id, String country, String city, String district) {
super();
this.id = id;
this.country = country;
this.city = city;
this.district = district;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
@Override
public String toString() {
return "Address [id=" + id + ", country=" + country + ", city=" + city + ", district=" + district + "]";
}
}
在com.Aiden.dao中新增地址信息的接口(addressMapper.java):
package com.Aiden.dao;
public interface addressMapper {}
在com.Aiden.dao中新增地址信息的映射文件(addressMapper.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Aiden.dao.addressMapper">
</mapper>
在Person实体类中增加address属性并添加get、set方法:
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
在com.Aiden.service包中创建新的Junit测试类(MyBatisDemo02.Java),并添加测试方法:
package com.Aiden.service; import static org.junit.Assert.*; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.Aiden.dao.personMapper;
import com.Aiden.domain.Person;
import com.Aiden.util.SqlSessionFactoryUtil;
/**
* 一对一、一对多关系映射
* @author 郭祥跃
*
*/
public class MybatisDemo02 {
private static Logger logger=Logger.getLogger(MybatisDemo02.class);
private static SqlSession sqlSession=null;
private static personMapper personMapper=null; @Before
public void setUp() throws Exception {
sqlSession=SqlSessionFactoryUtil.openSession();
System.out.println(sqlSession);
personMapper=sqlSession.getMapper(personMapper.class);
} @After
public void tearDown() throws Exception {
sqlSession.close();
} @Test
public void testFindPersonWithAddressById() {
logger.info("一对多关系映射");
List<Person> person=personMapper.findPersonWithAddressById(3);
System.out.println(person);
} }
在personMapper.java文件中添加新的接口(findPersonWithAddressById):
/**
* 根据ID查询人员及地址信息
* @param id
* @return
*/
public List<Person> findPersonWithAddressById(Integer id);
在personMapper.xml文件中添加select查询:
<select id="findPersonWithAddressById" parameterType="Integer" resultMap="resultPersonWithAddress">
select * from t_person tp,t_address ta where tp.addressId=ta.id and tp.id=#{id}
</select>
添加resultMap返回结果:此处resultMap标签有几种不同的实现,记之如下:
第一种:
<resultMap type="Person" id="resultPersonWithAddress">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/> <result property="address.id" column="id"/>
<result property="address.country" column="country"/>
<result property="address.city" column="city"/>
<result property="address.district" column="district"/>
</resultMap>
查询结果:

第二种:
<resultMap type="Person" id="resultPersonWithAddress">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/> <association property="address" resultMap="resultAddress"/>
</resultMap>
<resultMap type="Address" id="resultAddress">
<id property="id" column="id"/>
<result property="country" column="country"/>
<result property="city" column="city"/>
<result property="district" column="district"/>
</resultMap>
查询结果:

第三种:
<resultMap type="Person" id="resultPersonWithAddress">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" /> <association property="address" javaType="Address">
<id property="id" column="id" />
<result property="country" column="country" />
<result property="city" column="city" />
<result property="district" column="district" />
</association>
</resultMap>
查询结果:

第四种(最常用):
这种方法借助于Address的查询方法进行实现:
首先在addressMapper.java接口文件中,添加查询的接口:
package com.Aiden.dao;
import com.Aiden.domain.Address;
public interface addressMapper {
/**
* 根据ID查询地址消息
* @param id
* @return
*/
public Address findById(Integer id);
}
然后在addressMapper.xml中添加select标签:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Aiden.dao.addressMapper"> <select id="findAddressById" parameterType="Integer" resultType="Address">
select * from t_address where id=#{id}
</select> </mapper>
修改personMapper.xml中的resultMap为:
<resultMap type="Person" id="resultPersonWithAddress">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
</resultMap>
查询结果:

一对多关系:
简单的说一对多的关系可以用多个一对一关系实现。
首先在数据库中新增公司信息表(t_company)用于存储人员的地址信息:
CREATE TABLE `t_company` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`companyName` varchar(100) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
然后在人员信息表(t_person)中增加addressId字段:
ALTER TABLE t_person ADD companyId int(11);
在com.Aiden.domain中新增公司信息的实体类(Company.java):
package com.Aiden.domain;
import java.util.List;
public class Company {
private Integer id;
private String companyName;
private List<Person> persons;
public Company() {
super();
}
public Company(String companyName) {
super();
this.companyName = companyName;
}
public Company(Integer id, String companyName) {
super();
this.id = id;
this.companyName = companyName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Override
public String toString() {
return "Company [id=" + id + ", companyName=" + companyName + "]";
}
}
在com.Aiden.dao中新增公司信息的接口(companyMapper.java):
package com.Aiden.dao;
import com.Aiden.domain.Company;
public interface companyMapper {
/**
* 根据ID查询公司详情
* @param id
* @return
*/
public Company findCompanyById(Integer id);
}
在com.Aiden.dao中新增公司信息的映射文件(companyMapper.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Aiden.dao.companyMapper"> <resultMap type="Company" id="resultCompany">
<id property="id" column="id"/>
<result property="companyName" column="companyName"/>
<collection property="persons" column="id" select="com.Aiden.dao.personMapper.findPersonWithByCompanyId"/>
</resultMap> <select id="findCompanyById" parameterType="Integer" resultMap="resultCompany">
select * from t_company where id=#{id}
</select> </mapper>
在person实体类中添加company属性及get、set方法:
private Company company;
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
在personMapper.java中添加新的查询接口:
/**
* 根据公司Id查询人员信息
* @param id
* @return
*/
public List<Person> findPersonWithByCompanyId(Integer companyId);
在personMapper.xml添加查询select及resultMap:
<select id="findPersonWithByCompanyId" parameterType="Integer" resultMap="resultPersonWithCompany">
select * from t_person where companyId=#{companyId}
</select> <resultMap type="Person" id="resultPersonWithCompany">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
<association property="company" column="companyId" select="com.Aiden.dao.companyMapper.findCompanyById"/>
</resultMap>
在测试类MybatisDemo02.java中添加测试方法,运行:
@Test
public void testFindPersonWithByCompanyId() {
logger.info("一对多关系映射——根据公司ID查询人员");
List<Person> person=personMapper.findPersonWithByCompanyId(1);
for (Person p : person) {
System.out.println(p);
}
}
运行结果:

MyBatis日记(五):一对一关系,一对多关系的更多相关文章
- EF Code First中的主外键约定和一对一、一对多关系的实现
对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- [转]NHibernate之旅(9):探索父子关系(一对多关系)
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
- mybatis的面试一对一,一对多,多对多的mapper.xml配置
使用springboot完成一对一,一对多: https://blog.csdn.net/KingBoyWorld/article/details/78966789 传统的mapper文件中的一对一, ...
- NHibernate初学五之关联一对多关系
1:创建两张表T_Country.T_Person:其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person CREATE TABLE ...
- mybatis中实现一对一,一对多查询
在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...
- MyBatis中collection (一对一,一对多)
MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...
- mybatis 一对一与一对多collection和association的使用
在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.association association通常用来映射一对一的关系,例如,有个类user,对应的实体 ...
- 【转】mybatis 一对一与一对多collection和association的使用
转自:https://www.cnblogs.com/yansum/p/5819973.html (有修改和补充,红色字体部分) 在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单 ...
随机推荐
- 深入浅出依赖注入容器——Autofac
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...
- LODOP常见问题连接(含常见小问答博文)
问答大全 纸张打印机 注册 table表格 clodop测试地址 字体 超文本 行间距.字间距 clodop回调函数 条码 页眉页脚 SET……STYLEA 水平居中 简短排查 提示报错 慢进度条 套 ...
- 查看表空间使用情况(SQL)
1: --查询表空间使用情况 2: SELECT Upper(F.TABLESPACE_NAME) "表空间名", 3: D.TOT_GROOTTE_ ...
- Oracle 实现表中id字段自增长
Oracle 实现表中id字段自增长 最近正在学习Oracle的时候发现Oracle表中的字段不能像mysql中那样可以用auto increment修饰字段从而让id这种主键字段实现自增长. 那Or ...
- Fiddler抓包工具的简单使用
Fiddler的官方网站:http://www.fiddler2.com Fiddler的官方帮助:http://docs.telerik.com/fiddler/knowledgebase/quic ...
- 【idea】设置背景颜色
File->Settings->Editor->Color Scheme->General->Text->Default text->Background
- mybatis-3.5.2增删查改
这玩意没啥技术含量,只不过长时间不用,就显得生疏了.正好今天想读取一个文件写入数据库,平时都是集成环境,都碰不到这些基础东西,看来还是需要时常给自己找活干. 首先建立一个maven工程. next n ...
- Java设计RestfulApi接口,实现统一格式返回
创建返回状态码枚举 package com.sunny.tool.api.enums; /** * @Author sunt * @Description 响应枚举状态码 * @Date 2019/1 ...
- SQL SERVER 数据库查询表信息
SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a.colorder, 字段名 = ...
- sqlserver通过递归查找所有下级或上级部门和用户的操作实例
--查找当前用户所在部门的所有下级包括当前部门 with cte as ( as lvl from Department union all from cte c inner join Departm ...