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 ...