高級映射

數據模型分析

  1. 每張表的數據內容
  2. 每張表的重要字段(主外鍵)
  3. 需要了解表和表之間的關係(外鍵)
  4. 需要了解表與表之間的業務關係

一對一關係映射

一對多關係映射

多對多關係映射

eg:查詢用戶及購買的商品信息

以上三種映射關係舉例

OrdersMapper.java

package com.hpe.mybatis.mapper;

import java.util.List;

import com.hpe.mybatis.po.Orders;
import com.hpe.mybatis.po.OrdersCustom;
import com.hpe.mybatis.po.User;

public interface OrdersMapper {
	
	// 查詢訂單關聯用戶信息(一對一)
	List<OrdersCustom> findOrdersUser() throws Exception;
	
	// 查詢訂單關聯用戶信息 使用resultMap,將查詢結果中的訂單信息映射到Order對象中
	// 在Order對象中增加一個User屬性(一對一)
	List<Orders> findOrdersUserResultMap() throws Exception;

	// 查詢訂單信息及訂單明細,使用ResultMap(一對多)
	List<Orders> findOrderAndDetail() throws Exception;
	
	// 查詢用戶購買的商品信息
	List<User> findUserAndItems() throws Exception;
}

OrdersMapper.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="com.hpe.mybatis.mapper.OrdersMapper">

	<!-- 定義查詢關聯用戶的resultMap -->
	<resultMap type="com.hpe.mybatis.po.Orders" id="OrdersUserResultMap">
		<!-- 配置映射的訂單信息
			 id:查詢訂單信息中的唯一標識,如果表中使用的是聯合主鍵,可以配置多個id
			 column:訂單信息的唯一標識列
			 property:訂單信息的唯一標識列所映射到pojo中那個屬性
		 -->
		<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:將關聯查詢的用戶信息映射到Order類中的user屬性中
		 	 javaType:user信息的全類名
		 -->
		<association property="user" javaType="com.hpe.mybatis.po.User">
			<!-- id:關聯查詢用戶的唯一標識
				 column:指定唯一標識用戶信息的列
				 property:映射到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 type="com.hpe.mybatis.po.Orders" id="OrderAndDetailResultMap1" extends="OrdersUserResultMap">
		<!-- 一對多使用collection進行映射
			 property: 對關聯查詢的多條記錄映射到Order類中的OrderDetail屬性
		 	 ofType:映射到集合屬性中的pojo類型,OrderDetail的全路徑
		 -->
		<collection property="orderdetails" ofType="com.hpe.mybatis.po.Orderdetail">
			<!-- id:訂單明細的唯一標識列
				 property:將訂單明細的唯一標識列映射到實體類對應屬性中
			 -->
			<id column="oderdetail_id" property="id"/>
			<result column="orders_id" property="ordersId"/>
			<result column="items_id" property="itemsId"/>
			<result column="items_num" property="itemsNum"/>
		</collection>
	</resultMap>
	
	<!-- 多對多:查詢用戶購買的商品信息 -->
	<resultMap type="User" id="UserAndItemsResultMap">
		<!-- 1.用戶信息 2.訂單信息 3.訂單明細 4.商品信息 -->
		<!-- 必須指定唯一標識列 -->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="sex" property="sex"/>
		<result column="address" property="address"/>
		
		<collection property="ordersList" ofType="com.hpe.mybatis.po.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"/>			
			
			<collection property="orderdetails" ofType="com.hpe.mybatis.po.Orderdetail">
				<id column="oderdetail_id" property="id"/>
				<result column="orders_id" property="ordersId"/>
				<result column="items_id" property="itemsId"/>
				<result column="items_num" property="itemsNum"/>
				<!-- 一個訂單明細對應一個商品(association) -->
				<association property="items" javaType="com.hpe.mybatis.po.Items">
					<id column="items_id" property="id"/>
					<result column="items_name" property="name"/>
					<result column="items_detail" property="detail"/>
					<result column="items_price" property="price"/>
				</association>
			</collection>
			
		</collection>
		
	</resultMap>
	
	<!--  一對一查詢訂單信息關聯用戶,使用resultType-->
	<select id="findOrdersUser" resultType="com.hpe.mybatis.po.OrdersCustom">
		SELECT o.*,u.username,u.sex,u.address
		FROM orders o
		INNER JOIN `user` u
		ON o.user_id = u.id
	</select>
	
	<!-- 一對一查詢訂單信息關聯用戶,使用resultMap -->
	<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
		SELECT o.*,u.username,u.sex,u.address
		FROM orders o
		INNER JOIN `user` u
		ON o.user_id = u.id
	</select>
	
	<!-- 一對多,訂單及訂單明細 -->
	<select id="findOrderAndDetail" resultMap="OrderAndDetailResultMap1">
		SELECT o.*,u.username,u.sex,u.address,od.id oderdetail_id,od.orders_id,od.items_id,od.items_num
		FROM orders o
		INNER JOIN `user` u
		ON o.user_id = u.id
		INNER JOIN orderdetail od
		ON od.orders_id = o.id
	</select>
	
	<!-- 多對多:查詢用戶購買的商品信息 -->
	<select id="findUserAndItems" resultMap="UserAndItemsResultMap">
		SELECT o.*,
		u.username,u.sex,u.address,
		od.id oderdetail_id,od.orders_id,od.items_id,od.items_num,
		i.name items_name,i.detail items_detail,i.price items_price
		FROM orders o
		INNER JOIN `user` u
		ON o.user_id = u.id
		INNER JOIN orderdetail od
		ON od.orders_id = o.id
		INNER JOIN items i
		ON od.items_id = i.id
	</select>
</mapper>

OrdersMapperTest.java測試類

package com.hpe.mybatis.test;

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 com.hpe.mybatis.mapper.OrdersMapper;
import com.hpe.mybatis.po.Orders;
import com.hpe.mybatis.po.OrdersCustom;
import com.hpe.mybatis.po.User;

public class OrdersMapperTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void setUp() throws Exception {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 創建會話工廠,傳入Mybatis配置信息
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	// 測試查詢訂單關聯,使用resultType
	@Test
	public void testFindOrdersUser(){
		// 創建會話
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 創建代理對象
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersCustom> list = null;
		try {
			list = ordersMapper.findOrdersUser();
		} catch (Exception e) {
			e.printStackTrace();
		}
		sqlSession.close();
		System.out.println(list);
	}
	@Test
	public void testFindOrdersUserResultMap() throws Exception{
		// 創建會話
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 創建代理對象
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<Orders> list = ordersMapper.findOrdersUserResultMap();
		sqlSession.close();
		System.out.println(list);
	}
	// 關聯訂單明細
	@Test
	public void testOrdersUserAndDetailResultMap() throws Exception{
		// 創建會話
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 創建代理對象
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<Orders> list = ordersMapper.findOrderAndDetail();
		sqlSession.close();
		System.out.println(list);
	}
	// 查詢用戶購買的商品信息
	@Test
	public void testFindUserAndItemsResultMap() throws Exception{
		// 創建會話
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 創建代理對象
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<User> list = ordersMapper.findUserAndItems();
		sqlSession.close();
		System.out.println(list);
	}
}

resultType和resultMap區別

  1. 如果沒有查詢結果的特殊要求時(查詢字段和pojo中的屬性完全一致的時候),可以使用resultType
    作用場合:常見的一些明細記錄展示
  2. 如果對查詢結果有特殊要求時,可以使用resultMap將關聯查詢映射到pojo屬性中
    作用場合:將關聯查詢信息映射到一個pojo
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章