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無法實現延遲加載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM