一对一关系:

首先在数据库中新增地址表(t_address)用于存储人员的地址信息:

  1. CREATE TABLE `t_address` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `country` varchar(100) DEFAULT NULL,
  4. `city` varchar(100) DEFAULT NULL,
  5. `district` varchar(100) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

然后在人员信息表(t_person)中增加addressId字段:

ALTER TABLE t_person ADD addressId int(11);

在com.Aiden.domain中新增地址信息的实体类(Address.java):

  1. package com.Aiden.domain;
  2.  
  3. public class Address {
  4.  
  5. private Integer id;
  6. private String country;
  7. private String city;
  8. private String district;
  9. public Address() {
  10. super();
  11. }
  12. public Address(String country, String city, String district) {
  13. super();
  14. this.country = country;
  15. this.city = city;
  16. this.district = district;
  17. }
  18. public Address(Integer id, String country, String city, String district) {
  19. super();
  20. this.id = id;
  21. this.country = country;
  22. this.city = city;
  23. this.district = district;
  24. }
  25. public Integer getId() {
  26. return id;
  27. }
  28. public void setId(Integer id) {
  29. this.id = id;
  30. }
  31. public String getCountry() {
  32. return country;
  33. }
  34. public void setCountry(String country) {
  35. this.country = country;
  36. }
  37. public String getCity() {
  38. return city;
  39. }
  40. public void setCity(String city) {
  41. this.city = city;
  42. }
  43. public String getDistrict() {
  44. return district;
  45. }
  46. public void setDistrict(String district) {
  47. this.district = district;
  48. }
  49. @Override
  50. public String toString() {
  51. return "Address [id=" + id + ", country=" + country + ", city=" + city + ", district=" + district + "]";
  52. }
  53. }

在com.Aiden.dao中新增地址信息的接口(addressMapper.java):

  1. package com.Aiden.dao;
  2. public interface addressMapper {}

在com.Aiden.dao中新增地址信息的映射文件(addressMapper.xml):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.Aiden.dao.addressMapper">
  6. </mapper>

在Person实体类中增加address属性并添加get、set方法:

  1. private Address address;
  2.  
  3. public Address getAddress() {
  4. return address;
  5. }
  6. public void setAddress(Address address) {
  7. this.address = address;
  8. }

在com.Aiden.service包中创建新的Junit测试类(MyBatisDemo02.Java),并添加测试方法:

  1. package com.Aiden.service;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import java.util.List;
  6.  
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.log4j.Logger;
  9. import org.junit.After;
  10. import org.junit.Before;
  11. import org.junit.Test;
  12.  
  13. import com.Aiden.dao.personMapper;
  14. import com.Aiden.domain.Person;
  15. import com.Aiden.util.SqlSessionFactoryUtil;
  16. /**
  17. * 一对一、一对多关系映射
  18. * @author 郭祥跃
  19. *
  20. */
  21. public class MybatisDemo02 {
  22. private static Logger logger=Logger.getLogger(MybatisDemo02.class);
  23. private static SqlSession sqlSession=null;
  24. private static personMapper personMapper=null;
  25.  
  26. @Before
  27. public void setUp() throws Exception {
  28. sqlSession=SqlSessionFactoryUtil.openSession();
  29. System.out.println(sqlSession);
  30. personMapper=sqlSession.getMapper(personMapper.class);
  31. }
  32.  
  33. @After
  34. public void tearDown() throws Exception {
  35. sqlSession.close();
  36. }
  37.  
  38. @Test
  39. public void testFindPersonWithAddressById() {
  40. logger.info("一对多关系映射");
  41. List<Person> person=personMapper.findPersonWithAddressById(3);
  42. System.out.println(person);
  43. }
  44.  
  45. }

在personMapper.java文件中添加新的接口(findPersonWithAddressById):

  1. /**
  2. * 根据ID查询人员及地址信息
  3. * @param id
  4. * @return
  5. */
  6. public List<Person> findPersonWithAddressById(Integer id);

在personMapper.xml文件中添加select查询:

  1. <select id="findPersonWithAddressById" parameterType="Integer" resultMap="resultPersonWithAddress">
  2. select * from t_person tp,t_address ta where tp.addressId=ta.id and tp.id=#{id}
  3. </select>

添加resultMap返回结果:此处resultMap标签有几种不同的实现,记之如下:

第一种:

  1. <resultMap type="Person" id="resultPersonWithAddress">
  2. <id property="id" column="id"/>
  3. <result property="name" column="name"/>
  4. <result property="age" column="age"/>
  5.  
  6. <result property="address.id" column="id"/>
  7. <result property="address.country" column="country"/>
  8. <result property="address.city" column="city"/>
  9. <result property="address.district" column="district"/>
  10. </resultMap>

