与hibernate一样,Mybatis也是分为一对多和多对多,下面按这两个来讲:
一对多
先用逆向生成工具生成两张表,我这里用的是t_hibernate_order、t_hibernate_order_item,也就是订单表和订单项表,他们的关系是一个order可以有多个orderitem。
需要注意的是你生成之前需要查看你的生成命令是否是在你这个项目中的:
为了防止破坏原有的类中的封装性和达到解耦的效果,我使用Vo来实现。
orderVo:
package com.zlk.model.vo;
import com.zlk.model.Order;
import com.zlk.model.OrderItem;
import java.util.ArrayList;
import java.util.List;
/**
* @author 大宝
* @company 太厉害公司
* @create 2019-09-26 11:40
*/
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.zlk.model.vo;
import com.zlk.model.Order;
import com.zlk.model.OrderItem;
/**
* @author 大宝
* @company 太厉害公司
* @create 2019-09-26 11:43
*/
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
然后在双方的接口中写一个查询方法,并且Mapper.xml中配置resultMap和Sql语句。
orderMapper.java:
OrderVo selectByOid(@Param("oid") Integer oid);
orderMapper.xml :
property指的是类属性,column指的是表字段,javaType表示关联属性类型。
<resultMap id="OrderVoMap" type="com.zlk.model.vo.OrderVo" >
<result property="orderId" column="order_id"></result>
<result property="orderNo" column="order_no"></result>
<collection property="orderItems" ofType="com.zlk.model.OrderItem">
<result property="orderItemId" column="orderItem_id"></result>
<result property="productId" column="product_id"></result>
<result property="quantity" column="quantity"></result>
<result property="oid" column="oid"></result>
</collection>
</resultMap>
<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:
OrderItemVo selectByOrderItemId(@Param("orderItemId") Integer orderItemId);
orderItemMapper.xml:
<resultMap id="OrderItemVoMap" type="com.zlk.model.vo.OrderItemVo" >
<result property="orderItemId" column="orderItem_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.zlk.model.Order">
<result property="orderId" column="order_id"></result>
<result property="orderNo" column="order_no"></result>
</association>
</resultMap>
<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>
配置好后即可测试一下:
@Test
public void selectByOid() {
OrderVo orderVo = oneToManyServiceServIce.selectByOid(1);
System.out.println(orderVo);
for (OrderItem item : orderVo.getOrderItems()) {
System.out.println(item);
}
}
@Test
public void selectByOrderItemId() {
OrderItemVo o = oneToManyServiceServIce.selectByOrderItemId(1);
System.out.println(o);
System.out.println(o.getOrder());
}
效果:
selectByOid():
selectByOrderItemId():
完成。
多对多
其实与上方的一对多已经涉及到了,下面我再复述一遍:
首先是通过Mybatis生成文件,(我使用的是书本,书本类别,书本类别对照表)
然后在书本类别对照表中进行操作,因为防止表污染,所以使用书本类别对照表来进行操作,因为这个表中的列段什么的基本不会更改,所以避免后期可能改表的情况。
HBookCategoryMapper.xml:
<resultMap id="HBookVoMap" type="com.zlk.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="categoryList" ofType="com.zlk.model.Category">
<result property="categoryId" column="category_id"></result>
<result property="categoryName" column="category_name"></result>
</collection>
</resultMap>
<resultMap id="CategoryVoMap" type="com.zlk.model.vo.CategoryVo" >
<result property="categoryId" column="category_id"></result>
<result property="categoryName" column="category_name"></result>
<collection property="HBookList" ofType="com.zlk.model.HBook">
<result property="bookId" column="book_id"></result>
<result property="bookName" column="book_name"></result>
<result property="price" column="price"></result>
</collection>
</resultMap>
接口方法:
HBookVo queryBiBid(@Param("bid") Integer bid);
CategoryVo queryBiCid(@Param("cid") Integer cid);
sql:
<select id="queryBiBid" resultMap="HBookVoMap" parameterType="java.lang.Integer">
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="queryBiCid" resultMap="CategoryVoMap" parameterType="java.lang.Integer">
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>
测试:
ManyToManyService接口:
public interface ManyToManyService {
HBookVo queryBiBid(Integer bid);
CategoryVo queryBiCid(Integer cid);
}
实现接口:
@Service
public class ManyToManyServiceImpl implements ManyToManyService {
@Autowired
private HBookCategoryMapper hBookCategoryMapper;
@Override
public HBookVo queryBiBid(Integer bid) {
return hBookCategoryMapper.queryBiBid(bid);
}
@Override
public CategoryVo queryBiCid(Integer cid) {
return hBookCategoryMapper.queryBiCid(cid);
}
}
测试Test:
public class ManyToManyServiceImplTest extends SpringBaseTest {
@Autowired
private ManyToManyService manyToManyService;
@Test
public void queryBiBid() {
HBookVo hBooks = manyToManyService.queryBiBid(1);
System.out.println(hBooks);
List<Category> list = hBooks.getCategoryList();
for (Category c : list) {
System.out.println(c);
}
}
@Test
public void queryBiCid() {
CategoryVo categorys = manyToManyService.queryBiCid(1);
System.out.println(categorys);
List<HBook> hBookList = categorys.getHBookList();
for (HBook hBook : hBookList) {
System.out.println(hBook);
}
}
}
结果:
queryBiBid:
queryBiCid:
完成!!!