jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询。但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加了多表关联的实现步骤。
Mybatis 插件自动生成的mapper 实现了大部分基本、通用的方法,如:insert、update、delete、select 等大概20个左右方法,都是比较基础的增删改查,这些通用Mapper提供的方法基本都能满足各种单表操作需求。
但是,在实际工作中通用Mapper并不能满足所有的工作,或是某个业务需要手写 sql 语句、或是多表关联时,该怎么办呢? 这就需要额外的一些自定义的mapper 实现一些特定的功能。下面就来介绍自定义mapper 的实现。
一、自定义mapper
首先需要创建一个项目并整合mybatis等相关框架,这个之前介绍过这里不再细说。直接在原来的基础上实现。《Spring Boot如何使用Mybatis XML 配置版》
1、创建自定义 mapper
在com.weiz.mapper 包中,创建 SysUserMapperCustom 接口
package com.weiz.mapper;import com.weiz.pojo.SysUser;import java.util.List;public interface SysUserMapperCustom { List queryUserSimplyInfoById(String userId);}
SysUserMapperCustom 是一个接口,这里只定义了一个方法:queryUserSimplyInfoById 。
2、创建自定义mapper 配置文件
在resourcemapper 目录下,创建一个自定义的SysUserMapperCustom.xml
<?xml version="1.0" encoding="UTF-8" ?> select * from sys_user where id = #{id,jdbcType=VARCHAR}
说明:
id:对应的就是 接口名,
resultType:返回的是结果类型,
parameterType:参数的类型,
# : 是传递相关参数。
3、Service 调用
首先在UserService接口中增加queryUserByIdCustom方法,然后在对应的 UserServiceImpl 实现类中,注入SysUserMapperCustom 。最后实现queryUserByIdCustom 方法,在方法中调用前面自定义的mapper 类中方法即可。具体代码如下:
// 1. 在UserServiceImpl 中注入SysUserMapperCustom @Autowiredprivate SysUserMapperCustom userMapperCustom;// 2. 实现接口方法,调用@Overridepublic SysUser queryUserByIdCustom(String userId) { List userList = userMapperCustom.queryUserSimplyInfoById(userId); if (userList != null && !userList.isEmpty()) { return (SysUser)userList.get(0); } return null;}
以上三步,就能轻松实现 自定义的mapper 实现自定义的方法。
二、多表关联
上面,通过自定义的mapper 实现了自定义方法。下面说一说多表关联如何实现。
这里用用户(Sys_User)和公司(Sys_Company)的关联为例。
1、数据库表
数据库中原先已经有Sys_User 表,增加Sys_Company 表。
CREATE TABLE `sys_company` ( `id` varchar(64) NOT NULL DEFAULT '', `name` varchar(256) DEFAULT NULL, `code` varchar(64) DEFAULT NULL, `tax_id` varchar(64) DEFAULT NULL, `address` varchar(1024) DEFAULT NULL, `tel` varchar(256) DEFAULT NULL, `email` varchar(256) DEFAULT NULL, `register_time` date DEFAULT NULL, `is_delete` bit(1) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Sys_User 表 通过company_id 和Sys_Company 表关联。
相关测试数据大家自行创建。
2、修改 pojo 类
首先、数据库中创建完Sys_Company 表后,可以用我们之前的mybatis插件,自动生成Company对应的mapper 、pojo 类 和 xml 配置文件。这里不再细说,大家可以看我之前的文章:《Spring Boot如何使用Mybatis XML 配置版「附详细步骤」》。
然后、自动生成的SysUser 类,没有对应的 Company 对象。需要手动加上。
package com.weiz.pojo;import java.util.Date;import javax.persistence.*;@Table(name = "sys_user")public class SysUser { @Id private String id; @Column(name = "company_id") private String companyId; // 省略之前的 字段 private SysCompany company; // 省略之前的 字段对应的getter setter public SysCompany getCompany() { return company; } public void setCompany(SysCompany company) { this.company = company; }}
3、自定义mapper 增加多表查询方法。
首先、在自定义的mapper:SysUserMapperCustom 中增加 queryAllUserListCustom方法
package com.weiz.mapper;import com.weiz.pojo.SysUser;import java.util.List;public interface SysUserMapperCustom { List queryUserSimplyInfoById(String userId); List queryAllUserListCustom();}
然后、在resourcemapperSysUserMapperCustom.xml 配置文件中增加 queryAllUserListCustom 方法配。
SELECT u.id,u.username,c.id companyid, c.name companyname FROM sys_user u LEFT JOIN sys_company c on u.company_id=c.id
说明:
1、association:用于配置1对1的映射
属性property:company对象在user对象中的属性名
属性javaType:company属性的java对象 类型
属性column:user表中的外键引用company表。
2、collection:用于配置1对多关系映射
property:在user里面的List的属性名
ofType:当前account表的java类型
column:外键
4、Service 调用
Service中调用新增加的方法和上面的一样,首先在UserService接口中增加queryUserByIdCustom方法,然后在对应的 UserServiceImpl 实现类中,注入SysUserMapperCustom 。最后实现queryUserByIdCustom 方法,在方法中调用前面自定义的mapper 类中方法即可。具体代码如下:
// 1. 在UserServiceImpl 中注入SysUserMapperCustom @Autowiredprivate SysUserMapperCustom userMapperCustom;// 2. 实现接口方法,调用@Overridepublic SysUser queryAllUserListCustom() { List userList = userMapperCustom.queryAllUserListCustom(); return userList;}
以上四步,实现了自定义的mapper 中 多表关联的复杂查询的方法。配置比较复杂。大家按照说明,一步一步,仔细配置。应该没有问题。
三、测试
首先在原先的MybatisController 创建对应的测试方法。
@RequestMapping("/queryUserByIdCustom")public JSONResult queryUserByIdCustom(String userId) { return JSONResult.ok(userService.queryUserByIdCustom(userId));}@RequestMapping("/queryAllUserListCustom")public JSONResult queryAllUserListCustom() { return JSONResult.ok(userService.queryAllUserListCustom());}
启动项目,并在浏览器中输入地址:
http://localhost:8080/mybatis/queryUserByIdCustom?userId=200425AYXA733M5P
最后
以上,就把Spring Boot 中mybatis 如何通过自定义mapper 实现多表关联查询介绍完了,实现起来比较简单。上面的例子比较简单,没有做多表关联,大家自己写的时候,可以试试复杂的多表关联。
这个系列课程的完整源码,也会提供给大家。大家私信我(章为忠学架构),回复:springboot源码 。获取这个系列课程的完整源码。
推荐阅读:
Spring Boot如何整合Quartz 实现定时任务
Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务
Spring Boot入门系列(十五)Spring Boot 开发环境热部署的配置
Spring Boot 使用JdbcTemplate操作数据库,配置多数据源
Maven快速入门(二)手动创建maven项目hellomaven
Maven快速入门(一)Maven介绍及环境搭建
史上最强《Java 开发手册》泰山版,阿里出品,必属精品
Spring Boot入门系列(十三)如何实现事务,极简版!
jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询相关推荐
- 干货必看|Spring Boot整合MyBatis框架详解
在开发中,我们通常会对数据库的数据进行操作,Sprirng Boot对关系型数据库和非关系型数据库的访问操作都提供了非常好的整合支持.所以今天壹哥就给大家讲解一下,如何在SpringBoot环境中整合 ...
- 2021-5-10:Spring Boot整合MyBatis
Spring Boot整合MyBatis Spring Boot 整合MyBatis (一)基础环境搭建 1.数据准备 创建数据库.数据表并插入一定的数据 (1)创建博客数据库blog 在Navica ...
- Spring Boot 教程(三): Spring Boot 整合Mybatis
教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...
- Spring Boot整合MyBatis
最近项目原因可能会继续开始使用MyBatis,已经习惯于spring-data的风格,再回头看xml的映射配置总觉得不是特别舒服,接口定义与映射离散在不同文件中,使得阅读起来并不是特别方便. Spri ...
- Spring Boot 整合MyBatis(23)
Spring Boot 整合MyBatis Spring Boot 整合 Druid 引入依赖 配置 application.yml pring Boot 整合 tk.mybatis 引入依赖 配置 ...
- Spring Boot基础学习笔记06:Spring Boot整合MyBatis
文章目录 零.学习目标 1.了解Spring Boot数据访问概述 2.掌握使用注解的方式整合MyBatis 3.掌握使用配置文件的方式整合MyBatis 一.Spring Boot数据访问概述 二. ...
- mysql 自动生成mapper_Spring Boot整合mybatis并自动生成mapper和实体实例解析
最近一直都在学习Java,发现目前Java招聘中,mybatis出现的频率挺高的,可能是目前Java开发中使用比较多的数据库ORM框架.于是我准备研究下Spring Boot和mybatis的整合. ...
- spring boot 整合mybatis 无法输出sql的问题
使用spring boot整合mybatis,测试功能的时候,遇到到了sql问题,想要从日志上看哪里错了,但是怎么都无法输出执行的sql,我使用的是log4j2,百度了一下,很多博客都说,加上下面的日 ...
- Spring boot 整合 Mybatis 实现增删改查(MyEclipse版)
1.首先搭建好一个Spring boot 程序,编写好启动类. 启动类代码如下: @SpringBootApplication public class Start {public static vo ...
最新文章
- 分布式一致性算法Raft
- MySQL 性能优化,索引和查询优化
- leetcode-12-整数转罗马数字
- php 地图两点距离计算,计算地图上两点间的距离PHP类
- [译]C语言实现一个简易的Hash table(3)
- 关注信息安全认证培训
- paurse java_Java学习笔记一
- 构建dubbo分布式平台-window安装zookeeper注册中心
- [201511118]发生系统错误86.txt
- SQL Server 何时将“脏页”回写到硬盘
- NXP S32K3 RTD-MCAL快速引导
- 使用QPainter绘制饼状图,并显示所占百分比
- vim编辑器跳转、复制、剪切(2)
- 30岁以前该做什么,30岁以后该做什么!!很有道理
- 红帽操作系统 RHEL 8.1 官方ISO镜像下载
- Python:datetime时间UTC时间转东八区
- 量化交易 米筐 获取股票列表与历史合约数据
- IDEA中编写Python代码
- 【低代码开发】智慧交管解决方案
- 数据库原理(十 一)- 概念结构设计
热门文章
- java 设计模式 优缺点_java设计模式2:原型模式(机制\优缺点分析\使用场景)...
- spring 事务隔离级别和传播行为_Spring事务的传播行为案例分析
- PyTorch框架学习十一——网络层权值初始化
- Opencv——图像膨胀
- 模式识别与机器学习笔记(一)
- Scrapy 下载器 中间件(Downloader Middleware)
- Python 装饰器 函数
- Java加密与解密的艺术~Provider
- select ... into ... 与 insert into .... select .... 语句
- sakura计算机谱子,【14.08.13自拟】SAKURA急求生物股长的简谱