zoukankan      html  css  js  c++  java
  • 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无法实现延迟加载
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/jack1995/p/7260705.html
Copyright © 2011-2022 走看看