jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询。但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加了多表关联的实现步骤。

Mybatis 插件自动生成的mapper 实现了大部分基本、通用的方法,如:insert、update、delete、select 等大概20个左右方法,都是比较基础的增删改查,这些通用Mapper提供的方法基本都能满足各种单表操作需求。

但是,在实际工作中通用Mapper并不能满足所有的工作,或是某个业务需要手写 sql 语句、或是多表关联时,该怎么办呢? 这就需要额外的一些自定义的mapper 实现一些特定的功能。下面就来介绍自定义mapper 的实现。

068d10709658b709c4a7082fcedfba27.png

一、自定义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

35b45f60d04c3761cbe8ad40e3a239d7.png

最后

以上,就把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入门系列(十三)如何实现事务,极简版!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark on yarn 完全分布式_「大数据」(七十一)Spark之架构介绍

【导读&#xff1a;数据是二十一世纪的石油&#xff0c;蕴含巨大价值&#xff0c;这是情报通大数据技术系列第[71]篇文章&#xff0c;欢迎阅读和收藏】1 基本概念Spark 架构采用了分布式计算中的 Master-Slave 模型。 Master 是对应集群中的含有 Master 进程的节点&#xff0c;…

计算机网络数据链路层 --- 停止等待协议

停止等待协议的意义 除了比特出差错&#xff0c;底层信道还会出现丢包问题。为了实现流量控制。 停止等待协议的前提 虽然现在常用全双工通信方式&#xff0c;但为了讨论问题方便&#xff0c;仅考虑一方发送数据&#xff08;发送方&#xff09;&#xff0c;一方接收数据&…

python import如何使用_python之import引用

关于python的import引用的最大关键是init.py文件的作用&#xff0c;这个文件对于import的方法使用至关重要。这个是我在搭建自动化框架过程中用到的import的方法使用。 比如说&#xff0c;我现在login.py想引用bottom底下的log.py的时候&#xff0c;这个时候&#xff0c;我们如…

计算机网络数据链路层 --- 后退n帧协议(GBN)

滑动窗口 发送窗口 发送方维持一组连续的允许发送的帧的序号 接收窗口 接收方维持一组连续的允许接收帧的序号 发送过程 如图&#xff0c;假如发送方的发送窗口大小是6&#xff0c;首先发送0号帧&#xff0c;并建立0号帧的副本&#xff0c;防止帧丢失&#xff0c;然后发送…

简要描述内部连接和外部连接之间的区别_创新性的M12推拉式连接器推拉标准—跨制造商自动化技术的里程碑...

“八家知名制造商 – 菲尼克斯&#xff0c;浩亭&#xff0c;莫仕&#xff0c;穆尔电子&#xff0c;宾德&#xff0c;康耐&#xff0c;艾查和魏德米勒因建立M12推拉式连接器的推拉锁紧机制而在市场上确立了地位。我们共同追求一个目标&#xff0c;即确保各个制造商之间的兼容性。…

计算机网络数据链路层 --- 选择重传协议(SR)

引言 GBN协议的弊端 累计确认&#xff0c;从而导致某一帧错误后会批量重传。 可行的解决方案 可以只重传出错的帧&#xff0c;设置单个确认&#xff0c;同时加大接收窗口&#xff0c;设置接收缓存&#xff0c;缓存乱序到达的帧。这也就是选择重传协议SR。 SR中的滑动窗口 …

requests 返回的cookies为空_爬虫学习(2)(requests库)

POST请求import requestsdata {name: cxc, age: 18} r requests.post("http://httpbin.org/post", datadata) print(r.text)POST请求这样就成功地获得了返回结果&#xff0c;form部分就是提交的数据&#xff0c;证明POST请求成功发送了。响应之前我们使用了text和c…

计算机网络 --- 数据链路层介质访问控制

引言 传输数据使用的两种链路&#xff1a; 点对点链路&#xff1a;两个相邻的节点通过一个链路相连&#xff0c;没有第三者。应用&#xff1a;PPP协议&#xff0c;常用于广域网。广播式链路&#xff1a;所有主机共享通信介质。应用&#xff1a;早期的总线以太网&#xff0c;无…

6-7 使用函数输出水仙花数_学习C语言居然对printf函数不理解???

对于C语言的printf函数&#xff0c;可以说是我们学习C语言第一个接触到的函数了。printf命令的作用是格式化输出函数&#xff0c;一般用于向标准输出设备按规定格式输出信息。printf()函数的调用格式为&#xff1a;printf("", )。printf()是C语言标准库函数&#xff…

