mybatis collection_MyBatis之关联查询
前言
我們進(jìn)行數(shù)據(jù)庫查詢時(shí)往往需要的不止一張表的數(shù)據(jù),需要將多張表的數(shù)據(jù)一起查詢出來,大家學(xué)習(xí)過數(shù)據(jù)庫的連接查詢,那么在MyBatis中如何將有關(guān)系的多張表數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢呢。
表的結(jié)構(gòu)
商品和訂單是典型的一對(duì)多關(guān)系,下面的案例我們將以商品表和訂單表作為示例,演示如何配置最常見的一對(duì)多關(guān)系,下面是兩張表的結(jié)構(gòu):
商品表:
訂單表:
實(shí)體類的設(shè)計(jì)
一種商品有多個(gè)訂單,每個(gè)訂單對(duì)應(yīng)一種商品,在實(shí)體類中體現(xiàn)這個(gè)關(guān)系。
訂單實(shí)體類:
/** * 訂單類 */public class Order { private Integer id; private Integer num; private Integer goodsId; private String time; /** * 訂單對(duì)應(yīng)的商品對(duì)象 */ private Goods goods;
商品實(shí)體類:
/** * 商品類 */public class Goods { private Integer id; private String name; private Double price; private String address; /** * 訂單集合 */ private List<Order> orders;
Mapper接口設(shè)計(jì)
這里我們只介紹關(guān)聯(lián)查詢,所以只定義了基本的查詢方法
/** * 商品接口 */public interface GoodsDAO{ //根據(jù)編號(hào)查詢商品 Goods selectById(int id);}
/** * 訂單接口 */public interface OrderDAO{ //根據(jù)訂單id查詢訂單 Order selectById(int orderId); //根據(jù)商品id查詢訂單 List<Order> selectByGoodsId(int goodsId);}
collection標(biāo)簽
接下來就是重點(diǎn)了,我們?cè)谏唐奉愔卸x了訂單集合屬性orders,那么這個(gè)集合的數(shù)據(jù)如何進(jìn)行查詢呢?這就需要我們?cè)趍apper文件中使用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è)置對(duì)應(yīng)的DAO接口--><mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">
<!--配置數(shù)據(jù)庫返回結(jié)果映射--> <resultMap id="goodsMap" type="com.qianfeng.mybatis01.entity.Goods"> <!--id用于配置主鍵,property是實(shí)體類的屬性名,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)商品對(duì)象需要orders集合時(shí),就會(huì)調(diào)用OrderDAO的selectByGoodsId按商品id查詢所有訂單,商品id就是當(dāng)前商品的goods_id值。
association標(biāo)簽
association標(biāo)簽的用法類似于collection,用于配置一對(duì)一的關(guān)系,每個(gè)訂單中有一個(gè)商品對(duì)象goods,這個(gè)對(duì)象查詢可以用association來進(jìn)行配置。
用法:
<association property="對(duì)象屬性名" column="傳入查詢方法的列名" select="查詢對(duì)象所調(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è)置對(duì)應(yīng)的DAO接口--><mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO"> <!--配置數(shù)據(jù)庫返回結(jié)果映射--> <resultMap id="orderMap" type="com.qianfeng.mybatis01.entity.Order"> <!--id用于配置主鍵,property是實(shí)體類的屬性名,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> <!--配置商品對(duì)象映射--> <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)訂單對(duì)象需要goods對(duì)象時(shí),就調(diào)用GoodsDAO的selectById按商品id查詢商品,此商品id就是訂單中的外鍵列order_goods_id。
單元測(cè)試
@Testpublic 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); //獲得訂單對(duì)應(yīng)的商品 System.out.println("訂單的商品:" + order.getGoods());}
運(yùn)行結(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中配置collection或association標(biāo)簽
collection配置的是一對(duì)多關(guān)系,property屬性是集合的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數(shù)對(duì)應(yīng)的列名
association配置的是一對(duì)一關(guān)系,property屬性是對(duì)應(yīng)對(duì)象的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數(shù)對(duì)應(yīng)的列名
總結(jié)
以上是生活随笔為你收集整理的mybatis collection_MyBatis之关联查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html选择器_css的9个常用选择器
- 下一篇: arrays中copyof复制两个数组_