• 18_高级映射:一对一查询(使用resultMap)


    【简述】

    数据库模型和数据等信息与上一篇博文相同。

    需求也同上一篇博文。

    【工程截图】

    【User.java】POJO

    package cn.higgin.mybatis.po;
    
    import java.util.Date;
    
    public class User {
        //属性名和数据库表的字段对应
        private int id;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        //省略get/set方法  
    }

    【Orders.java】

    package cn.higgin.mybatis.po;
    
    import java.util.Date;
    
    public class Orders {
        
        private Integer id;
        private Integer userId;
        private String number;
        private Date createtime;
        private String note;
        //注意!!!这里引入了User
        private User user;
        
        //省略get/set方法......
    }

    【OrdersMapperCustomer.java】

    package cn.higgin.mybatis.mapper;
    
    import java.util.List;
    
    import cn.higgin.mybatis.po.Orders;
    
    public interface OrdersMapperCustom {
        
        //查询订单关联查询用户信息,使用resultMap方式
        public List<Orders> findOrdersUserResultMap() throws Exception;
    }

    【OrdersMapperCustom.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">
    
    <mapper namespace="cn.higgin.mybatis.mapper.OrdersMapperCustom">
        
        <!--
             订单查询关联用户的resultMap
            将整个查询的结果映射到cn.higgin.mybatis.po.Orders中
         -->
         <resultMap type="cn.higgin.mybatis.po.Orders" id="OrdersUserResultMap">
             <!-- 配置订单的映射信息 -->
             <!-- 
                 id:指定查询列中的唯一标识,订单信息中的唯一标识,若有多个列组成唯一标识,需配置多个id
                 column: 订单信息的唯一标识列
                 property: 订单信息的唯一标识列所映射到的 Orders的对应的属性
              -->
              <id column="id" property="id"/>
              <result column="user_id" property="userId"/>
              <result column="number" property="number" />
              <result column="createtime" property="createtime"/>
              <result column="note" property="note" />
              
              <!-- 配置映射的关联的用户信息 -->
              <!-- association:用于映射关联查询单个对象的信息
                  property:要将关联查询的用户信息映射到Orders中的对应属性
               -->
               <association property="user" javaType="cn.higgin.mybatis.po.User">
                   <!-- 
                       id:关联查询用户的唯一标识
                       column:指定唯一标识用户信息的列
                       javaType:映射到user的对应属性
                    -->
                    <id column="user_id" property="id"/>
                    <result column="username" property="username"/>
                    <result column="sex" property="sex"/>
                    <result column="address" property="address"/>
               </association>
         </resultMap>
        
        <!-- 查询订单关联查询用户信息,使用resultMap -->
        <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
            SELECT
                orders.*,
                USER.username,
                USER.sex,
                USER.address
                FROM
                orders,USER
            WHERE orders.user_id=user.id
        </select> 
        
    </mapper>

    【SqpMapperConfig.java和db.properties同上一篇博文】

    【OrderMapperCustomTest.java】

    package cn.higgin.mybatis.mapper;
    
    import java.io.InputStream;
    import java.util.List;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Before;
    import org.junit.Test;
    
    import cn.higgin.mybatis.po.Orders;
    
    public class OrdersMapperCustomTest {
        private SqlSessionFactory sqlSessionFactory;
    
        // 此方法是在执行testFindUserById之前执行
        @Before
        public void setUp() throws Exception {
            // 创建sqlSessionFactory
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
    
            // 创建会话工厂,传入mybatis的配置文件信息
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        @Test
        public void testFindOrdersUser() throws Exception {
            SqlSession sqlSession=sqlSessionFactory.openSession();
            //创建代理对象
            OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
            
            //调用mapper的方法
            List<Orders> list=ordersMapperCustom.findOrdersUserResultMap();
            
            System.out.println(list.size());
            
            sqlSession.close();
            
        }
    
    }

    【运行结果】

    【小结】

    实现一对一查询的情况下:

    [ resultType ]

    使用resultType较为方便,如果pojo中没有包含查询出来的列名,需要增加列名对应的属性,即可完成映射。

    如果没有查询结果的特殊要求建议使用resultType。

    [ resultMap ]

    需要单独定义resultMap,实现有点麻烦。如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射到pojo的属性中。

    [ 注意 ]

    resultMap可以实现延迟加载,resultType无法实现延迟加载。

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5849513.html
Copyright © 2020-2023  润新知