數據模型分析
- 每張表的數據內容
- 每張表的重要字段(主外鍵)
- 需要了解表和表之間的關係(外鍵)
- 需要了解表與表之間的業務關係
一對一關係映射
一對多關係映射
多對多關係映射
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區別
- 如果沒有查詢結果的特殊要求時(查詢字段和pojo中的屬性完全一致的時候),可以使用resultType
作用場合:常見的一些明細記錄展示 - 如果對查詢結果有特殊要求時,可以使用resultMap將關聯查詢映射到pojo屬性中
作用場合:將關聯查詢信息映射到一個pojo