• Mybatis的关联查询(一)


    一对一的关联查询

    一、使用resultType进行输出映射

      1. 创建一个新的PO类,由于要将查询出来的属性映射到新的PO类。所有该PO类中应该有查询出来的所有列对应的属性。

    //定义新的PO类,该类继承Orders类。有了Orders的全部属性,然后再添加User的属性
    public class OrdersCustom extends Orders {
    
    	private String username;// 用户名称
    	private String address;// 用户地址
    	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;
    	}
    }
    

      2. 编写mapper.xml文件

     <select id="findOrderAndUserByType" resultType="OrdersCustom" >
            SELECT
                    orders.id,
                    orders.user_id userId,
                    orders.number,
                    orders.createtime,
                    orders.note,
                    USER .username,
                    USER .address
                FROM
                    orders,
                    USER
                WHERE
            orders.user_id = USER .id;
        </select>
    

      3. 编写mapper接口文件

        public List<OrdersCustom> findOrderAndUserByType() throws Exception;
    

      4. 测试代码

     public void testFindOrderAndUserByType() throws Exception{
            SqlSession session = sessionFactory.openSession();
            Mapper mapper = session.getMapper(Mapper.class);
            List<OrdersCustom> ordersCustomList = mapper.findOrderAndUserByType();
            for (OrdersCustom ordersCustom : ordersCustomList){
                System.out.println(ordersCustom);
            }
        }
    

    二、使用resultMap进行输出结果的映射

      1. 使用resultMap进行输出结果映射时,不在需要创建新的PO类,只需要在主查询表的PO类中新增管理查询PO类的属性即可。

    public class Orders {
        private Integer id;
    
        private Integer userId;
    
        private String number;
    
        private Date createtime;
    
        private String note;
    	//管理查询Po的类
        private User user;
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    ......
    }
    

      2. 创建映射的resultMap

    <resultMap id="OrderAndUserResultMap" type="Orders" >
            <!--
                查询结果中唯一标识列的映射
                column:查询出来的列名
                property:po中的属性名称
            -->
            <id column="id" property="id"/>
            <!--
                查询结果中普通列的映射
                column:查询出来的列名
                property:po中的属性名称
            -->
            <result column="user_id" property="userId" />
            <result column="number" property="number" />
            <result column="createtime" property="createtime" />
            <result column="note" property="note" />
            <!--
                association:该标签用来配置一对一的关系映射
                配置映射的关联的用户信息
                property:要映射到的po类中的属性(orders中的属性)
                javaType:要映射到的那个po类(User类)
            -->
            <association property="user" javaType="User" >
                <!--
               查询结果中唯一标识列的映射
               column:查询出来的列名
               property:po中的属性名称
                 -->
                <id column="user_id" property="id" />
                <!--
               查询结果中普通列的映射
               column:查询出来的列名
               property:po中的属性名称
                 -->
                <result column="username" property="username" />
                <result column="sex" property="sex" />
                <result column="address" property="address" />
             </association>
        </resultMap>
    

      3. 编写mapper.xml文件

     <select id="findOrderAndUserByMap" resultMap="OrderAndUserResultMap" >
                SELECT
                    orders.*,
                    USER .username,
                    USER .sex,
                    USER .address
                FROM
                    orders,
                    USER
                WHERE
            orders.user_id = USER .id;
        </select>
    

      4. 编写mapper接口文件

     public List<Orders> findOrderAndUserByMap() throws Exception;
    

      5. 测试代码

     public void testFindOrderAndUserByMap() throws Exception{
            SqlSession session = sessionFactory.openSession();
            Mapper mapper = session.getMapper(Mapper.class);
            List<Orders> ordersCustomList = mapper.findOrderAndUserByMap();
            for (Orders orders : ordersCustomList){
                System.out.println(orders);
            }
        }
    

    三 、两种查询方式的特点

    1. resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
    2. 如果没有查询结果的特殊要求建议使用resultType。
    3. resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
    4. resultMap可以实现延迟加载,resultType无法实现延迟加载
  • 相关阅读:
    程序员用HTML5给女朋友制作的3D相册
    CSS图片翻转动画技术详解
    jQuery实现的全选、反选和不选功能
    行内元素和块级元素
    &nbsp|&quot|&amp|&lt|&gt等html字符转义
    找回Git中丢失的Commit
    GIT的使用中的问题处理
    Linux下的常用指令汇总
    Pandas存储为Excel格式:单个xlsx文件下多sheet存储方法
    Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)
  • 原文地址:https://www.cnblogs.com/jack1995/p/7260705.html
Copyright © 2020-2023  润新知