查询结果:

第二种:

  1. <resultMap type="Person" id="resultPersonWithAddress">
  2. <id property="id" column="id"/>
  3. <result property="name" column="name"/>
  4. <result property="age" column="age"/>
  5.  
  6. <association property="address" resultMap="resultAddress"/>
  7. </resultMap>
  8. <resultMap type="Address" id="resultAddress">
  9. <id property="id" column="id"/>
  10. <result property="country" column="country"/>
  11. <result property="city" column="city"/>
  12. <result property="district" column="district"/>
  13. </resultMap>

查询结果:

第三种:

  1. <resultMap type="Person" id="resultPersonWithAddress">
  2. <id property="id" column="id" />
  3. <result property="name" column="name" />
  4. <result property="age" column="age" />
  5.  
  6. <association property="address" javaType="Address">
  7. <id property="id" column="id" />
  8. <result property="country" column="country" />
  9. <result property="city" column="city" />
  10. <result property="district" column="district" />
  11. </association>
  12. </resultMap>

查询结果:

第四种(最常用):

这种方法借助于Address的查询方法进行实现:

首先在addressMapper.java接口文件中,添加查询的接口:

  1. package com.Aiden.dao;
  2.  
  3. import com.Aiden.domain.Address;
  4.  
  5. public interface addressMapper {
  6. /**
  7. * 根据ID查询地址消息
  8. * @param id
  9. * @return
  10. */
  11. public Address findById(Integer id);
  12. }

然后在addressMapper.xml中添加select标签:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.Aiden.dao.addressMapper">
  6.  
  7. <select id="findAddressById" parameterType="Integer" resultType="Address">
  8. select * from t_address where id=#{id}
  9. </select>
  10.  
  11. </mapper>

修改personMapper.xml中的resultMap为:

  1. <resultMap type="Person" id="resultPersonWithAddress">
  2. <id property="id" column="id" />
  3. <result property="name" column="name" />
  4. <result property="age" column="age" />
  5. <association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
  6. </resultMap>

查询结果:

一对多关系:

简单的说一对多的关系可以用多个一对一关系实现。

