好程式設計師Java學習路線分享MyBatis之關聯查詢
好程式設計師Java 學習路線分享 MyBatis 之關聯查詢,我們進行資料庫查詢時往往需要的不止一張表的資料,需要將多張表的資料一起查詢出來,大家學習過資料庫的連線查詢,那麼在 MyBatis 中如何將有關係的多張表資料進行關聯查詢呢。
表的結構
商品和訂單是典型的一對多關係,下面的案例我們將以商品表和訂單表作為示例,演示如何配置最常見的一對多關係,下面是兩張表的結構:
商品表:
訂單表:
實體類的設計
一種商品有多個訂單,每個訂單對應一種商品,在實體類中體現這個關係。
訂單實體類:
/**
*
訂單類
*/
public class Order {
private Integer id;
private Integer num;
private Integer goodsId;
private String time;
/**
*
訂單對應的商品物件
*/
private Goods goods;
商品實體類:
/**
*
商品類
*/
public class Goods {
private Integer id;
private String name;
private Double price;
private String address;
/**
*
訂單集合
*/
private List<Order> orders;
Mapper 介面設計
這裡我們只介紹關聯查詢,所以只定義了基本的查詢方法
/**
*
商品介面
*/
public interface GoodsDAO{
//
根據編號查詢商品
Goods selectById(int id);
}
/**
*
訂單介面
*/
public interface OrderDAO{
//
根據訂單id
查詢訂單
Order selectById(int orderId);
//
根據商品id
查詢訂單
List<Order> selectByGoodsId(int goodsId);
}
collection 標籤
接下來就是重點了,我們在商品類中定義了訂單集合屬性orders ,那麼這個集合的資料如何進行查詢呢?這就需要我們在 mapper 檔案中使用 collection 標籤。
collection 標籤用在 resultMap 標籤中,用於配置集合的查詢,用法是:
<collection property=" 集合屬性名 " column=" 傳入查詢方法的列名 " select=" 查詢集合所呼叫的方法 "/>
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"
<!--mapper
是對映,namespace
是設定對應的DAO
介面-->
<mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">
<!--
配置資料庫返回結果對映-->
<resultMap id="goodsMap" type="com.qianfeng.mybatis01.entity.Goods">
<!--id
用於配置主鍵,property
是實體類的屬性名,column
是表中的欄位名-->
<id property="id" column="goods_id"></id>
<!--result
配置主鍵外其他列-->
<result property="name" column="goods_name"></result>
<result property="price" column="goods_price"></result>
<result property="address" column="goods_address"></result>
<!--
配置訂單集合-->
<collection property="orders" column="goods_id"
select="com.qianfeng.mybatis01.dao.OrderDAO.selectByGoodsId"/>
</resultMap>
<select id="selectById" parameterType="int" resultMap="goodsMap">
select * from tb_goods where goods_id = #{id}
</select>
</mapper>
collection 的意思是:
當商品物件需要orders 集合時,就會呼叫 OrderDAO 的 selectByGoodsId 按商品 id 查詢所有訂單,商品 id 就是當前商品的 goods_id 值。
association 標籤
association 標籤的用法類似於 collection ,用於配置一對一的關係,每個訂單中有一個商品物件 goods ,這個物件查詢可以用 association 來進行配置。
用法:
<association property=" 物件屬性名 " column=" 傳入查詢方法的列名 " select=" 查詢物件所呼叫的方法 "/>
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"
<!--mapper
是對映,namespace
是設定對應的DAO
介面-->
<mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO">
<!--
配置資料庫返回結果對映-->
<resultMap id="orderMap" type="com.qianfeng.mybatis01.entity.Order">
<!--id
用於配置主鍵,property
是實體類的屬性名,column
是表中的欄位名-->
<id property="id" column="order_id"></id>
<!--result
配置主鍵外其他列-->
<result property="num" column="order_num"></result>
<result property="goodsId" column="order_goods_id"></result>
<result property="time" column="order_time"></result>
<!--
配置商品物件對映-->
<association property="goods" column="order_goods_id"
select="com.qianfeng.mybatis01.dao.GoodsDAO.selectById"/>
</resultMap>
<select id="selectById" parameterType="int" resultMap="orderMap">
select * from tb_order where order_id = #{id}
</select>
<select id="selectByGoodsId" parameterType="int" resultMap="orderMap">
select * from tb_order where order_goods_id = #{goodsId}
</select>
</mapper>
association 的意思是:
當訂單物件需要goods 物件時,就呼叫 GoodsDAO 的 selectById 按商品 id 查詢商品,此商品 id 就是訂單中的外來鍵列 order_goods_id 。
單元測試
@Test
public void testGoodsAndOrders(){
GoodsDAO goodsDAO = MyBatisUtils.
getSession().getMapper(GoodsDAO.class);
//
查詢商品
Goods goods = goodsDAO.selectById(1);
System.
out.println("
查詢商品:"+goods);
//
獲得商品所有的訂單
goods.getOrders().stream().forEach((order)->System.
out.println("
商品的訂單"+order));
OrderDAO orderDAO = MyBatisUtils.
getSession().getMapper(OrderDAO.class);
//
查詢訂單
Order order = orderDAO.selectById(4);
System.
out.println("
查詢訂單"+order);
//
獲得訂單對應的商品
System.
out.println("
訂單的商品:" + order.getGoods());
}
執行結果:
查詢商品:Goods{id=1, name='小米9手機', price=2000.0, address='上海'}
商品的訂單Order{id=1, num=2, goodsId=1, time='2019-9-12'}
商品的訂單Order{id=4, num=4, goodsId=1, time='2019-9-14'}
查詢訂單Order{id=4, num=4, goodsId=1, time='2019-9-14'}
訂單的商品:Goods{id=1, name='小米9手機', price=2000.0, address='上海'}
總結
MyBatis 中配置表的關聯關係,需要在 resultMap 中配置 collection 或 association 標籤
collection 配置的是一對多關係, property 屬性是集合的名稱, select 配置的是查詢集合的方法, column 配置查詢方法的引數對應的列名
association 配置的是一對一關係, property 屬性是對應物件的名稱, select 配置的是查詢集合的方法, column 配置查詢方法的引數對應的列名
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2657923/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享MyBatis之執行緒最佳化程式設計師JavaMyBatis執行緒
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師雲端計算學習路線分享雲端計算之檔案查詢程式設計師
- 好程式設計師Java學習路線分享SpringMVC之請求和響應程式設計師JavaSpringMVC
- 好程式設計師大資料學習路線之hive表的查詢程式設計師大資料Hive
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享Java面試題之載入機制程式設計師Java面試題
- 好程式設計師Java學習路線分享Java中的位移運算程式設計師Java
- 好程式設計師雲端計算學習路線分享:關於NFS程式設計師NFS
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- 好程式設計師Java學習路線分享Dubbo架構介紹程式設計師Java架構
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java學習路線分享MySQL目錄結構程式設計師JavaMySql
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師大資料學習路線分享spark之Scala程式設計師大資料Spark
- 好程式設計師Java學習路線分享Java弱引用的理解與使用程式設計師Java
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- 好程式設計師Java學習路線分享怎麼理解Java物件導向程式設計師Java物件
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- 好程式設計師Java學習路線之MySQL的執行計劃程式設計師JavaMySql
- 好程式設計師Java學習路線分享如何處理中文引數程式設計師Java
- 好程式設計師Java學習路線分享JVM類載入機制程式設計師JavaJVM
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- 好程式設計師大資料學習路線分享Scala系列之物件程式設計師大資料物件
- 好程式設計師大資料學習路線分享MAPREDUCE程式設計師大資料
- 好程式設計師大資料學習路線分享SparkSQl程式設計師大資料SparkSQL