本节目标
- SpringBoot如何集成MybatisPlus
- 实现对sys_user表的增删改查操作
MybatisPlus介绍
MybatisPlus简称MP。是一个Mybatis的增强工具,它可以使数据库的单表操作变得异常丝滑。虽然市面上有很多的类似工具,但是凭借其在github和gitee的star数,可以充分体现其霸主地位了。这也正是我们选择它的原因,它比mybatis更好用,维护的也很频繁,社区也非常活跃。有问题基本网上都能得到相应的解决方案。
关于它的详细介绍可以参考如下系列文档(友情提示:记得用Firefox浏览器查看):
注意:
传送门中的内容建议先看,因为下面的例子,是基于传送门中配置的MybatisX生成模版后,而生成的代码。
准备数据库和测试表
1.数据库
这里采用mysql数据库5.7作为测试库。
2.创建库
请注意这里用utf8mb4字符集而没有用utf8。因为utf8最大字符长度为3字节;而utf8mb4是4字节。一些比较生僻的汉字和emoji表情是无法用utf8存储的。
3.创建表
CREATE TABLE `sys_user` (
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
`user_name` varchar(30) NOT NULL COMMENT '用户账号',
`nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
`email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
`phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码',
`sex` int(2) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
`avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
`password` varchar(100) DEFAULT '' COMMENT '密码',
`status` int(2) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
`del_flag` int(2) DEFAULT '0' COMMENT '删除标志(0为删除 1代表删除)',
`create_by` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';
集成Mybatis Plus
springboot集成一个第三方框架或者工具。一般最多也就是“三板斧”:
- 第一板斧:加依赖(pom文件中加入maven依赖,不能省略)
- 第二板斧:加注解(一般是springboot的启动类上加,一般不用加)
- 第三板斧:写配置(一般在application.yml加入相关配置,也有很大概率不用加)
1. 加入依赖
<dependencyManagement>
<dependencies>
<!--==================================== -->
<!-- springboot 依赖 -->
<!--==================================== -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- springboot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- Mybatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
</dependencies>
2. 加注解(这里不用加注解)
Mybatis的Mpper类可以通过在application类上加注解进行扫描,比如:
@MapperScan("com.mayuanfei.sprignboot04.domain.mapper")
@SpringBootApplication
public class Springboot04Application {
public static void main(String[] args) {
SpringApplication.run(Springboot04Application.class, args);
}
}
但是还有一种方式,就是在每个Mapper类上加@Mapper注解,由于我们后面使用MybatisX插件自动生成Mapper类,在生成的时候就会加入@Mapper注解,所以这里我们是不需要加入@MapperScan("xxx")注解的。
3. 写配置
MP的配置介绍:传送门
这里MP仅仅做一个简单的配置:
spring:
profiles:
active: dev
datasource:
hikari:
# 最小空闲连接数量
minimum-idle: 2
# 空闲连接最大存活时间(毫秒)。默认是600000,10分钟。这里设置3分钟
idle-timeout: 180000
# 最大连接数,默认是10
maximum-pool-size: 20
# 连接池返回的连接,是否自动提交。默认是true
auto-commit: true
# 连接池的名称.出现在日志记录和JMX管理控制台中,用以识别连接池和配置
pool-name: jspeed-webapi-hikari
# 连接池中的连接最长生命周期。0:表示无限生命;默认1800000毫秒,30分钟
max-lifetime: 1800000
# 数据库连接超时时间,默认30000,也就是30秒超时
connection-timeout: 30000
# 如果驱动支持JDBC4,强烈建议不要设置此属性
connection-test-query: select 1 from dual
mvc:
throw-exception-if-no-handler-found: true
aop:
proxy-target-class: true
jackson:
default-property-inclusion: non_null
# Mybatis Plus配置
mybatis-plus:
configuration:
# 日志输出。这里设置不进行日志输入。默认是:org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
# 设置不输出banner
banner: false
application-dev.yml
server:
port: 8084
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.0.176:3306/springboot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
MybatisX生成代码
1. 安装插件MybatisX(略)
2. Idea中Database中增加我们的springboot-demo库
3. 用MybatisX生产代码
最终生成了两个类:
说明:
开发中,有很多项目都会有Mybatis的xml配置文件,里面都是sql,而我这里主张不要这些类,都写在Mapper接口类中,通过注解形式@Select @Update这种方式来写复杂sql。
进行增删改查测试
1. 增加测试
@Test
public void testInsert() {
SysUser sysUser = new SysUser();
sysUser.setUserName("老马");
sysUser.setNickName("老马哥");
this.sysUserMapper.insert(sysUser);
System.out.println(sysUser);
}
数据库记录可以看到插入成功了:
这里的user_id是MP默认的雪花算法生成的。因为我们的SysUser类UserId定义如下:
@TableName(value ="sys_user")
@Data
public class SysUser extends BaseEntity implements Serializable {
/**
* 用户ID
*/
@TableId
private Long userId;
......
}
这里的userId没有设置主键类型,而默认的主键类型为:
/**
* 主键类型
* {@link IdType}
*/
IdType type() default IdType.NONE;
而NONE的官方解释为:无状态,该类型为未设置主键类型,注解里等于跟随全局。而全局的设置什么呢?
从这里可以看出,默认的id生成是雪花算法。
2. 增加测试-采用数据库自增
上面的插入采用的是雪花算法的id值,这里如果要使用数据库自增的id。需要需改两个地方:
-
数据库设置sys_user表的user_id为自增字段。
-
实体类的user_id需要修改idType为AUTO
@TableName(value ="sys_user") @Data public class SysUser extends BaseEntity implements Serializable { /** * 用户ID */ @TableId(type = IdType.AUTO) private Long userId; ...... -
再次进行增加测试
3. 删除测试
@Test
public void testDelete() {
int result = this.sysUserMapper.deleteById(1);
Console.log("result={}", result);
}
打印输出:
4.删除测试-逻辑删除
在有些场景下,我们并不希望真正删除一条记录,而是把状态修改下,不去显示而已。这种就是逻辑删除。
这里我们仅仅在实体类中对删除字段上加上注解@TableLogic即可,如下代码:
@TableName(value ="sys_user")
@Data
public class SysUser extends BaseEntity implements Serializable {
/**
* 用户ID
*/
@TableId(type = IdType.AUTO)
private Long userId;
// ...省略...
/**
* 删除标志(0未删除 1代表删除)
*/
@TableLogic
private Integer delFlag;
执行删除结果:
5. 修改测试
@Test
public void testUpdate() {
SysUser sysUser = new SysUser();
sysUser.setUserId(4L);
sysUser.setUserName("老马3333");
sysUser.setNickName("老马3333");
this.sysUserMapper.updateById(sysUser);
}
执行修改结果:
6. 查询测试
@Test
public void testSelect() {
List<SysUser> users = new LambdaQueryChainWrapper<>(this.sysUserMapper)
.eq(SysUser::getUserId, 4L)
.like(SysUser::getUserName, "马")
.list();
Console.log("users -> {}", users);
}
执行结果打印:
users -> [SysUser(userId=4, deptId=null, userName=老马3333, nickName=老马3333, email=, phonenumber=, sex=0, avatar=, password=, status=0, delFlag=0)]
代码地址
gitee.com/mayuanfei/S…下的springboot04
记忆印记
- springboot集成三板斧
- MybatisX生成代码
- MP大概的增删改查怎么用,这里重点在IdType的指定和逻辑删除的注解