zoukankan      html  css  js  c++  java
  • 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无法实现延迟加载。

  • 相关阅读:
    libusbwin32
    KMP
    windows.h
    iomanip
    C++继承
    LIST
    fstream
    VS2010中调试c++程序的方法
    sstream
    char 与char* 字符串与字符
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5849513.html
Copyright © 2011-2022 走看看