目的:

  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);
}
}
}

效果:

一本书对应多个类别

一个类别对应多本书

 

谢谢观看!

Mybatis之关联关系(一对多、多对多)的更多相关文章

  1. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  2. mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置

    n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...

  3. mybatis之关联关系

    前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...

  4. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  5. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  6. SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

    SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...

  7. Mybatis表关联一对多、多对一、多对多

    项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...

  8. Mybatis一对一、一对多、多对多查询。+MYSQL

    场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...

  9. mybatis报错:查询一对多或多对多时只返回一条数据的问题

    问题: 使用映射文件实现查询一对多或多对多时只返回一条数据问题 解决方法: 导致这种情况出现的问题是因为两个表中的主键是一样所以出现了数据覆盖问题. 解决方式一:修改数据库表中的主键(这种方法比较麻烦 ...

  10. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

随机推荐

  1. js实现replaceAll方法

    js本来有replace方法,请看w3school的说明: replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法: stringObject.rep ...

  2. shared_ptr 引用计数

    https://zh.cppreference.com/w/cpp/memory/shared_ptr 引用计数

  3. 算法的时间复杂度O

    一.时间复杂度 在进行算法分析时,语句总的执行次数 T(n) 是关于问题的规模n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级,算法的时间复杂度,也就是算法的时间度量,记作 ...

  4. 将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql、改为会话级别临时表 【我】

    将一个多表关联的条件查询中的多表通过 create   select  转化成一张单表的sql 将结果改为创建一个会话级别的临时表: -- 根据下面这两个sql CREATE TABLE revenu ...

  5. 记一次haproxy反向代理配置

    首先借用一下前辈的话,解释下反向代理是什么? 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  6. ES6深入浅出-9 Promise-1.回调与回调地狱

    promise 回调 把fun的调用写在另外一个函数里 fun()的调用在fn2这个函数里面.也是调用了函数.这种函数的调用形式叫做回调. A打电话给C找B.但是B不在,C说等B在的时候让B给A回电话 ...

  7. redis八大应用场景

    1.缓存 缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力.Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓 ...

  8. new (std::nothrow) 与 new

    普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,n ...

  9. LODOP设置打印份数及是否逐份输出

    LODOP中通过SET_PRINT_COPIES可以设置打印份数,例如:LODOP.SET_PRINT_COPIES(2);//指定份数为2份 如果一个任务里有多页,打印份数的时候,有两种输出方式,一 ...

  10. 【ARM-LInux开发】利用scp 远程上传下载文件/文件夹

    利用scp 远程上传下载文件/文件夹 scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...