🌻🌻 目录
- 一、 Mybatis-Plus 复习
- 1.1、简介
- 1.2、特点
- 1.3、支持数据库
- 1.4、在工程中引入依赖
- 二、Mybatis-Plus 入门
- 2.1、导入配置文件
- 2.2、导入启动类
- 2.3、实体类
- 2.4、创建 Mapper 类
- 2.5、创建测试 Mapper接口
- 2.6、CRUD 测试
- 2.6.1、insert 添加
- 2.6.2、主键策略
- 2.6.3、更新
- 2.6.4、删除
- 2.6.4.1、根据id删除(逻辑删除)
- 2.6.4.2、批量删除
- 2.6.5、MyBatis-Plus 条件构造器
- 2.7、MyBatis-Plus 封装 service 层
- 2.7.1、添加service接口
- 2.7.2、添加service接口实现
- 2.7.3、测试Service接口
一、 Mybatis-Plus 复习
Mybatis-Plus详细总结:中级进阶阶 👉👉 三十五、MyBatis-Plus(1)
官网:https://baomidou.com/
1.1、简介
MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.2、特点
- 无侵入:只做增强不做改变,
引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.3、支持数据库
MySQL
,Oracle
,SQLServer
,PostgreSQL
,DB2
,H2,HSQL,SQLite,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb等。
1.4、在工程中引入依赖
依赖前面已经引入了,分析如下:
工程入口依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
二、Mybatis-Plus 入门
前面介绍了
Mybatis-Plus
,当前就以角色管理为例在service-system
模块中总结Mybatis-Plus
的使用
2.1、导入配置文件
配置 MySQL 数据库的相关配置及Mybatis-Plus日志
在主工程下面的 service-system
下面的分别创建 application-dev.yml
和 application.yml
并导入如下面配置:
application-dev.yml
server:
port: 8800
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/gansu-auth?characterEncoding=utf-8&useSSL=false
username: root
password: root
application.yml
spring:
application:
name: service-system
profiles:
active: dev
2.2、导入启动类
- 在
service-system
下面的java
下面创建包com.gansu.system
,再创建启动类ServiceAuthApplication
,导入如下:- 再在Spring Boot 启动类中添加
@MapperScan
注解,扫描 Mapper 文件夹:
package com.gansu.system;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.gansu.system.mapper")
@SpringBootApplication
public class ServiceAuthApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAuthApplication.class, args);
}
}
2.3、实体类
引入 实体,到 service-system
如下所示:
下面实体类说明:
实体类注解 官方详细文档
@TableName
:表名注解,标识实体类对应的表@TableId
:主键注解,type = IdType.AUTO
(数据库 ID 自增)@TableField
:字段注解(非主键)@TableLogic
:逻辑删除
2.4、创建 Mapper 类
在
java
下面创建包com.gansu.system.mapper
再次创建mapper接口SysRoleMapper
package com.gansu.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gansu.model.system.SysRole;
import org.springframework.stereotype.Repository;
@Repository
public interface SysRoleMapper extends BaseMapper<SysRole> {
}
com.baomidou.mybatisplus.core.mapper.
BaseMapper
这是Mybatis-Plus提供的默认Mapper接口,点进去可以看到,已经封装好了很多的crud
方法。
2.5、创建测试 Mapper接口
在
test
下面的java
下面创建包com.gansu.system
再次创建测试类SysRoleMapperTest
package com.gansu.system;
import com.gansu.model.system.SysRole;
import com.gansu.system.mapper.SysRoleMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class SysRoleMapperTest {
@Autowired
private SysRoleMapper sysRoleMapper;
@Test //org.junit.jupiter.api.Test; 导入 junit5
public void test1(){
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
List<SysRole> sysRoles = sysRoleMapper.selectList(null);
for (SysRole sysRole : sysRoles) {
System.out.println(sysRole);
}
}
}
注意:
- IDEA在sysRoleMapper处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。
- 为了避免报错,可以在 mapper 层 的接口上添加
@Repository
或直接使用@Resource
代替@Autowired
。
运行程序控制台输出:
对比数据库如下:
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
2.6、CRUD 测试
2.6.1、insert 添加
@Test //增加
public void test2(){
SysRole sysRole1 = new SysRole();
sysRole1.setRoleName("角色管理");
sysRole1.setRoleCode("roleManager");
sysRole1.setDescription("角色描述");
int insert = sysRoleMapper.insert(sysRole1);
System.out.println(insert); //影响的行数
System.out.println(sysRole1.getId());//id自动会增
}
运行程序控制台输出:
对比数据库如下:
增加前:
增加后:
2.6.2、主键策略
1、ID_WORKER
MyBatis-Plus
默认的主键策略是:ID_WORKER
全局唯一ID
2、自增策略
-
要想主键自增需要配置如下主键策略
-
- 需要在创建数据表的时候设置主键自增
- 实体基类
BaseEntity
字段中配置@TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
2.6.3、更新
@Test //更新
public void test3(){
SysRole sysRole1 = new SysRole();
sysRole1.setId(1824717962347577345L);
sysRole1.setRoleName("橘色管理88");
sysRole1.setRoleCode("8888888");
sysRole1.setDescription("橘色描述");
int i = sysRoleMapper.updateById(sysRole1);
System.out.println(i); //影响的行数
System.out.println(sysRole1.getId());//id不变
}
运行程序控制台输出:
更新前:
更新后:
2.6.4、删除
2.6.4.1、根据id删除(逻辑删除)
如果数据库中没有
delete
这个字段则会物理删除
配置:application-dev.yml
中添加:
spring:
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
@Test //更具id删除
public void test4(){
sysRoleMapper.deleteById(1824717962347577345L);
}
运行程序控制台输出:
删除前:
删除后:
2.6.4.2、批量删除
@Test //更具id删除
public void test4(){
//逻辑删除
// sysRoleMapper.deleteById(1824717962347577345L);
//批量删除
sysRoleMapper.deleteBatchIds(Arrays.asList(1824717962347577346L,1824717962347577347L));
}
运行程序控制台输出:
删除前:
删除后:
再次查询,则如下显示,查询不到:
2.6.5、MyBatis-Plus 条件构造器
Wrapper
: 条件构造抽象类,最顶端父类
AbstractWrapper
: 用于查询条件封装,生成 sql 的 where 条件
–QueryWrapper
: Entity 对象封装操作类,不是用lambda语法
–UpdateWrapper
: Update 条件封装,用于Entity对象更新操作
–AbstractLambdaWrapper
: Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
– -LambdaQueryWrapper
:看名称也能明白就是用于Lambda语法使用的查询Wrapper
– -LambdaUpdateWrapper
: Lambda 更新封装Wrapper
注意:以下条件构造器的方法入参中的 column
均表示数据库字段
① 根据用户名查询和用户名模糊查询
@Test //模糊查询
public void test5(){
//1.创建构造器
QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
//wrapper.eq("role_name","普通管理员");
wrapper.like("role_name","管理员");
List<SysRole> sysRoles = sysRoleMapper.selectList(wrapper);
System.out.println(sysRoles);
}
控制台输出:
② 根据用户名删除
@Test //删除
public void test6(){
//1.创建构造器
QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
wrapper.eq("role_name","用户管理员");
sysRoleMapper.delete(wrapper);
}
控制台输出:
删除前:
删除后:
其他条件构造有兴趣的可自行测试也可以参考详细总结里面的。
2.7、MyBatis-Plus 封装 service 层
2.7.1、添加service接口
① 在
service-system
下面创建包com.gansu.system.service
,再在下面创建 接口SysRoleService
,并继承mybatisPlus接口IService
com.baomidou.mybatisplus.extension.service.IService
这是Mybatis-Plus
提供的默认Service
接口。
package com.gansu.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gansu.model.system.SysRole;
public interface SysRoleService extends IService<SysRole> {
}
2.7.2、添加service接口实现
② 再创建包
com.gansu.system.service.impl
并且创建接口实现类SysRoleServiceImpl
,并继承Mybatis-Plus
提供的默认类ServiceImpl
package com.gansu.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gansu.model.system.SysRole;
import com.gansu.system.mapper.SysRoleMapper;
import com.gansu.system.service.SysRoleService;
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper,SysRole> implements SysRoleService {
}
源码分析:
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
这是Mybatis-Plus
提供的默认Service
接口实现。
2.7.3、测试Service接口
还原数据库表
sys_role
字段is_deleted
所有为0
,便于下面测试
在原先包下面创建测试类 SysRoleServiceTest
package com.gansu.system;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Repository;
import java.util.List;
@SpringBootTest
public class SysRoleServiceTest {
@Autowired
private SysRoleService sysRoleService;
@Test //查询所有
public void test1(){
List<SysRole> list = sysRoleService.list();
for (SysRole sysRole : list) {
System.out.println(sysRole);
}
}
@Test //增加
public void test2(){
SysRole sysRole1 = new SysRole();
sysRole1.setRoleName("角色818");
sysRole1.setRoleCode("818");
sysRole1.setDescription("角色818描述");
sysRoleService.save(sysRole1);
}
@Test //更新
public void test3(){
SysRole sysRole1 = new SysRole();
sysRole1.setId(1824717962347577347L);
sysRole1.setRoleName("818");
sysRoleService.updateById(sysRole1);
}
@Test //删除
public void test4(){
sysRoleService.removeById(1824717962347577347L);
}
@Test //模糊查询
public void test5(){
QueryWrapper<SysRole> wrapper = new QueryWrapper<SysRole>();
wrapper.like("role_name","818");
sysRoleService.list(wrapper);
}
}
数据库最后显示:
文章源码