版权声明:转载请注明来源 https://blog.csdn.net/qq_24598601/article/details/83038370
一、背景知识
在介绍映射关系之前需要我们对 resultMap 要足够了解。在 resultMap 中有如下节点可配置:
- id :唯一标识列,column 为数据库ID列,property为 POJO 的id属性,注意在查询出的结果集中每一列都必须不一样,标记结果作为 ID 可以帮助提高整体效能;
- constructor :类在实例化时,用来注入结果到构造方法中id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能;注意:一是 constructor 中字段的顺序一定要与POJO中定义的字段顺序相同且类型匹配;二是如果POJO中只有有参构造方法时则必须配置;
- idArg :ID 参数;标记结果作为 ID 可以帮助提高整体效能;
- arg :注入到构造方法的一个普通结果。
- result :注入到字段或 POJO 属性的普通结果
- association :用于映射关联查询到单个对象的信息
- 嵌入结果映射 :结果映射自身的关联,或者参考一个
- collection :对关联查询到多条记录映射到集合对象中,其中属性ofType表示指定映射到集合属性中pojo的类型;
- 嵌入结果映射 :结果映射自身的关联,或者参考一个
- discriminator :使用结果值来决定使用哪个结果映射
- case :基于某些值的结果映射
- 嵌入结果映射 :这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。
- case :基于某些值的结果映射
关于 resultMap 的详细可查看 mybatis的Mapper文件配置
二、一对一映射关系
1. 需求:查询订单信息,关联查询创建订单的用户信息,ResultMap实现
2. 数据库表有 ORDERS,USER,ORDERDETAIL,ITEMS。点击下载
3. POJO类
Orders 与 User 是一对一的关系,在 Orders 中 加入 User 对象。
User.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 用户类
* @author 欧阳
*
*/
public class User {
private int id; //id
private String username; //用户名
private String sex; //性别
private Date birthday; //生日
private String address; //地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Orders.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 订单类
* @author 欧阳
*
*/
public class Orders {
private Integer id; //id
private Integer userId; //用户id
private String number; //数量
private Date createtime; //创建时间
private String note; //备注
private User user; //用户信息
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
4. 编写Mapper.xml
OrdersCustomMapper.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.mapper.OrdersCustomMapper">
<!--
查询订单信息,关联查询创建订单的用户信息(一对一查询)
使用resultMap将结果映射到OrdersCustom类中
-->
<!-- 定义查询订单及关联用户信息结果的resultMap -->
<resultMap type="com.po.Orders" id="OrdersUserResultMap">
<!-- 配置映射的订单信息 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 配置映射关系的用户信息 -->
<!--
association:用于映射关联查询单个对象的信息
property:将要关联查询的用户信息映射到Orders的哪个属性
-->
<association property="user" javaType="com.po.User">
<id column="id_" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT
ORDERS.*,
u.id id_,
u.USERNAME,
u.SEX,
u.address
FROM
ORDERS,
USER u
WHERE
ORDERS.user_id = u.ID
</select>
</mapper>
5. 编写Mapper接口(采用Mapper代理的方式)
OrdersCustomMapper.java
package com.mapper;
import java.util.List;
import com.po.Orders;
public interface OrdersCustomMapper {
/*
* 查询订单信息,关联查询创建订单的用户信息,ResultMap实现
*/
public List<Orders> findOrdersUserResultMap() throws Exception;
}
6. 测试
使用JUnit4 进行测试,下面是测试的主要代码。OrdersCustomMapperTest.java
private SqlSessionFactory sqlSessionFactory;
//此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
String resource = "config/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂
this.sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
@Test
public void testFindOrdersUserResultMap() {
SqlSession sqlsession = sqlSessionFactory.openSession();
OrdersCustomMapper mapper = sqlsession
.getMapper(OrdersCustomMapper.class);
try {
List<Orders> orders = mapper.findOrdersUserResultMap();
System.out.println(orders.size());
} catch (Exception e) {
e.printStackTrace();
}
}
三、一对多映射关系
1. 需求:查询订单及订单明细
2. POJO类
Orders.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 订单类
* @author 欧阳
*
*/
public class Orders {
private Integer id; //id
private Integer userId; //用户id
private String number; //数量
private Date createtime; //创建时间
private String note; //备注
private User user; //用户信息
private List<Orderdetail> orderdetail; //订单明细
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Orderdetail> getOrderdetail() {
return orderdetail;
}
public void setOrderdetail(List<Orderdetail> orderdetail) {
this.orderdetail = orderdetail;
}
}
User.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 用户类
* @author 欧阳
*
*/
public class User {
private int id; //id
private String username; //用户名
private String sex; //性别
private Date birthday; //生日
private String address; //地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Orderdetail.java
package com.po;
/**
* 订单详情类
* @author 欧阳
*
*/
public class Orderdetail {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrdersId() {
return ordersId;
}
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
}
public Integer getItemsId() {
return itemsId;
}
public void setItemsId(Integer itemsId) {
this.itemsId = itemsId;
}
public Integer getItemsNum() {
return itemsNum;
}
public void setItemsNum(Integer itemsNum) {
this.itemsNum = itemsNum;
}
}
3. 编写映射关系
将下面的代码加入 OrdersCustomMapper.xml 中
<!--
查询订单及订单明细(一对多查询)
-->
<!-- 定义查询订单及关联订单信息商品信息结果的resultMap -->
<resultMap type="com.po.Orders" id="OrdersAndOrderDetailResultMap">
<!-- 配置映射的订单信息 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 配置映射关系的用户信息 -->
<association property="user" javaType="com.po.User">
<id column="u_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
<!-- 配置映射关系的订单明细 -->
<!--
collection:对关联查询到多条记录映射到集合对象中
property:将要关联查询的用户信息映射到Orders的哪个属性
ofType:指定映射到集合属性中pojo的类型
-->
<collection property="orderdetail" ofType="com.po.Orderdetail">
<id column="od_id" property="id"/>
<result column="orders_id" property="ordersId"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
</collection>
</resultMap>
<select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
SELECT
o.*,
od.id od_id,
od.items_id,
od.items_num,
od.orders_id,
u.id u_id,
u.USERNAME,
u.SEX,
u.address
FROM
orders o,
orderDetail od,
user u
WHERE
o.id = od.orders_id
AND o.user_id = u.id
</select>
4. 编写映射接口
将下面代码添加到 OrdersCustomMapper.java 中
/*
* 查询订单及订单明细
*/
public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
5. 测试接口
将下面代码加入 OrdersCustomMapperTest.java 中
@Test
public void testFindOrdersAndOrderDetailResultMap() {
SqlSession sqlsession = sqlSessionFactory.openSession();
OrdersCustomMapper mapper = sqlsession
.getMapper(OrdersCustomMapper.class);
try {
List<Orders> orders = mapper.findOrdersAndOrderDetailResultMap();
System.out.println(orders.size());
} catch (Exception e) {
e.printStackTrace();
}
}
[1] mybatis的Mapper文件配置 https://www.cnblogs.com/caijh/p/7762679.html