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如何进行一对一.一对多的多表查询呢?这里用一个简单 ...
随机推荐
- openvswitch2.11.0修改源码后重新编译(2)
一:前提 已经正常安装了SDN环境(mininet和openswitch2.11.0和Ryu) 使用前面教程安装环境SDN实验---使用git安装Mininet (一)测试ovs是否正常使用 1.ry ...
- Java 面向接口的编程
面向接口的编程 什么是面向接口编程呢?我个人的定义是:在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能 ...
- java https post请求并忽略证书,参数放在body中
1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...
- webpack四个基础概念
本文参考自:https://www.cnblogs.com/xiaohuochai/p/7002344.html webpack 核心概念:入口(entry).输出(output).加载器(loade ...
- 创建Windows Service
基本参照使用C#创建Windows服务,添加了部分内容 目录 创建Windows Service 可视化管理Windows Service 调试 示例代码 创建Windows Service 选择C# ...
- 破解MySQL登录密码的几种方法
工具列表 Medusa Ncrack Hydra Metasploit Medusa medusa -h 192.168.1.106 –U /root/Desktop/user.txt –P /ro ...
- Java并发之等待/通知机制
目录 1 前言 1.1 先来段代码放松一下 2 Object wait()/notify() 2.1 一段入门代码 2.2 问题三连击 a.为什么官方说wait() 要放在while里面? b.为什么 ...
- time 库
time 库的三类函数 时间获取: >>> import time >>> time.time() 1570150181.4052463#单位为秒 >> ...
- IDEA更改JavaScript版本
最好改两个地方 File -> File -> -- --
- 解决非controller使用@Autowired注解注入为null问题
在SpringMVC框架中,我们经常要使用@Autowired注解注入Service或者Mapper接口,我们也知道,在controller层中注入service接口,在service层中注入其它的s ...