mybatis-plus
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lu</groupId>
<artifactId>mybatis_plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis_plus</name>
<description>mybatis_plus</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL = false
driver-class-name: com.mysql.cj.jdbc.Driver
# 设置开发环境
profiles:
active: dev
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
MybatisPlusConfig
package com.lu.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.interceptor.PerformanceMonitorInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("com.lu.mapper")
@EnableTransactionManagement//配置事务默认开启
@Configuration//配置类
public class MybatisPlusConfig {
//注册乐观锁
//新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
//sql执行效率插件
}
handler
MyMetaObjectHandler
package com.lu.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
@Slf4j
@Component //一定不要忘记把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill.... ");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
// 或者
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill.... ");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill.... ");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
// 或者
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill.... ");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
mapper
package com.lu.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lu.pojo.User;
import org.springframework.stereotype.Repository;
import java.util.List;
//在mapper上继承基础的BaseMapper
@Repository//代表持久层
public interface UserMapper extends BaseMapper<User> {
//所以的crud已经编写完成了
//不需要像以前用于配置一大堆文件
}
pojo
package com.lu.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.time.LocalDateTime;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
//对应数据库中的主键(uuid、自增id、雪花算法、redis、zookeeper)
@TableId(type= IdType.AUTO)//一旦手动输入id之后,就需要自己配置id了
private Long id;
private String name;
private Integer age;
private String email;
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@Version//乐观锁
private Integer version;
@TableLogic//逻辑删除
private Integer deleted;
//对应数据库中的主键(uuid、自增id、雪花算法、redis、zookeeper)
@TableId(type= IdType.AUTO)//一旦手动输入id之后,就需要自己配置id了
private Long id;
private String name;
private Integer age;
private String email;
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@Version//乐观锁
private Integer version;
@TableLogic//逻辑删除
private Integer deleted;
}
测试类
package com.lu.mybatis_plus;
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.lu.mapper.UserMapper;
import com.lu.pojo.User;
import lombok.var;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.*;
import static java.lang.System.out;
@SpringBootTest
class MybatisPlusApplicationTests {
@Resource
private UserMapper userMapper;
//查询
@Test
void contextLoads() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
//测试插入
@Test
void Text(){
User user = new User();
user.setAge(17);
user.setName("啊西巴");
user.setCreateTime(null);
user.setUpdateTime(null);
user.setEmail("482475181@qq.com");
userMapper.insert(user);
}
//更新操作
@Test
void Text1(){
User user = new User();
user.setId(12L);
user.setAge(24);
user.setName("张三丰");
user.setEmail("184123207@qq.com");
userMapper.updateById(user);
}
//乐观锁测试成功
@Test
void Text2(){
User user = userMapper.selectById(1L);
user.setName("lujiajian");
user.setEmail("184123207@qq.com");
//执行更新操作
int i = userMapper.updateById(user);
}
//乐观锁测试失败
@Test
void Text3(){
User user = userMapper.selectById(1L);
user.setName("lujiajian1");
user.setEmail("184123207@qq.com");
//模拟另外一个线程执行插队操作
User user2 = userMapper.selectById(1L);
user.setName("lujiajian2");
user.setEmail("184123207@qq.com");
//执行更新操作
userMapper.updateById(user2);
userMapper.updateById(user);
}
//测试查询
@Test
void Text4(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
//批量查询查询
@Test
void Text5(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
users.forEach(System.out::println);
}
//按条件查询
@Test
void Text6(){
Map<String, Object> map = new HashMap<>();
map.put("name","鲁家见");
userMapper.selectByMap(map);
}
//分页插件
@Test
void Text7(){
//参数一当前页
//参数二页面大小
Page<User> page = new Page<>(1,10);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
//测试删除
@Test
void Text8(){
int i = userMapper.deleteById("1634815454079336474");
}
//测试批量删除
@Test
void Text9(){
int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}
//根据条件删除
@Test
void Text10(){
Map<String, Object> map = new HashMap<>();
map.put("name","鲁家见");
int i = userMapper.deleteByMap(map);
}
//复杂查询
@Test
void Text11(){
//查询name不为空并且邮箱不为空,年龄大于12的用户
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper
// .inSql("id","select id from user where id=11")
.isNotNull("name")
.isNotNull("email")
.ge("age",20);
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//查询名字等于付文博的
@Test
void Text12(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.eq("name","付文博");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//查询年龄在20到30之间的用户并且name中带有付字的模糊查询
@Test
void Text13(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.between("age",20,30)
.likeRight("name","付");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//通过id排序进行
@Test
void Text14(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.orderByAsc("id");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
@Resource
private UserMapper userMapper;
//查询
@Test
void contextLoads() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
//测试插入
@Test
void Text(){
User user = new User();
user.setAge(17);
user.setName("啊西巴");
user.setCreateTime(null);
user.setUpdateTime(null);
user.setEmail("482475181@qq.com");
userMapper.insert(user);
}
//更新操作
@Test
void Text1(){
User user = new User();
user.setId(12L);
user.setAge(24);
user.setName("张三丰");
user.setEmail("184123207@qq.com");
userMapper.updateById(user);
}
//乐观锁测试成功
@Test
void Text2(){
User user = userMapper.selectById(1L);
user.setName("lujiajian");
user.setEmail("184123207@qq.com");
//执行更新操作
int i = userMapper.updateById(user);
}
//乐观锁测试失败
@Test
void Text3(){
User user = userMapper.selectById(1L);
user.setName("lujiajian1");
user.setEmail("184123207@qq.com");
//模拟另外一个线程执行插队操作
User user2 = userMapper.selectById(1L);
user.setName("lujiajian2");
user.setEmail("184123207@qq.com");
//执行更新操作
userMapper.updateById(user2);
userMapper.updateById(user);
}
//测试查询
@Test
void Text4(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
//批量查询查询
@Test
void Text5(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
users.forEach(System.out::println);
}
//按条件查询
@Test
void Text6(){
Map<String, Object> map = new HashMap<>();
map.put("name","鲁家见");
userMapper.selectByMap(map);
}
//分页插件
@Test
void Text7(){
//参数一当前页
//参数二页面大小
Page<User> page = new Page<>(1,10);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
//测试删除
@Test
void Text8(){
int i = userMapper.deleteById("1634815454079336474");
}
//测试批量删除
@Test
void Text9(){
int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}
//根据条件删除
@Test
void Text10(){
Map<String, Object> map = new HashMap<>();
map.put("name","鲁家见");
int i = userMapper.deleteByMap(map);
}
//复杂查询
@Test
void Text11(){
//查询name不为空并且邮箱不为空,年龄大于12的用户
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper
}
启动类
package com.lu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
常用注解#
@TableName
-
描述:表名注解,标识实体类对应的表
-
使用位置:实体类
@TableId
-
描述:主键注解,标识实体类中的主键字段
-
使用位置:实体类的主键字段
@TableField
- 描述:普通字段注解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)