目的:

  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. python matplotlib生成图形

    y=2x+3 import matplotlib.pyplot as plt#约定俗成的写法plt #首先定义两个函数(正弦&余弦) import numpy as np #plt.figur ...

  2. TP5 查询 字符串条件如何实现

      TP5 查询 字符串条件如何实现 当查询条件是 (1,3,8) ,3,4) 这种情况改如何查询呢?   主要用到FIND_IN_SET $where[ ]=>['exp',Db::raw(& ...

  3. mkimage工具的用法

    1. mkimage都支持哪些压缩格式 none, gzip, bzip2等 2. 参考资料 这里

  4. 安装好oracle后如何使用PLSQL连接【我】

    简单的说: 一.如果你本地安装的是32位的Oracle,可以直接在PLSQl中配置oracle安装路径下的相关目录文件,直接启动PLSQL 二.如果你本地安装的是64位的Oracle或者oracle服 ...

  5. Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造

    网关上认证去做哪些改造 在网关上用jwt去解析用户信息,而不再发送校验令牌的请求了. 之前的时候网关上实际上写了很多的代码 包括认证,发check_token去把token请求,换成用户信息. 这俩是 ...

  6. Spring cloud微服务安全实战-3-4 API安全机制之认证(1)

    本节开始讲认证相关的东西.注意事项,出现问题的对应的解决方案. 先写用户注册的服务,注册一些用户信息进去.注册也是我们安全体系的一部分 注册 UserController里面的create方法 先修改 ...

  7. VMware 快速克隆出多个 Linux centos7 环境

    这样一台系统就已经克隆好了,但是,现在还没有完,因为是克隆的,里面的ip地址和创建的主机名都是一样,需要进行修改 登录服务器,然后使用 [ifcfg-ens33需根据实际情况而定] vi /etc/s ...

  8. Pythonrandom模块(获取随机数)常用方法和使用例子

    Python random模块(获取随机数)常用方法和使用例子 这篇文章主要介绍了Python random模块(获取随机数)常用方法和使用例子,需要的朋友可以参考下 random.random ra ...

  9. numpy包中,与线性代数相关的模块——linalg(利那隔)

    https://github.com/scalanlp/breeze/wiki/Linear-Algebra-Cheat-Sheethttps://docs.scipy.org/doc/numpy-1 ...

  10. 如何修改WAMPServer默认的网站路径地址

    通常,我们安装WAMPServer集成的PHP开发环境之后,默认的网站路径地址是其安装目录下子文件夹:"wamp/www/".那么我们怎么修改网站地址到自己指定的路径呢?本篇经验将 ...