mybatis學習筆記(10)-一對一查詢

mybatis學習筆記(10)-一對一查詢

標籤: mybatisjava


[TOC]git


本文使用兩種方式(resultType和resultMap)實現一對一查詢,查詢訂單信息,關聯查詢建立訂單的用戶信息github

resultType實現

  • sql語句

肯定查詢的主表:訂單表sql

肯定查詢的關聯表:用戶表mybatis

關聯查詢使用內鏈接?仍是外鏈接?app

因爲orders表中有一個外鍵(user_id),經過外鍵關聯查詢用戶表只能查詢出一條記錄,可使用內鏈接。學習

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id
  • 建立pojo

將上邊sql查詢的結果映射到pojo中,pojo中必須包括全部查詢列名。測試

原始的Orders.java不能映射所有字段,須要新建立的pojo。網站

建立一個pojo繼承包括查詢字段較多的po類。this

對應數據表的幾個pojo類(Items,Orderdetail,Orders)就是把該類的屬性名設爲和數據表列字段名相同,併爲這些屬性添加getter和setter,在這裏就不貼代碼了,只貼出對應於關聯查詢的自定義pojo類OrdersCustom的代碼

package com.iot.mybatis.po;

/**
 * 
 * <p>Title: OrdersCustom</p>
 * <p>Description: 訂單的擴展類</p>
 */
//經過此類映射訂單和用戶查詢的結果,讓此類繼承包括 字段較多的pojo類
public class OrdersCustom extends Orders{
	
	//添加用戶屬性
	/*USER.username,
	  USER.sex,
	  USER.address */
	
	private String username;
	private String sex;
	private String address;


	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}

}
  • mapper.xml
<!-- 查詢訂單關聯查詢用戶信息 -->
<select id="findOrdersUser"  resultType="com.iot.mybatis.po.OrdersCustom">
  SELECT
      orders.*,
      user.username,
      user.sex,
      user.address
    FROM
      orders,
      user
    WHERE orders.user_id = user.id
</select>
  • mapper.java
//查詢訂單關聯查詢用戶信息
public List<OrdersCustom> findOrdersUser()throws Exception;
}

resultMap實現

使用resultMap將查詢結果中的訂單信息映射到Orders對象中,在orders類中添加User屬性,將關聯查詢出來的用戶信息映射到orders對象中的user屬性中。

  • 定義resultMap
<!-- 訂單查詢關聯用戶的resultMap
將整個查詢的結果映射到com.iot.mybatis.po.Orders中
 -->
<resultMap type="com.iot.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="com.iot.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>
  • statement定義
<!-- 查詢訂單關聯查詢用戶信息 -->
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
    SELECT
    orders.*,
    user.username,
    user.sex,
    user.address
    FROM
    orders,
    user
    WHERE orders.user_id = user.id
</select>
  • mapper.java
//查詢訂單關聯查詢用戶使用resultMap
public List<Orders> findOrdersUserResultMap()throws Exception;
  • 測試代碼
@Test
public void testFindOrdersUserResultMap() throws Exception {

	SqlSession sqlSession = sqlSessionFactory.openSession();
	// 建立代理對象
	OrdersMapperCustom ordersMapperCustom = sqlSession
			.getMapper(OrdersMapperCustom.class);

	// 調用maper的方法
	List<Orders> list = ordersMapperCustom.findOrdersUserResultMap();

	System.out.println(list);

	sqlSession.close();
}

resultType和resultMap實現一對一查詢小結

實現一對一查詢:

  • resultType:使用resultType實現較爲簡單,若是pojo中沒有包括查詢出來的列名,須要增長列名對應的屬性,便可完成映射。若是沒有查詢結果的特殊要求建議使用resultType。
  • resultMap:須要單獨定義resultMap,實現有點麻煩,若是對查詢結果有特殊的要求,使用resultMap能夠完成將關聯查詢映射pojo的屬性中。
  • resultMap能夠實現延遲加載,resultType沒法實現延遲加載。

做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索