1. MyBatis-Plus简介 5
官网:https://baomidou.com/
MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.2 主要特点 5
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
1.3 依赖 5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2. MyBatis-Plus入门 6
前面介绍了MyBatis-Plus,当前就以角色管理为例讲解MyBatis-Plus的使用
2.1 准备创建数据库 6
创建数据库
CREATE DATABASE `guigu-oa` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `guigu-oa`;
创建表
CREATE TABLE `sys_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色id',
`role_name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称',
`role_code` varchar(20) DEFAULT NULL COMMENT '角色编码',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '删除标记(0:不可用 1:可用)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='角色';
2.2 配置文件 6
配置 MySQL 数据库的相关配置及Mybatis-Plus日志
在service-oa resources目录下
application.yml
spring:
application:
name: service-oa
profiles:
active: dev
在service-oa resources目录下
application-dev.yml
server:
port: 8800
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/guigu-oa?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
username: root
password: lzl
2.3 启动类 6
在 Spring Boot 启动类中添加 `@MapperScan` 注解,扫描 Mapper 文件夹:
在service-oa模块
ServiceAuthApplication
package com.atguigu.auth;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启动类 6
@SpringBootApplication
@MapperScan("com.atguigu.auth.mapper")//表示能找到mapper动态创建的对象
public class ServiceAuthApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAuthApplication.class, args);
}
}
2.4 实体类 6
已引入,实体类说明:
实体类注解详细文档:https://baomidou.com/pages/223848/
@TableName:表名注解,标识实体类对应的表
@TableId:主键注解,type = IdType.AUTO(数据库 ID 自增)
@TableField:字段注解(非主键)
@TableLogic:逻辑删除 7
代码在model com.atguigu.model.system
SysRole
package com.atguigu.model.system;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.atguigu.model.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data //生成get set方法 6
@ApiModel(description = "角色")
@TableName("sys_role")//指定对应哪张表
public class SysRole extends BaseEntity {
private static final long serialVersionUID = 1L;
//@NotBlank(message = "角色名称不能为空")
@ApiModelProperty(value = "角色名称")
@TableField("role_name") //表示根表中的哪个字段对应
private String roleName;
@ApiModelProperty(value = "角色编码")
@TableField("role_code")
private String roleCode;
@ApiModelProperty(value = "描述")
@TableField("description")
private String description;
}
BaseEntity
package com.atguigu.model.base;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Data
public class BaseEntity implements Serializable {
@TableId(type = IdType.AUTO) //IdType.AUTO主键自动增长 6
private Long id;
@TableField("create_time")
private Date createTime;
@TableField("update_time")
private Date updateTime;
@TableLogic
@TableField("is_deleted")
private Integer isDeleted;
@TableField(exist = false) //表示表里可以没有与之对应的字段 6
private Map<String,Object> param = new HashMap<>();
}
2.5 添加Mapper类 6
在service-oa模块
持久层接口SysRoleMapper
package com.atguigu.auth.mapper;
import com.atguigu.model.system.SysRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
//持久层接口 6
@Repository //交给spring去管理 6
public interface SysRoleMapper extends BaseMapper<SysRole> {
}
2.6 测试 6
在service-oa模块中test
TestMpDemo1
package com.atguigu.auth;
import com.atguigu.auth.mapper.SysRoleMapper;
import com.atguigu.model.system.SysRole;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
//测试mybatis-plus 6
@SpringBootTest
public class TestMpDemo1 {
//注入
@Autowired
private SysRoleMapper mapper;
}
手动往数据库中加入数据,方便测试
查询所有记录 6
TestMpDemo1 查询所有记录
//查询所有记录 6
@Test
public void getAll() {
List<SysRole> list = mapper.selectList(null);
System.out.println(list);
}
成功没问题
添加操作 7
TestMpDemo1添加操作 7
//添加操作 7
@Test
public void add() {
SysRole sysRole = new SysRole();
sysRole.setRoleName("角色管理员1");
sysRole.setRoleCode("role1");
sysRole.setDescription("角色管理员1");
int rows = mapper.insert(sysRole);
System.out.println(rows);
System.out.println(sysRole.getId());
}
修改操作 7
TestMpDemo1 修改操作 7
//修改操作 7
@Test
public void update() {
//根据id查询
SysRole role = mapper.selectById(11);
//设置修改值
role.setRoleName("atguigu角色管理员");
//调用方法实现最终修改
int rows = mapper.updateById(role);
System.out.println(rows);
}
删除操作 7
TestMpDemo1 删除操作 7
单个删除
//删除操作 7
@Test
public void deleteId() {
int rows = mapper.deleteById(11);
}
我们执行逻辑删除,成功删除标志位果然变成了1
批量删除
//批量删除 7
@Test
public void testDeleteBatchIds() {
//删除id是1 和 2
int result = mapper.deleteBatchIds(Arrays.asList(1, 2));
System.out.println(result);
}
3. MyBatis-Plus条件构造器 8
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
注意:以下条件构造器的方法入参中的 `column `均表示数据库字段
service-oa 模块的test
TestMpDemo1
QueryWrapper
//条件查询 8
@Test
public void testQuery1(){
//创建QueryWrapper对象,调用方法封装条件
QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
wrapper.eq("role_name", "总经理");
//调用mp方法实现查询操作
List<SysRole> list = mapper.selectList(wrapper);
System.out.println(list);
}
LambdaQueryWrapper
//条件查询 8
@Test
public void testQuery2() {
//LambdaQueryWrapper,调用方法封装条件
LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysRole::getRoleName,"总经理");
//调用mp方法实现查询操作
List<SysRole> list = mapper.selectList(wrapper);
System.out.println(list);
}
4. MyBatis-Plus封装service层 9
4.1 添加service接口 9
service-oa模块
业务层接口SysRoleService
package com.atguigu.auth.service;
import com.atguigu.model.system.SysRole;
import com.baomidou.mybatisplus.extension.service.IService;
//业务层接口 9
public interface SysRoleService extends IService<SysRole> {
}
业务层接口实现类SysRoleServiceImpl
package com.atguigu.auth.service.impl;
import com.atguigu.auth.mapper.SysRoleMapper;
import com.atguigu.auth.service.SysRoleService;
import com.atguigu.model.system.SysRole;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
//业务层接口实现类 9
@Service //交给spring管理 9
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
}
4.2 测试 9
service-oa模块 test目录
TestMpDemo2
package com.atguigu.auth;
import com.atguigu.auth.service.SysRoleService;
import com.atguigu.model.system.SysRole;
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 TestMpDemo2 {
//注入
@Autowired
private SysRoleService service;
//查询所有记录 9
@Test
public void getAll() {
List<SysRole> list = service.list();
System.out.println(list);
}
}