Mybatis一对多关联关系映射实现过程解析
作者:jason小蜗牛 发布时间:2021-07-13 06:22:59
标签:Mybatis,一对多,关系,映射
这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可。在实体类中就是反过来,在少的一方添加多的一方,声明一个List<另一方> 属性名 作为少的一方的属性。
用户和订单就是一对多的关系,从用户角度看就是一对多关系,从订单的角度来看就是多对一的关系。
/**
* 订单持久化类
*/
public class Orders {
private Integer id;
private String number;
setter/getter方法
}
/**
*用户持久化类
*/
public class User {
private Integer id;
private String username;
private String address;
private List<Orders> ordersList;//用户关联的订单
setter/getter方法
}
用户mapper接口
/**
* 用户Mapper接口
*/
public interface UserMapper {
//用户和订单为一对多关系,那么此时应该返回一个用户list里面包含了订单信息
List<User> userOrdersinfo(int id);//通过用户id返回它的订单信息
}
用户的mapper映射文件
<?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="cn.jason.bootmybatis.mapper.UserMapper">
<resultMap id="UserWithOrdersInfo" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<!--一对多关系映射
ofType表示属性集合中的元素的类型,List<Orders>属性即Orders类
-->
<collection property="ordersList" ofType="Orders">
<id property="id" column="orders_id"/>
<result property="number" column="number"/>
</collection>
</resultMap>
<!--关联查询sql-->
<select id="userOrdersinfo" parameterType="Integer" resultMap="UserWithOrdersInfo">
select u.*,o.id as orders_id,o.number
from tb_user u,tb_orders o
where u.id=o.user_id and u.id=#{id}
</select>
</mapper>
用户业务层接口
/**
* 用户业务层接口
*/
public interface UserWithOrdersInfo {
List<User> selectUserOrdersInfo(int id);
}
用户业务层实现类
@Service
public class UserWithOrdersInfoImpl implements UserWithOrdersInfo {
@Autowired
private UserMapper userMapper;
@Override
public List<User> selectUserOrdersInfo(int id) {
return userMapper.userOrdersinfo(id);
}
}
控制器类
@Controller
public class UserOrdersController {
@Autowired
private UserWithOrdersInfo userWithOrdersInfo;
@RequestMapping("/userordersinfo/{id}")
public String getUserOrdersInfo(@PathVariable int id, Model model){
model.addAttribute("userordersinfo",userWithOrdersInfo.selectUserOrdersInfo(id));
return "userordersinfo";
}
}
页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>person信息页面</title>
</head>
<body>
<table>
<thead>
<tr>
<th>用户id</th>
<th>姓名</th>
<th>用户地址</th>
<th>订单id</th>
<th>订单号</th>
</tr>
</thead>
<tr th:each="userordersinfo:${userordersinfo}">
<td th:text="${userordersinfo.id}">用户id</td>
<td th:text="${userordersinfo.username}">用户姓名</td>
<td th:text="${userordersinfo.address}">用户地址</td>
<td th:text="${userordersinfo.ordersList.get(0).id}">订单id</td>
<td th:text="${userordersinfo.ordersList.get(0).number}">订单号</td>
<td th:text="${userordersinfo.ordersList.get(1).id}">订单id</td>
<td th:text="${userordersinfo.ordersList.get(1).number}">订单号</td>
</tr>
</table>
</body>
</html>
运行结果
一对多关联关系总结:
一对多关系从不同的角度看,关系是不一样的,但是最终都是一样的,在编写mapper映射文件的时候使用的是<collection>元素。也是使用嵌套查询更加方便,需要解决的问题是如何在页面展示查询出来的一对多关联关系的结果。
来源:https://www.cnblogs.com/jasonboren/p/11394815.html


猜你喜欢
- Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作。 用法简单,不过我觉
- 今天的几个目标: 1. 自定义ActionProvider 2. Toolbar ActionBar自定义Menu 3. Toolbar A
- 目录@Configuration + @Bean@Componet + @ComponentScan@Import注解导入@Import直接
- 前言本文主要给大家介绍了关于java poi导入Excel通用工具类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍
- 页边距是指页面的边线到文字的距离。通常可在页边距内部的可打印区域中插入文字和图形,也可以将某些项目放置在页边距区域中(如页眉、页脚和页码等)
- 针对XML文件的操作是C#程序设计中非常常见的功能。本文即以实例展示了C#操作XML文件的几个常见的示例。具体如下:1.返回节点下标publ
- java中next与nextLine用法区别:next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或E
- Java面向对象编程之多态一.对于多态的理解:通俗点理解,多态其实就是一词多义,就是一种方法的多种状态,即不同的类对象,调用同一个方法名,有
- 本文实例为大家分享了Java手写线程池的实现代码,供大家参考,具体内容如下1.线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在
- 一、特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对
- 最近项目上的一个上传文件功能,项目是MVC+EF+LigerUI 来做的,贴出来大家一起分享下1、页面需要引用这个JS 和 CSS<s
- 1.前言string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢?原因就是
- 前言最近在给熔断器组件增加一个降级策略(Hystrix好像没有这个配置),我们提供了如下几种策略:1、默认策略2、返回常量值3、抛出指定异常
- 本文实例讲述了C#通过属性名字符串获取、设置对象属性值操作.分享给大家供大家参考,具体如下:#通过反射获取对象属性值并设置属性值0、定义一个
- 输入方法第一种输入方法:scannerimport java.util.Scanner; // 导入java.util.Scannerpub
- 引言在实际应用场景中,我们封装一个学生的类,这个类用于封装学生的日常行为,如:上学、吃饭、上课等。然而,在疫情期间,学生上学时入校、吃饭时进
- 私有构造函数私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他
- 1|1简介最近基于最新的Activiti7配置了SpringBoot2。简单上手使用了一番。发现市面上解决Activiti7的教程很少,采坑
- 前言我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如一个用户可以有多辆车,而一辆车只能有一个用户等等,今天我们就来一起学习下
- 写在前面项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,