zoukankan      html  css  js  c++  java
  • 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]]]

  • 相关阅读:
    前端进击的巨人(一):执行上下文与执行栈,变量对象
    读书笔记(06)
    前端博客收藏
    Nodejs-Can't set headers after they are sent
    Mac OS安装包管理工具Homebrew教程
    webpack自动化构建脚本指令npm run dev/build
    使用express搭建node中间件
    【转】基于localStorage的资源离线和更新技术
    web前端性能优化
    Vue生命周期详解
  • 原文地址:https://www.cnblogs.com/nayitian/p/15161698.html
Copyright © 2011-2022 走看看