目录
7. MyBatis-Plus的QueryWrapper条件构造器
1. 添加Maven依赖
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2. application.yml配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/june
username: root
password: root
logging:
level:
com.example.mbp0626.dao: debug
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. 在启动类上添加扫描DAO的注解
package com.example.mbp0626;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.example.mbp0626.dao")
@SpringBootApplication
public class Mbp0626Application {
public static void main(String[] args) {
SpringApplication.run(Mbp0626Application.class, args);
}
}
4. 编写Config配置类
package com.example.mbp0626.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//mybatis plus配置类
@Configuration
public class MbpConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
// @Bean
// public PerformanceInterceptor performanceInterceptor() {
// return new PerformanceInterceptor();
// }
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
5. 编写Bean dao service
package com.example.mbp0626.bean;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@TableName("user")
@Data
public class User {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
package com.example.mbp0626.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.mbp0626.bean.User;
public interface UserDao extends BaseMapper<User>{
/* *
* @Description 查询大于该年龄的用户
* @Author zx
* @CreateTime 2020/6/26 21:39
* @Param [page, age] page 分页参数
* @Return IPage 分页数据
*/
IPage<User> selectUserByAge(IPage<User> page,int age);
}
package com.example.mbp0626.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mbp0626.bean.User;
public interface UserService extends IService<User> {
IPage<User> selectUserByAge(IPage<User> page, int age);
}
package com.example.mbp0626.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mbp0626.bean.User;
import com.example.mbp0626.dao.UserDao;
import com.example.mbp0626.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
@Override
public IPage<User> selectUserByAge(IPage<User> page, int age) {
return this.baseMapper.selectUserByAge(page,age);
}
}
6. 编写Controller
service中没有写任何方法,MyBatis-Plus官方封装了许多基本CRUD的方法,可以直接使用大量节约时间,MP共通方法详见IService,ServiceImpl,BaseMapper源码,写入操作在ServiceImpl中已有事务绑定
package com.example.mbp0626.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mbp0626.bean.User;
import com.example.mbp0626.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
HashMap<String,Object> map=new HashMap<>();
/**
* @Description 查询全部信息
* @Author zx
* @CreateTime 2020/6/26 16:40
* @Param []
* @Return java.util.List<com.example.mbp0626.bean.User>
*/
@RequestMapping("/getList")
public List<User> getList(){
List<User> list=userService.list();
return list;
}
/* *
* @Description 根据ID获取用户信息
* @Author zx
* @CreateTime 2020/6/26 16:43
* @Param [id]
* @Return com.example.mbp0626.bean.User
*/
@RequestMapping("/getUser/{id}")
public User getUser(@PathVariable("id") Integer id){
User user = userService.getById(id);
return user;
}
/* *
* @Description 分页查询全部数据
* @Author zx
* @CreateTime 2020/6/26 16:43
* @Param []
* @Return com.baomidou.mybatisplus.core.metadata.IPage<com.example.mbp0626.bean.User>
*/
@RequestMapping("/getPage")
public IPage<User> getUserListPage(){
//需要在Config配置类中配置分页插件
IPage<User> page=new Page<>();
//当前页
page.setCurrent(5);
//每页条数
page.setSize(1);
page=userService.page(page);
return page;
}
/* *
* @Description 根据指定字段查询用户信息集合
* @Author zx
* @CreateTime 2020/6/26 17:02
* @Param
* @Return
*/
@RequestMapping("/getListMap")
public Collection<User> getListMap(){
map.put("name","bb");
List<User> users = userService.listByMap(map);
return users;
}
/* *
* @Description 新增用户信息
* @Author zx
* @CreateTime 2020/6/26 17:07
* @Param [user]
* @Return java.util.Map
*/
@RequestMapping("/save")
public Map saveUser(User user){
userService.save(user);
map.put("info","success");
map.put("user",user);
//map.put("users",userService.list());
return map;
}
/* *
* @Description 批量新增用户信息
* @Author zx
* @CreateTime 2020/6/26 17:12
* @Param []
* @Return java.util.Map
*/
@RequestMapping("/saveUsers")
public Map save(){
User u1=new User();
u1.setAge(11);
u1.setName("user1");
u1.setEmail("user1@1234.com");
User u2=new User();
u2.setAge(12);
u2.setName("user2");
u2.setEmail("user2@1234.com");
//批量保存
List<User> list=new ArrayList<>();
list.add(u1);
list.add(u2);
map.put("users",list);
userService.saveBatch(list);
return map;
}
/* *
* @Description 更新用户信息
* @Author zx
* @CreateTime 2020/6/26 17:23
* @Param [user]
* @Return java.util.Map
*/
@RequestMapping("/update")
public Map update(User user){
User u = userService.getById(user.getId());
map.put("old",u);
map.put("new",user);
userService.updateById(user);
return map;
}
/* *
* @Description 新增或者更新用户信息
* @Author zx
* @CreateTime 2020/6/26 17:43
* @Param [user]
* @Return java.util.Map
*/
@RequestMapping("/saveOrUpdate")
public Map saveOrUpdate(User user){
//传入的实体类userInfoEntity中ID为null就会新增(ID自增)
//实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增
if(userService.getById(user.getId())!=null){
map.put("update",user);
}else{
map.put("insert",user);
}
userService.saveOrUpdate(user);
return map;
}
/* *
* @Description 根据ID删除用户信息
* @Author zx
* @CreateTime 2020/6/26 17:46
* @Param [id]
* @Return void
*/
@RequestMapping("/delete/{id}")
public void delete(@PathVariable("id") Integer id){
userService.removeById(id);
}
/* *
* @Description 根据ID批量删除用户信息
* @Author zx
* @CreateTime 2020/6/26 17:46
* @Param []
* @Return void
*/
@RequestMapping("/deleteInfoList")
public void deleteInfoList(){
List<String> list=new ArrayList<>();
list.add("11");
list.add("12");
userService.removeByIds(list);
}
/* *
* @Description 根据指定字段删除用户信息
* @Author zx
* @CreateTime 2020/6/26 17:48
* @Param []
* @Return void
*/
@RequestMapping("/deleteInfoMap")
public void deleteInfoMap(){
Map<String,Object> map=new HashMap<>();
map.put("age",9);
map.put("name","1709");
userService.removeByMap(map);
}
}
访问 http://localhost:8080/user/getList
7. MyBatis-Plus的QueryWrapper条件构造器
当查询条件复杂的时候,我们可以使用MP的条件构造器
package com.example.mbp0626.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mbp0626.bean.User;
import com.example.mbp0626.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//MyBatis-Plus的QueryWrapper条件构造器
@RestController
@RequestMapping("/qw")
public class UserControllerqw {
@Autowired
UserService userService;
/* *
* @Description MP扩展演示
* @Author zx
* @CreateTime 2020/6/26 21:25
* @Param []
* @Return java.util.Map<java.lang.String,java.lang.Object>
*/
@RequestMapping("/getInfoListPlus")
public Map<String,Object> getInfoListPage(){
//初始化返回类
Map<String,Object> result = new HashMap<>();
//查询年龄等于18岁的user
//等价SQL: SELECT id,name,age,email FROM user WHERE age = 18
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.lambda().eq(User::getAge,18);
List<User> UserList1 = userService.list(queryWrapper1);
result.put("userAge18",UserList1);
//查询年龄大于5岁的学生且小于等于18岁的user
//等价SQL: SELECT id,name,age,email FROM user WHERE age > 5 AND age <= 18
QueryWrapper<User> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.lambda().gt(User::getAge,5);
queryWrapper2.lambda().le(User::getAge,18);
List<User> UserList2 = userService.list(queryWrapper2);
result.put("userAge5",UserList2);
//模糊查询email字段带有"1234"的数据,并按照年龄降序
//等价SQL: SELECT id,name,age,email FROM user WHERE email LIKE '%1234%' ORDER BY age DESC
QueryWrapper<User> queryWrapper3 = new QueryWrapper<>();
queryWrapper3.lambda().like(User::getEmail,"1234");
queryWrapper3.lambda().orderByDesc(User::getAge);
List<User> UserList3 = userService.list(queryWrapper3);
result.put("userAgeSkill",UserList3);
//模糊查询名字带有"2"或者年龄大于18的user
//等价SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE name LIKE '%2%' OR age > 18
QueryWrapper<User> queryWrapper4 = new QueryWrapper<>();
queryWrapper4.lambda().like(User::getName,"2");
queryWrapper4.lambda().or().gt(User::getAge,18);
List<User> UserList4 = userService.list(queryWrapper4);
result.put("userOr",UserList4);
//查询emial不为null的user,并且分页
//等价SQL: SELECT id,name,age,email FROM user_info WHERE email IS NOT NULL LIMIT 0,5
IPage<User> page = new Page<>();
page.setCurrent(1);
page.setSize(5);
QueryWrapper<User> queryWrapper5 = new QueryWrapper<>();
queryWrapper5.lambda().isNotNull(User::getEmail);
page = userService.page(page,queryWrapper5);
result.put("userPage",page);
return result;
}
/* *
* @Description 自定义SQL
* @Author zx
* @CreateTime 2020/6/26 21:31
* @Param
* @Return
*/
@RequestMapping("/getUserByAge")
public IPage<User> getUserByAge(){
IPage<User> page=new Page<>();
page.setSize(2);
page.setCurrent(1);
page=userService.selectUserByAge(page,20);
return page;
}
}
访问 http://localhost:8080/qw/getInfoListPlus
8. 自定义SQL
引入Mybatis-Plus不会对项目现有的 Mybatis 构架产生任何影响,而且Mybatis-Plus支持所有 Mybatis 原生的特性,
由于某些业务复杂,可能要自己去写一些比较复杂的SQL语句,举一简单的例子来演示自定义SQL.
编写Mapper.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.example.mbp0626.dao.UserDao">
<select id="selectUserByAge" parameterType="int" resultType="com.example.mbp0626.bean.User">
select * from user where age>#{age}
</select>
</mapper>
在DAO中加入方法
/* *
* @Description 查询大于该年龄的用户
* @Author zx
* @CreateTime 2020/6/26 21:39
* @Param [page, age] page 分页参数
* @Return IPage 分页数据
*/
IPage<User> selectUserByAge(IPage<User> page,int age);
在service加入方法
IPage<User> selectUserByAge(IPage<User> page, int age);
在serviceImpl加入方法
@Override
public IPage<User> selectUserByAge(IPage<User> page, int age) {
return this.baseMapper.selectUserByAge(page,age);
}
在Controller中测试
/* *
* @Description 自定义SQL
* @Author zx
* @CreateTime 2020/6/26 21:31
* @Param
* @Return
*/
@RequestMapping("/getUserByAge")
public IPage<User> getUserByAge(){
IPage<User> page=new Page<>();
page.setSize(2);
page.setCurrent(1);
page=userService.selectUserByAge(page,20);
return page;
}
访问 http://localhost:8080/qw/getUserByAge
9. 代码生成器
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1</version>
</dependency>
package com.example.mbp0626.generator;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
final static String dirPath = "D://mbpgenerator/";
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
//String projectPath = System.getProperty("user.dir");
//gc.setOutputDir(projectPath + "/src/main/java");
gc.setOutputDir(dirPath+"/src/main/java");
gc.setAuthor("zx");
gc.setOpen(false);
gc.setFileOverride(true); //是否覆盖
gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(true);// XML columList
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setMapperName("%sDao");
// gc.setXmlName("%sMapper");
gc.setServiceName("%sService");
// gc.setServiceImplName("%sServiceDiy");
// gc.setControllerName("%sAction");
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setUrl("jdbc:mysql://localhost:3306/june?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
// dsc.setTypeConvert(new MySqlTypeConvert(){
// // 自定义数据库表字段类型转换【可选】
// @Override
// public DbColumnType processTypeConvert(String fieldType) {
// System.out.println("转换类型:" + fieldType);
// // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
// return super.processTypeConvert(fieldType);
// }
// });
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模块名"));
pc.setParent("com.example.mbp");
pc.setController("controller");
pc.setEntity("entity");
pc.setMapper("dao");
pc.setService("service");
pc.setServiceImpl("serviceImpl");
//pc.setXml("mapperXml");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
//String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
// return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
// + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
return dirPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
/*
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
checkDir("调用默认方法创建的目录,自定义目录用");
if (fileType == FileType.MAPPER) {
// 已经生成 mapper 文件判断存在,不想重新生成返回 false
return !new File(filePath).exists();
}
// 允许生成模板文件
return true;
}
});
*/
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setInclude(new String[] { "book" }); // 需要生成的表
//strategy.setExclude(new String[]{"user"}); // 排除生成的表
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父类
//strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
// 写于父类中的公共字段
//strategy.setSuperEntityColumns("id");
//strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
//strategy.setControllerMappingHyphenStyle(true);
//strategy.setTablePrefix(pc.getModuleName() + "_");
strategy.setEntityBuilderModel(true);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
10. 性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间,
注意:3.3.2版本 cant resolve symbol PerformanceInterceptor,3.1.0版本可以使用
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.example.mbp0626.dao")
public class MybatisPlusConfig {
/**
* SQL执行效率插件
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor()
.setMaxTime(1);//maxTime SQL 执行最大时长,超过自动停止运行;
}
}
该插件 3.2.0 以上版本移除推荐使用第三方扩展 执行SQL分析打印 功能
该功能依赖 p6spy
组件,完美的输出打印 SQL 及执行时长 3.1.0
以上版本
p6spy 依赖引入
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.7</version>
</dependency>
spy.properties 配置:
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
application.yml 配置:
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:h2:mem:test
...
11. 逻辑删除
application.yml 配置:
spring:
datasource:
# driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://localhost:3306/june
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/june?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: root
logging:
level:
com.example.mbp0626.dao: debug
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#逻辑删除
global-config:
db-config:
logic-delete-field: flag #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
type-aliases-package: com.example.mbp0626.bean
实体类相关字段标注注解@TableLogic
package com.example.mbp0626.bean;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author zx
* @since 2020-06-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Book extends Model<Book> {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private String author;
private String price;
@TableLogic
private Integer status;
@Override
protected Serializable pkVal() {
return this.id;
}
}
注意:
https://github.com/kilizhang/mbp0626
参考:
SpringBoot整合MyBatis-Plus3.1详细教程
springboot整合mybatis-plus,以及mybatis-plus入门使用
SpringBoot+MybatisPlus+代码生成器整合(真正让你专心做业务)