首先在数据库中新增公司信息表(t_company)用于存储人员的地址信息:

  1. CREATE TABLE `t_company` (
  2. `Id` int(11) NOT NULL AUTO_INCREMENT,
  3. `companyName` varchar(100) DEFAULT NULL,
  4. PRIMARY KEY (`Id`)
  5. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

然后在人员信息表(t_person)中增加addressId字段:

ALTER TABLE t_person ADD companyId int(11);

在com.Aiden.domain中新增公司信息的实体类(Company.java):

  1. package com.Aiden.domain;
  2.  
  3. import java.util.List;
  4.  
  5. public class Company {
  6. private Integer id;
  7. private String companyName;
  8. private List<Person> persons;
  9. public Company() {
  10. super();
  11. }
  12. public Company(String companyName) {
  13. super();
  14. this.companyName = companyName;
  15. }
  16. public Company(Integer id, String companyName) {
  17. super();
  18. this.id = id;
  19. this.companyName = companyName;
  20. }
  21. public Integer getId() {
  22. return id;
  23. }
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27. public String getCompanyName() {
  28. return companyName;
  29. }
  30. public void setCompanyName(String companyName) {
  31. this.companyName = companyName;
  32. }
  33. public List<Person> getPersons() {
  34. return persons;
  35. }
  36. public void setPersons(List<Person> persons) {
  37. this.persons = persons;
  38. }
  39. @Override
  40. public String toString() {
  41. return "Company [id=" + id + ", companyName=" + companyName + "]";
  42. }
  43. }

在com.Aiden.dao中新增公司信息的接口(companyMapper.java):

  1. package com.Aiden.dao;
  2.  
  3. import com.Aiden.domain.Company;
  4.  
  5. public interface companyMapper {
  6. /**
  7. * 根据ID查询公司详情
  8. * @param id
  9. * @return
  10. */
  11. public Company findCompanyById(Integer id);
  12.  
  13. }

在com.Aiden.dao中新增公司信息的映射文件(companyMapper.xml):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.Aiden.dao.companyMapper">
  6.  
  7. <resultMap type="Company" id="resultCompany">
  8. <id property="id" column="id"/>
  9. <result property="companyName" column="companyName"/>
  10. <collection property="persons" column="id" select="com.Aiden.dao.personMapper.findPersonWithByCompanyId"/>
  11. </resultMap>
  12.  
  13. <select id="findCompanyById" parameterType="Integer" resultMap="resultCompany">
  14. select * from t_company where id=#{id}
  15. </select>
  16.  
  17. </mapper>

在person实体类中添加company属性及get、set方法:

  1. private Company company;
  2.  
  3. public Company getCompany() {
  4. return company;
  5. }
  6. public void setCompany(Company company) {
  7. this.company = company;
  8. }

在personMapper.java中添加新的查询接口:

  1. /**
  2. * 根据公司Id查询人员信息
  3. * @param id
  4. * @return
  5. */
  6. public List<Person> findPersonWithByCompanyId(Integer companyId);

在personMapper.xml添加查询select及resultMap:

  1. <select id="findPersonWithByCompanyId" parameterType="Integer" resultMap="resultPersonWithCompany">
  2. select * from t_person where companyId=#{companyId}
  3. </select>
  4.  
  5. <resultMap type="Person" id="resultPersonWithCompany">
  6. <id property="id" column="id" />
  7. <result property="name" column="name" />
  8. <result property="age" column="age" />
  9. <association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
  10. <association property="company" column="companyId" select="com.Aiden.dao.companyMapper.findCompanyById"/>
  11. </resultMap>

在测试类MybatisDemo02.java中添加测试方法,运行:

  1. @Test
  2. public void testFindPersonWithByCompanyId() {
  3. logger.info("一对多关系映射——根据公司ID查询人员");
  4. List<Person> person=personMapper.findPersonWithByCompanyId(1);
  5. for (Person p : person) {
  6. System.out.println(p);
  7. }
  8. }

运行结果:

MyBatis日记(五):一对一关系,一对多关系的更多相关文章

  1. EF Code First中的主外键约定和一对一、一对多关系的实现

    对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...

  2. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  3. [转]NHibernate之旅(9):探索父子关系(一对多关系)

    本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...

  4. mybatis的面试一对一,一对多,多对多的mapper.xml配置

    使用springboot完成一对一,一对多: https://blog.csdn.net/KingBoyWorld/article/details/78966789 传统的mapper文件中的一对一, ...

  5. NHibernate初学五之关联一对多关系

    1:创建两张表T_Country.T_Person:其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person CREATE TABLE ...

  6. mybatis中实现一对一,一对多查询

    在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...

  7. MyBatis中collection (一对一,一对多)

    MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...

  8. mybatis 一对一与一对多collection和association的使用

    在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.association association通常用来映射一对一的关系,例如,有个类user,对应的实体 ...

  9. 【转】mybatis 一对一与一对多collection和association的使用

    转自:https://www.cnblogs.com/yansum/p/5819973.html (有修改和补充,红色字体部分)   在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单 ...

随机推荐

  1. Maven name=archetypeCatalog value=internal

    来源 https://www.cnblogs.com/del88/p/6286887.html IDEA根据maven archetype的本质,其实是执行mvn archetype:generate ...

  2. Delphi连接Oracle控件ODAC的安装及使用

    Delphi连接Oracle有很多种方式,但大多要在客户机上安装Oracle那庞大的客户端,比较不方便,使用ODAC控件连接Oracle则免去了这些麻烦.ODAC也是Oracle公司载发的控件.有fo ...

  3. SpringBoot 为什么能够自动的注入一些常用的Bean ?

    原文转载至:https://blog.csdn.net/qq_29941401/article/details/79605388 但是我一直没有搞懂druid是怎么自动配置的? 这个是properti ...

  4. 【maven学习】pom.xml文件详解

    环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示, ...

  5. Ajax跨域请求附带Cookie/Ajax跨域请求附带身份凭证

    一.跨域请求中默认不带cookie等验证凭证 尤其对于post请求. 对于ajax请求,其中post,get都可以正常访问. withCredentials: false, // 允许携带cookie ...

  6. SpringBoot系列教程web篇之过滤器Filter使用指南

    web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...

  7. PHP变量回收

    PHP变量回收1 离开页面2 unset

  8. python:求整数的二进制表示

    求解方法: 1.整数求余 2.重复进行,整数除2再求余,直到除数为0 3.拼接余数 4.反转字符串 def int2two(intNo): twoStr='' if intNo == 0: twoSt ...

  9. 【剑指offer】删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1->2->3->3->4->4->5 处理后为 ...

  10. [转帖]NSA武器库知识整理

    NSA武器库知识整理 https://www.cnblogs.com/FrostDeng/p/7120812.html 美国国家安全局(NSA)旗下的“方程式黑客组织”(shadow brokers) ...