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

 

posted @ 2021-08-19 14:41  那些年的事儿  阅读(829)  评论(0编辑  收藏  举报