前面提到 spring data jpa,但是在国内受欢迎的还是 mybatis-plus。
依赖引入
<!-- Spring Boot 3 必须选 spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.12</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
配置
配置数据库相关即可
spring.datasource.url=jdbc:mysql://localhost:3306/helloword
spring.datasource.username=root
spring.datasource.password=lkjhgfds
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
创建实体
假如已经存在如下表格:
CREATE TABLE tbl_user (
// 主键自增
id bigint unsigned auto_increment primary key,
// 业务字段
username varchar(50) not null unique,
password char(60) not null,
email varchar(100) not null unique,
// 逻辑删除
is_deleted tinyint(1) unsigned not null default 0,
// 审计字段
created_at datetime not null default current_timestamp,
updated_at datetime not null default current_timestamp on update current_timestamp,
// 审计字段(可选)
created_by varchar(50) not null default 'system',
updated_by varchar(50) not null default 'system'
);
需要创建Java对象与之一一映射:
@Data
@TableName("tbl_user")
public class User extends BaseEntity {
// 自增
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String email;
}
将审计字段抽离出来作为父类:
@Data
public class BaseEntity {
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createdBy;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt;
/** 更新人 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
/** 更新时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
/** 逻辑删除(0 未删 1 已删) */
@TableLogic
private Boolean isDeleted;
}
创建Mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
这里注意是接口,有两种方式注入bean:
1、每个Mapper接口都使用注解 @Mapper。
2、统一在主类上添加 MapperScan 注解。
使用
@Slf4j
@RestController
@RequestMapping("/api/hello")
@Validated
@RequiredArgsConstructor
public class HelloController {
private final UserMapper userMapper;
@GetMapping
public List<User> hello() {
List<User> users = userMapper.selectList(null);
return users;
}
}
分页
想要使用分页功能,还需要引入欸外依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
<version>3.5.12</version> <!-- 与你使用的 MyBatis-Plus 主版本一致 -->
</dependency>
并且需要添加欸外配置:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
然后直接调用 selectPage 即可:
@GetMapping("/page")
public Page<User> hello2() {
Page<User> userPage = userMapper.selectPage(new Page<>(1, 10), null);
return userPage;
}
审计
前面实例中演示的审计字段其实还没有完全结束,还需要定义这些字段的填充规则,需要增加如下的配置:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createdBy", String.class, getCurrentUser());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updatedBy", String.class, getCurrentUser());
}
private String getCurrentUser() {
// 从 Spring Security、ThreadLocal、JWT 等获取当前登录用户ID
return "system"; // 示例值
}
}
然后新增或者修改字段的时候,会自动更改数据库里面的值,不需要手动设置。
更多
待补充