MyBatis的關聯對映,resultMap元素之collection子元素,實現一對多關聯關係(節選自:Java EE企業級應用開發教程)
阿新 • • 發佈:2021-08-19
MyBatis對映檔案中的<resultMap>元素中,包含一個<collection>子元素,MyBatis通過它來處理一對多關聯關係。
<collection>子元素的大部分屬性與<association>子元素相同,但其還包含一個特殊屬性——ofType。ofType屬性與javaType屬性對應,它用於指定實體物件中集合類屬性所包含的元素型別。
本文是MyBatis的關聯對映,resultMap元素之association子元素,實現一對一關聯關係(節選自:Java EE企業級應用開發教程)文章的延續,如有配置上的問題,請參考上一篇文章。
一、建立資料結構及插入資料(MySQL),注意:請修改資料庫名
USE XUEJIA; # 建立一個名稱為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) ); # 插入3條資料 INSERT INTO tb_orders VALUES ('1', '1000011','1'); INSERT INTO tb_orders VALUES ('2', '1000012','2'); INSERT INTO tb_orders VALUES ('3', '1000013','3');
二、建立實體類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: 1 User [id=1, username=詹姆斯, address=克利夫蘭, ordersList=[Orders [id=1, number=1000011]]]