matplotlib 子图超过4个_Matplotlib从入门到精通

Matplotlib从入门到精通​mp.weixin.qq.comMatplotlib是基于Python语言的开源项目&#xff0c;旨在为Python提供一个数据绘图包。它提供了一整套和 matlab 相似的命令 API&#xff0c;十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件&#xff0c;嵌入 GUI 应用程序…

c++求n的几次方_14.八年级数学:若a+b+c=1,怎么求 a+b+c的值?分式培优拓展

欢迎您来到方老师数学课堂&#xff0c;请点击上方蓝色字体&#xff0c;关注方老师数学课堂。所有的视频内容&#xff0c;全部免费&#xff0c;请大家放心关注&#xff0c;放心订阅。八年级数学&#xff1a;若abc1&#xff0c;怎么求 abc的值&#xff1f;分式培优拓展。这道题&a…

计算机网络 --- 数据链路层CSMA/CD协议

CSMA/CD协议 全称为载波监听多点接入/碰撞检测CSMA/CD&#xff08;carrier sense multiple access with collision detection&#xff09; CSMA/CD协议 - CS: CS指的是载波侦听/监听&#xff0c;每一个站点再发送数据之前以及发送数据时都要检测一下总线上是否有其他计算机在…

map insert异常失败_处理dubbo反序列化失败的坑

前言今天下午&#xff0c;当我经过一个小时的奋”键“疾”码“&#xff0c;准备好好的审查一下(摸鱼)自己写的代码&#xff0c;经过一段时间审查(摸的差不多了&#xff0c;该下班了)&#xff0c;得出一个结论我写的代码很优雅、精简。所以大手一挥提交代码&#xff0c;并在 API…

class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...

1. GC回收哪些内存区域呢&#xff1f;堆内存对象数组方法区该类所有的额实例都已经被回收&#xff0c; 也就是java堆中不存在该类的任何实例加载该类的ClassLoader已经被回收该类对应的java.lang.Class对象在任何地方没有被引用&#xff0c; 也无法通过反射访问该类方法。垃圾回…

c++读取utf8文件_Node.js 进阶之 fs 文件模块学习

前言文件操作是开发过程中并不可少的一部分。Node.js 中的 fs 模块是文件操作的封装&#xff0c;它提供了文件读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统操作。与其它模块不同的是&#xff0c;fs 模块中所有的操作都提供了异步和同步的两个版本,具有 sync 后缀的…

计算机网络 --- 数据链路层中局域网和广域网

局域网 简称LAN&#xff08;Local Area Network&#xff09;&#xff1a;是指在某一区域内由多台计算机互联成的计算机组&#xff0c;使用广播信道。 局域网的特点 覆盖的地理范围较小&#xff0c;只在一个相对独立的局部范围内联&#xff0c;如一座或集中的建筑群内。使用专…

python制作中文词云_Python如何生成词云(详解)

前言 今天教大家用wrodcloud模块来生成词云&#xff0c;我读取了一篇小说并生成了词云&#xff0c;先看一下效果图&#xff1a; 效果图一&#xff1a;效果图二&#xff1a;根据效果图分析的还是比较准确的&#xff0c;小说中的主人公就是“程理”&#xff0c;所以出现次数最多。…

计算机网络 --- 局域网中的以太网

以太网概述 以太网是应用最广泛的局域网&#xff0c;包括标准以太网&#xff08;10Mbps&#xff09;&#xff0c;快速以太网&#xff08;1000Mbps&#xff09;&#xff0c;千兆以太网&#xff08;1000Mbps&#xff09;和10G以太网&#xff0c;他们都符合IEEE802.3系列标准规范…

高度为5的3阶b树含有的关键字个数_数据结构要考得好,你心里要有B树

01知识框架02知识点详解1B树①定义与性质B树也叫B-树。B树是一种平衡的多分树&#xff0c;通常我们说m阶的B树&#xff0c;是二叉排序树的一种扩展&#xff0c;它必须满足如下条件&#xff1a;01每个结点最多只有m-1个关键字。02根结点最少可以只有1个关键字。03非根结点至少有…

计算机网络 --- 网络层路由算法与路由协议

路由表&#xff1a; 最佳路由&#xff1a; “最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 路由算法的分类 静态路由算法&#xff08;非自适应路由算法&#xff09; 管理员手工配置路由信息。简便&#xff0c;可靠&#xff0c;在负荷稳定&#xff0c;拓扑…