1、配置application.yml
server:
port: 9090
#设置数据库
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3309/xiaobai?serverTimezone=GMT%2b8
username: root
password: admin123
mybatis:
mapper-locations: classpath:mapper/*.xml #让系统扫描所有mybatis的xml文件
#Mybatis打印运行日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#mybatisplus打印运行日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#设置全局实体类的id策略
global-config:
db-config:
id-type: auto
#给实体类统一加前缀来对应数据库表名
table-prefix: tbl_
#逻辑删除策略
#控制逻辑删除的字段名叫deleted
logic-delete-field: deleted
# 设定:"1" 表示已经删除
logic-delete-value: 1
# 设定:"0" 表示未删除
logic-not-delete-value: 0
2、各种注解
@Data
加在实体类之前,加上这个注解后会自动给实体类提供相应getter setter方法
@TableId(value = " ", type = IdType.AUTO)
描述:主键注解,作用,加在主键字段之前表示这是主键,
value中填数据库中对应的字段名称(如果数据库中字段名和实体类中相同则value可以省略不写)
type设定id策略,常用的就是AUTO:数据库 ID 自增
@TableField(" ")
用在实体类中,当实体类中字段名和数据库不匹配时,用来让他们一一对应
如下图,这样数据库的"pwd"和实体类中的password就对应起来了
@TableField(exist = false)
数据库中没有对应字段时,加上这个注释即可
@TableName(" ")
在设计表和实体类时,有可能名字不对应,需要用这个注解让他们联系起来
@TableLogic
描述:表字段逻辑处理注解(逻辑删除),加在某一个字段之前,表示这是逻辑删除字段
3、分页查询功能实现
3.1 写分页拦截器
entity同级创建config文件夹,此文件夹下创建MybatisPlusConfig.java配置文件
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3.2 调用
然后直接用IPage创建对象查询即可
Ipage<T> selectPage(Ipage<T> page)
mybatis-plus的日志在application.yml中配置
4、条件查询
方式一
查询条件有多种
eq:“=”; ne:“≠”; gt:“>”; ge:“>=”;
lt:”<“; le:”<=“; like:”%值%“即模糊查询 等等
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", username);//括号中前一个为传入的数据中需要比较的字段名,后一个为用来比较的数据
List<User> userList = userService.selectList(queryWrapper);
方式二(lambda方式)
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();//用lambda方法需要写清楚泛型名
queryWrapper.lambda().like(User::username, username);//这里传入方法不一样,由于没有双引号,更容易发现拼写错误
List<User> userList = userService.selectList(queryWrapper);
方式三(常用)
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.like(User::getUsername, username);
List<User> userList = userService.selectList(lambdaQueryWrapper);
5、多条件查询
5.1 条件之间 &&
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这两个条件表示查询年龄≥10且≤30的user
lambdaQueryWrapper.le(User::getAge, 30);
lambdaQueryWrapper.ge(User::getAge, 10);
//替换一下,链式也是可以的,效果相同
lambdaQueryWrapper.le(User::getAge, 30).lambdaQueryWrapper.ge(User::getAge, 10);
List<User> userList = userService.selectList(lambdaQueryWrapper);
5.2 条件之间 ||
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这儿查询的是年龄≥30或者≤10的user
lambdaQueryWrapper.le(User::getAge, 10).or().lambdaQueryWrapper.ge(User::getAge, 30);
List<User> userList = userService.selectList(lambdaQueryWrapper);
5.3 null值处理
方法一
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这里的age1和age2仅作为模拟前端传入的用于判断的参数
//age1不为空时才做笔记哎
if(age1 != null){
lambdaQueryWrapper.le(User::getAge, age1);
}
//age2不为空时才做比较
if(age1 != null){
querylambdaQueryWrapperWrapper.ge(User::getHeight, age2);
}
List<User> userList = userService.selectList(lambdaQueryWrapper);
方法二(作用同方法一)
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.le(age1 != null, User::getAge, age1)
.ge(age2 != null, User::getHeight, age2);
List<User> userList = userService.selectList(lambdaQueryWrapper);
6、查询投影
6.1 查询部分字段
方法一(lambda)
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这里只取出了id和age,就只会打印id和age
lambdaQueryWrapper.select(User::getId, User::getAge);
List<User> userList = userService.selectList(lambdaQueryWrapper);
方法二(作用同方法一)
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//这里只取出了id和age,就只会打印id和age
queryWrapper.select("id", "age");
List<User> userList = userService.selectList(queryWrapper);
方法三(查询结果包含模型类中未定义的属性)
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//查询总数据条数
queryWrapper.select("count(*) as count");
List<Map<String, Object>> userList = userService.selectMaps(queryWrapper);
6.2 分组查询
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//按性别分组,这里会显示每个性别对应的数据条数
queryWrapper.select("count(*) as count, sex");
queryWrapper.groupBy("sex"),
List<Map<String, Object>> userList = userService.selectMaps(queryWrapper);
7、常用查询条件
相等(一般用于用户登录)
注意:用户登陆时要采用MD5加密
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//只有在username=张三且密码=123456时,才会查询出这条数据
lambdaQueryWrapper.eq(User::getName, "张三").eq(User::getPassword, "123456");
User loginUser = userService.selectOne(lambdaQueryWrapper);
8、字段映射和表名映射
表名和实体类名不对应
方法一:加注解
使用TableName(" ")注解
方法二:全局配置(application.yml)
这里的意思是给所有的实体类加上前缀“tbl_”,后在去跟数据库表名一一对应
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
数据库字段名和实体类字段名不一致
添加@TableField(value = "")注解
让某一字段不参与查询
在@TableField注解中添加select = false,这里的password就不会被查询出来
9、Id生成策略
方法一:添加注解
@TableId(type = IdType.AUTO)
使用数据库制定的策略
@TableId(type = IdType.INPUT)
自己在后端手动输入id传给数据库
@TableId(type = IdType.ASSIGN_ID)
雪花算法生成id(兼容数值型和字符串型)
方法二:全局配置(application.yml)
在application.yml中写
10、逻辑删除
方法一:加注解
1、数据库中添加delete字段
默认值:0
2、实体类中添加逻辑删除字段
方法二:全局配置
1、修改数据库(同上)
2、添加全局配置(application.yml)
11、乐观锁
1、数据库添加version字段
2、实体类中添加字段
3、添加乐观锁拦截器(MybatisPlusConfig.java)
// 添加乐观锁拦截器
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
12、代码生成器
添加依赖
<!-- 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!-- velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
创建类CodeGenerator.java
package com.example.test.utils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;
public class CodeGenerator {
public static void main(String[] args) {
generate();
}
private static void generate() {
// 数据库相关配置
FastAutoGenerator.create("jdbc:mysql://localhost:3309/xiaobai?serverTimezone=GMT%2b8", "root", "admin123")
//全局配置
.globalConfig(builder -> {
builder.author("良辰") // 设置作者
.disableOpenDir() //禁止打开输出目录
// .enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("G:\\UserDesktop\\桌面\\小白前后端\\test-core\\src\\main\\java"); // 指定输出目录
})
//包配置
.packageConfig(builder -> {
builder.parent("com.example.test") // 设置父包名 默认值:com.baomidou
.moduleName(null) // 设置父包模块名,没有就写null
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "G:\\UserDesktop\\桌面\\小白前后端\\test-core\\src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
})
//策略配置
.strategyConfig(builder -> {
builder.addInclude("sys_user") //增加表匹配 写什么表名,就生成哪个表的实体类,写多个表就生成多个表
.addTablePrefix("sys_"); //过滤表前缀,相当于生成类时自动去掉表名的sys_前缀,其他前缀同理,修改成需要删除的前缀即可
builder.entityBuilder() //实体类策略配置
.versionPropertyName("version") //乐观锁属性名(实体)
.logicDeletePropertyName("deleted") //逻辑删除属性名(实体)
.enableLombok() //开启 lombok 模型
.enableTableFieldAnnotation(); //给所有字段加上说明注解
builder.controllerBuilder() //controller 策略配置
.formatFileName("%sController") //设置controller名字,%s代表实体类名 (貌似不需要设置,有特殊情况可以用)
.enableHyphenStyle() // 开启驼峰转连字符
.enableRestStyle(); // 开启生成@RestController 控制器
})
.execute();
}
}
运行即可生成entity,controller,mapper,service层文件
更多相关配置设置:mybatis plus代码生成器配置
小技巧
去掉运行程序产生的日志
resource中新建logback.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>