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如何进行一对一.一对多的多表查询呢?这里用一个简单 ...
随机推荐
- Maven name=archetypeCatalog value=internal
来源 https://www.cnblogs.com/del88/p/6286887.html IDEA根据maven archetype的本质,其实是执行mvn archetype:generate ...
- Delphi连接Oracle控件ODAC的安装及使用
Delphi连接Oracle有很多种方式,但大多要在客户机上安装Oracle那庞大的客户端,比较不方便,使用ODAC控件连接Oracle则免去了这些麻烦.ODAC也是Oracle公司载发的控件.有fo ...
- SpringBoot 为什么能够自动的注入一些常用的Bean ?
原文转载至:https://blog.csdn.net/qq_29941401/article/details/79605388 但是我一直没有搞懂druid是怎么自动配置的? 这个是properti ...
- 【maven学习】pom.xml文件详解
环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示, ...
- Ajax跨域请求附带Cookie/Ajax跨域请求附带身份凭证
一.跨域请求中默认不带cookie等验证凭证 尤其对于post请求. 对于ajax请求,其中post,get都可以正常访问. withCredentials: false, // 允许携带cookie ...
- SpringBoot系列教程web篇之过滤器Filter使用指南
web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...
- PHP变量回收
PHP变量回收1 离开页面2 unset
- python:求整数的二进制表示
求解方法: 1.整数求余 2.重复进行,整数除2再求余,直到除数为0 3.拼接余数 4.反转字符串 def int2two(intNo): twoStr='' if intNo == 0: twoSt ...
- 【剑指offer】删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1->2->3->3->4->4->5 处理后为 ...
- [转帖]NSA武器库知识整理
NSA武器库知识整理 https://www.cnblogs.com/FrostDeng/p/7120812.html 美国国家安全局(NSA)旗下的“方程式黑客组织”(shadow brokers) ...