MyBatis的关联映射,resultMap元素之collection子元素,实现一对多关联关系(节选自:Java EE企业级应用开发教程)
MyBatis映射文件中的<resultMap>元素中,包含一个<collection>子元素,MyBatis通过它来处理一对多关联关系。
<collection>子元素的大部分属性与<association>子元素相同,但其还包含一个特殊属性——ofType。ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。
本文是MyBatis的关联映射,resultMap元素之association子元素,实现一对一关联关系(节选自:Java EE企业级应用开发教程)文章的延续,如有配置上的问题,请参考上一篇文章。
一、创建数据结构及插入数据(MySQL),注意:请先选择数据库
# 创建一个名称为tb_user的表 CREATE TABLE tb_user ( id int(32) PRIMARY KEY AUTO_INCREMENT, username varchar(32), address varchar(256) ); # 插入3条数据 INSERT INTO tb_user VALUES ('1','詹姆斯','克利夫兰'); INSERT INTO tb_user VALUES ('2','科比','洛杉矶'); INSERT INTO tb_user VALUES ('3','保罗','洛杉矶'); # 创建一个名称为tb_orders的表 CREATE TABLE tb_orders ( id int(32) PRIMARY KEY AUTO_INCREMENT, number varchar(32) NOT NULL, user_id int(32) NOT NULL, FOREIGN KEY(user_id) REFERENCES tb_user(id) ); # 插入4条数据 INSERT INTO tb_orders VALUES ('1', '1000011','1'); INSERT INTO tb_orders VALUES ('2', '1000012','2'); INSERT INTO tb_orders VALUES ('3', '1000013','3');
INSERT INTO tb_orders VALUES ('4', '2000011','1');
二、创建实体类User/Orders
package com.itheima.po; import java.util.List; /** * 用户持久化类 */ public class User { private Integer id; // 用户编号 private String username; // 用户姓名 private String address; // 用户地址 private List<Orders> ordersList; //用户关联的订单 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List<Orders> getOrdersList() { return ordersList; } public void setOrdersList(List<Orders> ordersList) { this.ordersList = ordersList; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", address=" + address + ", ordersList=" + ordersList + "]"; } }
package com.itheima.po; import java.util.List; /** * 订单持久化类 */ public class Orders { private Integer id; //订单id private String number;//订单编号 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Orders [id=" + id + ", number=" + number + "]"; } }
三、创建映射文件UserMapper.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"> <!-- namespace表示命名空间 --> <mapper namespace="com.itheima.mapper.UserMapper"> <!-- 一对多:查看某一用户及其关联的订单信息 注意:当关联查询出的列名相同,则需要使用别名区分 --> <select id="findUserWithOrders" parameterType="Integer" resultMap="UserWithOrdersResult"> SELECT u.*,o.id as orders_id,o.number from tb_user u,tb_orders o WHERE u.id=o.user_id and u.id=#{id} </select> <resultMap type="User" id="UserWithOrdersResult"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="address" column="address"/> <!-- 一对多关联映射:collection ofType表示属性集合中元素的类型,List<Orders>属性即Orders类 --> <collection property="ordersList" ofType="Orders"> <id property="id" column="orders_id"/> <result property="number" column="number"/> </collection> </resultMap> </mapper>
四、修改MyBatis配置文件(mybatis-config.xml),加入如下内容:
<mapper resource="com/itheima/mapper/UserMapper.xml" />
五、修改测试程序MybatisAssociatedTest.java,加入如下内容:
/** * 一对多 */ @Test public void findUserTest() { // 1、通过工具类生成SqlSession对象 SqlSession session = MybatisUtils.getSession(); // 2、查询id为1的用户信息 User user = session.selectOne("com.itheima.mapper." + "UserMapper.findUserWithOrders", 1); // 3、输出查询结果信息 System.out.println(user); // 4、关闭SqlSession session.close(); }
六、运行结果
DEBUG [main] - ==> Preparing: SELECT u.*,o.id as orders_id,o.number from tb_user u,tb_orders o WHERE u.id=o.user_id and u.id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 2
User [id=1, username=詹姆斯, address=克利夫兰, ordersList=[Orders [id=1, number=1000011], Orders [id=4, number=2000011]]]