目的:
Mybatis關系映射之一對多
Mybatis關系映射之多對多
Mybatis關系映射之一對多
其是映射關系的基層思維是一樣的,只是用法不一樣,今天所記錄的mybatis關系映射比Hibernate要簡單
之前我記錄一篇hibernate映射關系,可以移步(https://www.cnblogs.com/huangting/p/11203498.html)
今天就用訂單表和訂單項表來演示mybatis一對多和多對一的映射關系
訂單表 t_hibernate_order
訂單項表t_hibernate_order_item
-
用mybatis-generator插件生成兩張表對應的model與mapper
創建OrderVo類繼承原有的實體類
package com.ht.model; import java.util.ArrayList; import java.util.List; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 19:45 */ public class OrderVo extends Order { private List<OrderItem> orderItems = new ArrayList<>(); public List<OrderItem> getOrderItems() { return orderItems; } public void setOrderItems(List<OrderItem> orderItems) { this.orderItems = orderItems; } }
OrderItemVo
package com.ht.model; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 19:51 */ public class OrderItemVo extends OrderItem { private Order order; public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
在OrderMapper中設置一個方法來查詢兩張表(一對多)
package com.ht.mapper; import com.ht.model.Order; import com.ht.model.OrderVo; import org.apache.ibatis.annotations.Param; public interface OrderMapper { int deleteByPrimaryKey(Integer orderId); int insert(Order record); int insertSelective(Order record); Order selectByPrimaryKey(Integer orderId); int updateByPrimaryKeySelective(Order record); int updateByPrimaryKey(Order record); //一對多 OrderVo selectByOid(@Param("oid") Integer oid); }
在OrderMapper.xml中配置(一對多)
<!-- 一對多的關系 --> <!-- property: 指的是集合屬性的值, ofType:指的是集合中元素的類型 --> <resultMap id="OrderVoMap" type="com.ht.model.OrderVo" > <result property="orderId" column="order_id"></result> <result property="orderNo" column="order_no"></result> <collection property="orderItems" ofType="com.ht.model.OrderItem"> <result property="orderItemId" column="order_item_id"></result> <result property="productId" column="product_id"></result> <result property="quantity" column="quantity"></result> <result property="oid" column="oid"></result> </collection> </resultMap> <!--sql語句--> <select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer"> select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id = oi.oid and o.order_id = #{oid} </select>
OrderItemMapper.java(多對一)
package com.ht.mapper; import com.ht.model.OrderItem; import com.ht.model.OrderItemVo; import org.apache.ibatis.annotations.Param; public interface OrderItemMapper { int deleteByPrimaryKey(Integer orderItemId); int insert(OrderItem record); int insertSelective(OrderItem record); OrderItem selectByPrimaryKey(Integer orderItemId); int updateByPrimaryKeySelective(OrderItem record); int updateByPrimaryKey(OrderItem record); //多對一 OrderItemVo selectByOrderItemId(@Param("orderItemId") Integer orderItemId); }
在OrderItemMapper.xml中配置(多對一)
<!-- 多對一--> <resultMap id="OrderItemVoMap" type="com.ht.model.OrderItemVo" > <result property="orderItemId" column="order_item_id"></result> <result property="productId" column="product_id"></result> <result property="quantity" column="quantity"></result> <result property="oid" column="oid"></result> <association property="order" javaType="com.ht.model.Order"> <result property="orderId" column="order_id"></result> <result property="orderNo" column="order_no"></result> </association> </resultMap> <!-- sql語句--> <select id="selectByOrderItemId" resultMap="OrderItemVoMap" parameterType="java.lang.Integer"> select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id = oi.oid and oi.order_item_id = #{orderItemId} </select>
service層
One2ManyService接口類
package com.ht.service; import com.ht.model.OrderItemVo; import com.ht.model.OrderVo; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:16 */ public interface One2ManyService { OrderVo selectByOid(Integer oid); OrderItemVo selectByOrderItemId(Integer orderItemId); }
One2ManyServiceImpl實現service接口
package com.ht.service.ipml; import com.ht.mapper.OrderItemMapper; import com.ht.mapper.OrderMapper; import com.ht.model.OrderItemVo; import com.ht.model.OrderVo; import com.ht.service.One2ManyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:16 */ @Service public class One2ManyServiceImpl implements One2ManyService { @Autowired private OrderMapper orderMapper; @Autowired private OrderItemMapper orderItemMapper; @Override public OrderVo selectByOid(Integer oid) { return orderMapper.selectByOid(oid); } @Override public OrderItemVo selectByOrderItemId(Integer orderItemId) { return orderItemMapper.selectByOrderItemId(orderItemId); } }
測試 :
One2ManyServiceImplTest
package com.ht.service.ipml; import com.ht.Test.SpringBaseTest; import com.ht.model.OrderItem; import com.ht.model.OrderItemVo; import com.ht.model.OrderVo; import com.ht.service.One2ManyService; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:29 */ public class One2ManyServiceImplTest extends SpringBaseTest { @Autowired private One2ManyService one2ManyService; @Test public void selectByOid() { OrderVo orderVo = one2ManyService.selectByOid(3); System.out.println(orderVo); for (OrderItem orderItem : orderVo.getOrderItems()) { System.out.println(orderItem); } } @Test public void selectByOrderItemId() { OrderItemVo orderItemVo = one2ManyService.selectByOrderItemId(3); System.out.println(orderItemVo); System.out.println(orderItemVo.getOrder()); } }
效果:
一對多:
多對一:
Mybatis關系映射之多對多
眾所周知,普通的書本分類,一個類型有多本書,一本書的類型也可以有多種,那么今天就用書本類型之間來測試多對多
書籍表t_hibernate_book

書籍類別表 t_hibernate_category

中間表 t_hibernate_book_category
-
用mybatis-generator插件生成對應的model與mapper
HbookVo
之前一直沒注意,還是單獨分一個vo文件夾去放vo實體類比較好
package com.ht.model.vo; import com.ht.model.Category; import com.ht.model.Hbook; import java.util.ArrayList; import java.util.List; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:53 */ public class HbookVo extends Hbook { private List<Category> category =new ArrayList<>(); public List<Category> getCategory() { return category; } public void setCategory(List<Category> category) { this.category = category; } }
CategoryVo
package com.ht.model.vo; import com.ht.model.Category; import com.ht.model.Hbook; import java.util.ArrayList; import java.util.List; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:54 */ public class CategoryVo extends Category { private List<Hbook> hbooks =new ArrayList<>(); public List<Hbook> getHbooks() { return hbooks; } public void setHbooks(List<Hbook> hbooks) { this.hbooks = hbooks; } }
HbookCategoryMapper
在接口類中設置方法,以便后面測試
package com.ht.mapper; import com.ht.model.HbookCategory; import com.ht.model.vo.CategoryVo; import com.ht.model.vo.HbookVo; import org.apache.ibatis.annotations.Param; public interface HbookCategoryMapper { int deleteByPrimaryKey(Integer bcid); int insert(HbookCategory record); int insertSelective(HbookCategory record); HbookCategory selectByPrimaryKey(Integer bcid); int updateByPrimaryKeySelective(HbookCategory record); int updateByPrimaryKey(HbookCategory record); HbookVo queryByBid(@Param("bid") Integer bid); CategoryVo queryByCid(@Param("cid") Integer cid); }
HbookCategoryMapper.xml
<!-- 配置關系 --> <resultMap id="HbookVoMap" type="com.ht.model.vo.HbookVo" > <result property="bookId" column="book_id"></result> <result property="bookName" column="book_name"></result> <result property="price" column="price"></result> <collection property="category" ofType="com.ht.model.Category"> <result property="categoryId" column="category_id"></result> <result property="categoryName" column="category_name"></result> </collection> </resultMap> <resultMap id="CategoryVoMap" type="com.ht.model.vo.CategoryVo" > <result property="categoryId" column="category_id"></result> <result property="categoryName" column="category_name"></result> <collection property="hbooks" ofType="com.ht.model.Hbook"> <result property="bookId" column="book_id"></result> <result property="bookName" column="book_name"></result> <result property="price" column="price"></result> </collection> </resultMap> <!-- sql語句--> <select id="queryByBid" resultType="com.ht.model.vo.HbookVo"> select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id and b.book_id = #{bid} </select> <select id="queryByCid" resultType="com.ht.model.vo.CategoryVo"> select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id and c.category_id=#{cid} </select>
Service層
HbookCategoryService
package com.ht.service; import com.ht.model.vo.CategoryVo; import com.ht.model.vo.HbookVo; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:58 */ public interface HbookCategoryService { HbookVo queryByBid(Integer bid); CategoryVo queryByCid(Integer cid); }
HbookCategoryServiceImpl
去實現接口中的方法
package com.ht.service.ipml; import com.ht.mapper.HbookCategoryMapper; import com.ht.model.vo.CategoryVo; import com.ht.model.vo.HbookVo; import com.ht.service.HbookCategoryService; import org.springframework.beans.factory.annotation.Autowired; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 22:59 */ public class HbookCategoryServiceImpl implements HbookCategoryService { @Autowired private HbookCategoryMapper hbookCategoryMapper; @Override public HbookVo queryByBid(Integer bid) { return hbookCategoryMapper.queryByBid(bid); } @Override public CategoryVo queryByCid(Integer cid) { return hbookCategoryMapper.queryByCid(cid); } }
測試:
HbookCategoryServiceImplTest
package com.ht.service.ipml; import com.ht.Test.SpringBaseTest; import com.ht.model.Category; import com.ht.model.Hbook; import com.ht.model.vo.CategoryVo; import com.ht.model.vo.HbookVo; import com.ht.service.HbookCategoryService; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; /** * @author 黃大娘 * @company dogson有限公司 * @create 2019-09-27 23:00 */ public class HbookCategoryServiceImplTest extends SpringBaseTest { @Autowired private HbookCategoryService hbookCategoryService; @Test public void queryByBid() { HbookVo hbookVo = hbookCategoryService.queryByBid(1); System.out.println(hbookVo); for (Category category : hbookVo.getCategory()) { System.out.println(category); } } @Test public void queryByCid() { CategoryVo categoryVo = hbookCategoryService.queryByCid(1); System.out.println(categoryVo); for (Hbook hbook : categoryVo.getHbooks()) { System.out.println(hbook); } } }
效果:
一本書對應多個類別
一個類別對應多本書
謝謝觀看!