mybatis-plus
笔记
spring-boot整合mybatis-plus
1.添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.配置mysql连接
# 数据源配置
spring:
datasource:
url: jdbc:mysql://localhost/db01?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
3.创建数据库表

4.编写实体类
@Setter // lombok
@Getter // lombok
@ToString // lombok
@TableName("user") // 表名
@Accessors(chain = true) // 链式编程
public class User {
@TableId(type = IdType.ID_WORKER) // 配置主键id,增长策略
private Long id;
@TableField("name") // 配置属性与字段映射
private String name;
@TableField("age")
private Integer age;
@TableField("email")
private String email;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "created_time",fill = FieldFill.INSERT)
private LocalDateTime createdTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "last_modified_time",fill = FieldFill.INSERT_UPDATE) // 自动填充
private LocalDateTime lastModifiedTime;
@Version // 乐观锁
@TableField(value = "version")
private Integer version;
@TableField("is_delete")
@TableLogic // 逻辑删除
private Integer isDelete;
5.编写dao接口mapper
@Repository
//@Mapper
public interface UserMapper extends BaseMapper<User> {
}
6.测试
//继承了BaseMapper,所有的方法都来自于继承了BaseMapper
//也可以自己编写扩展方法扩展功能
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
//参数为Wrapper,条件构造器
//查询所有用户
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
//测试插入功能
@Test
public void testInsert() {
User user = new User();
// user.setId(10L);
user.setName("mybatis-plus1");
user.setAge(9);
user.setEmail("1111111@qq.com");
int i = userMapper.insert(user);
System.out.println(i);
System.out.println(user);
}
@Test
//测试更新
public void testUpdate() {
User user = new User();
user.setId(4L);
user.setName("修改时间");
//自动配置动态sql
int i = userMapper.updateById(user);
System.out.println(i);
}
拓展
1.主键策略
@TableId(type = IdType.ID_WORKER)
private Long id;
AUTO(0),
NONE(1),
INPUT(2),
ID_WORKER(3),
UUID(4),
ID_WORKER_STR(5);
2.自动填充字段(LocalDateTime与Date格式不同)
添加对应字段
created_time
last_modified_time
添加属性
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "created_time",fill = FieldFill.INSERT)
private LocalDateTime createdTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "last_modified_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime lastModifiedTime;
配置填充处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 修改字段对应为实体类的属性(而不是数据库的字段)
setFieldValByName("createdTime", LocalDateTime.now(),metaObject);
setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
}
}
3.乐观锁
数据库添加version字段
实体类添加version属性
@Version
@TableField(value = "version")
private Integer version;
配置乐观锁插件
@MapperScan("com.gg.mapper")
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
测试
/**
* 先查询再修改,测试乐观锁
* SQL结果:UPDATE user SET create_time=?, last_modify_time=?, name=?, version=?, email=?, age=? WHERE id=? AND version=?
*/
@Test
void update(){
User user = userMapper.selectById(6L);
// 2、修改用户信息
user.setName("gg");
user.setEmail("123456@qq.com");
// 3、执行更新操作
userMapper.updateById(user);
}
4.逻辑删除
添加对应字段
添加属性
@TableField("is_delete")
@TableLogic
private Integer isDelete;
配置yml文件
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-value: 1
logic-delete-not-value: 0
配置开启
@Bean
public ISqlInjector sqlInjector(){
return new DefaultSqlInjector();
}
测试
5.犯过错的需要多看一遍
细节:
1.关于自动填充时间
1.LocalDateTime与Date格式不匹配
2.创建时间和修改时间对应的是类中的属性(##错误的以为是表中的字段##)
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("createdTime", LocalDateTime.now(),metaObject);
setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
}
}
2.乐观锁
1.类需要添加@EnableTransactionManagement
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
2.测试的时候先查再修改(错误测试直接修改没有输出带version的SQL语句)
3.使用wms的BaseEntity2类测试时version添加实体显示为null
@Version
@TableField(value = "version", fill = FieldFill.INSERT_UPDATE)
protected Long version;
判定与wms中的自动填充实现有关
3.逻辑删除(LogicSqlInjector这个类找不到->使用DefaultSqlInjector替换)
@Bean
public ISqlInjector sqlInjector(){
return new DefaultSqlInjector();
}
配置文件添加
mybatis-plus:
configuration:
global-config:
db-config:
logic-delete-value: 1 # 删除为1
logic-delete-not-value: 0 # 未删除为0
时间花在哪里,成就就在哪里


浙公网安备 33010602011771号