好程序員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"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--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"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--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配置查詢方法的參數對應的列名