1. 程式人生 > 其它 >MyBatis的關聯對映,resultMap元素之collection子元素,實現一對多關聯關係(節選自:Java EE企業級應用開發教程)

MyBatis的關聯對映,resultMap元素之collection子元素,實現一對多關聯關係(節選自:Java EE企業級應用開發教程)

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]]]