溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

好程序員Java學(xué)習(xí)路線分享MyBatis之關(guān)聯(lián)查詢

發(fā)布時間:2020-07-14 00:48:24 來源:網(wǎng)絡(luò) 閱讀:270 作者:wx5d42865f47214 欄目:編程語言

  好程序員Java學(xué)習(xí)路線分享MyBatis之關(guān)聯(lián)查詢,我們進(jìn)行數(shù)據(jù)庫查詢時往往需要的不止一張表的數(shù)據(jù),需要將多張表的數(shù)據(jù)一起查詢出來,大家學(xué)習(xí)過數(shù)據(jù)庫的連接查詢,那么在MyBatis中如何將有關(guān)系的多張表數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢呢。

表的結(jié)構(gòu)

商品和訂單是典型的一對多關(guān)系,下面的案例我們將以商品表和訂單表作為示例,演示如何配置最常見的一對多關(guān)系,下面是兩張表的結(jié)構(gòu):

商品表:

好程序員Java學(xué)習(xí)路線分享MyBatis之關(guān)聯(lián)查詢

訂單表:

好程序員Java學(xué)習(xí)路線分享MyBatis之關(guān)聯(lián)查詢

實體類的設(shè)計

一種商品有多個訂單,每個訂單對應(yīng)一種商品,在實體類中體現(xiàn)這個關(guān)系。

訂單實體類:

/**
?*?訂單類
?*/
public class Order {

????private Integer id;
????private Integer num;
????private Integer goodsId;
????private String time;
????/**
?????*?訂單對應(yīng)的商品對象
?????*/
????private Goods goods;

商品實體類:

/**
?*?商品類
?*/
public class Goods {

????private Integer id;
????private String name;
????private Double price;
????private String address;
????/**
?????*?訂單集合
?????*/
????private List<Order> orders;

?

Mapper接口設(shè)計

這里我們只介紹關(guān)聯(lián)查詢,所以只定義了基本的查詢方法

/**
?*?商品接口
?*/
public interface GoodsDAO{
????//根據(jù)編號查詢商品
????Goods selectById(int id);
}

?

/**
?*?訂單接口
?*/
public interface OrderDAO{
????//根據(jù)訂單id查詢訂單
????Order selectById(int orderId);
????//根據(jù)商品id查詢訂單
????List<Order> selectByGoodsId(int goodsId);
}

?

collection標(biāo)簽

接下來就是重點了,我們在商品類中定義了訂單集合屬性orders,那么這個集合的數(shù)據(jù)如何進(jìn)行查詢呢?這就需要我們在mapper文件中使用collection標(biāo)簽。

collection標(biāo)簽用在resultMap標(biāo)簽中,用于配置集合的查詢,用法是:

<collection property="集合屬性名" column="傳入查詢方法的列名" select="查詢集合所調(diào)用的方法"/>

示例:

<?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是設(shè)置對應(yīng)的DAO接口-->
<mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">

<!--配置數(shù)據(jù)庫返回結(jié)果映射-->
????<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的意思是:

當(dāng)商品對象需要orders集合時,就會調(diào)用OrderDAOselectByGoodsId按商品id查詢所有訂單,商品id就是當(dāng)前商品的goods_id值。

association標(biāo)簽

association標(biāo)簽的用法類似于collection,用于配置一對一的關(guān)系,每個訂單中有一個商品對象goods,這個對象查詢可以用association來進(jìn)行配置。

用法:

<association property="對象屬性名" column="傳入查詢方法的列名" select="查詢對象所調(diào)用的方法"/>

示例:

<?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是設(shè)置對應(yīng)的DAO接口-->
<mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO">
????<!--配置數(shù)據(jù)庫返回結(jié)果映射-->
????<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的意思是:

當(dāng)訂單對象需要goods對象時,就調(diào)用GoodsDAOselectById按商品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);
????//獲得訂單對應(yīng)的商品
????System.out.println("訂單的商品:" + order.getGoods());
}

運行結(jié)果:

查詢商品:Goods{id=1, name='小米9手機(jī)', 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手機(jī)', price=2000.0, address='上海'}

?

總結(jié)

MyBatis中配置表的關(guān)聯(lián)關(guān)系,需要在resultMap中配置collectionassociation標(biāo)簽

collection配置的是一對多關(guān)系,property屬性是集合的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數(shù)對應(yīng)的列名

association配置的是一對一關(guān)系,property屬性是對應(yīng)對象的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數(shù)對應(yīng)的列名

?

?


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI