springboot与mybatis增删改查(SpringBoot整合mybatis如何自定义)
上一篇文章已经介绍了自定义 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<SysUser> queryUserSimplyInfoById(String userId);
}
SysUserMapperCustom 是一个接口,这里只定义了一个方法:queryUserSimplyInfoById 。
2、创建自定义mapper 配置文件
在resource\mapper 目录下,创建一个自定义的SysUserMapperCustom.xml
<?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="com.weiz.mapper.SysUserMapperCustom" >
<!-- 查询用户信息 -->
<select id="queryUserSimplyInfoById" resultType="com.weiz.pojo.SysUser"
parameterType="java.lang.String" >
select
*
from
sys_user
where
id = #{id,jdbcType=VARCHAR}
</select>
</mapper>
说明:
id:对应的就是 接口名,
resultType:返回的是结果类型,
parameterType:参数的类型,
# : 是传递相关参数。
3、Service 调用
首先在UserService接口中增加queryUserByIdCustom方法,然后在对应的 UserServiceImpl 实现类中,注入SysUserMapperCustom 。最后实现queryUserByIdCustom 方法,在方法中调用前面自定义的mapper 类中方法即可。具体代码如下:
// 1. 在UserServiceImpl 中注入SysUserMapperCustom
@Autowired
private SysUserMapperCustom userMapperCustom;
// 2. 实现接口方法,调用
@Override
public SysUser queryUserByIdCustom(String userId) {
List<SysUser> 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<SysUser> queryUserSimplyInfoById(String userId);
List<SysUser> queryAllUserListCustom();
}
然后、在resource\mapper\SysUserMapperCustom.xml 配置文件中增加 queryAllUserListCustom 方法配。
<resultMap id="UserMap" type="com.weiz.pojo.SysUser">
<id column="id" jdbcType="VARCHAR" property="id" />
<result property="username" column="username" jdbcType="VARCHAR" />
<!--封装映射company表数据,user表与company表1对1关系,配置1对1的映射
association:用于配置1对1的映射
属性property:company对象在user对象中的属性名
属性javaType:company属性的java对象 类型
属性column:user表中的外键引用company表
-->
<association property="company" javaType="com.weiz.pojo.SysCompany" column="company_id">
<id property="id" jdbcType="VARCHAR" column="companyid"></id>
<result property="name" jdbcType="VARCHAR" column="companyname"></result>
</association>
<!--配置1对多关系映射
property:在user里面的List<Account>的属性名
ofType:当前account表的java类型
column:外键
-->
</resultMap>
<select id="queryAllUserListCustom" resultMap="UserMap" >
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
</select>
说明:
1、association:用于配置1对1的映射
属性property:company对象在user对象中的属性名
属性javaType:company属性的java对象 类型
属性column:user表中的外键引用company表。
2、collection:用于配置1对多关系映射
property:在user里面的List<Account>的属性名
ofType:当前account表的java类型
column:外键
4、Service 调用
Service中调用新增加的方法和上面的一样,首先在UserService接口中增加queryUserByIdCustom方法,然后在对应的 UserServiceImpl 实现类中,注入SysUserMapperCustom 。最后实现queryUserByIdCustom 方法,在方法中调用前面自定义的mapper 类中方法即可。具体代码如下:
// 1. 在UserServiceImpl 中注入SysUserMapperCustom
@Autowired
private SysUserMapperCustom userMapperCustom;
// 2. 实现接口方法,调用
@Override
public SysUser queryAllUserListCustom() {
List<SysUser> 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入门系列(十三)如何实现事务,极简版!
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com