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>
</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.StdOutImplglobal-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()); }
}
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;
}
测试类
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);
}
}
启动类
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); }
}
常用注解
@TableName
-
描述:表名注解,标识实体类对应的表
-
使用位置:实体类
@TableId
-
描述:主键注解,标识实体类中的主键字段
-
使用位置:实体类的主键字段
@TableField
- 描述:普通字段注解

浙公网安备 33010602011771号