1. 引入pom依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
2. 修改配置文件
application.properties:
# 服务端口
server.port=8001
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
application.yml:
# 服务端口
server:
port: 8001
# mysql数据库连接
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
username: root
password: 123456
3. 配置自动生成代码
3.1 引入pom依赖
<!--mybatis-plus自动代码生成插件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!-- freemarker 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
模板引擎两者选其一即可,这里选择的是freemarker
3.2 编写CodeGenerator类
public class CodeGenerator {
@Test
public void run() {
// 数据库连接url
String url = "jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8";
// 数据库用户名和密码
String username = "root";
String password = "123456";
// 代码生成模块地址
String moudlePath = System.getProperty("user.dir") + "/src/main/java";
// xml文件生成地址
String xmlPath = System.getProperty("user.dir") + "/src/main/resources/mapper";
// 需要生成的数据表
String[] tableArr = new String[]{
"user_info",
"comment"
};
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author("RedStar") // 设置作者
.enableSwagger() // 开启 swagger 模式
.disableOpenDir()
.dateType(DateType.ONLY_DATE)
.fileOverride() // 覆盖已生成文件
.outputDir(moudlePath); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.xbdemo.demo") // 设置模块名
.mapper("dao") // 设置mapper包名
.pathInfo(Collections.singletonMap(OutputFile.xml, xmlPath)); // 设置xml文件生成目录
})
.strategyConfig(builder -> {
builder.addInclude(tableArr) // 设置需要生成的表名
.addTablePrefix("t_", "c_") // 设置过滤表前缀
.entityBuilder()
.enableLombok()
.serviceBuilder()
.formatServiceFileName("%sService"); // //去掉Service接口的首字母I
})
.templateConfig(builder -> {
builder.disable(TemplateType.CONTROLLER); // 设置禁止生成controller
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
注:
- CodeGenerator.class代码所在文件目录没有特殊要求
- 适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!3.5.1 以下的请参考 代码生成器旧
- 代码生成器详细配置参考:代码生成器配置新
4. 自动填充配置与使用
4.1 配置:
在handler包下新建自动填充handler类
/**
* @author RedStar
* @date 2022/05/11 14:33
* @description mybatis-plus数据插入监听器,可自动插入默认值
* 将需要此功能的属性加上注解@TableField(fill = FieldFill.INSERT/INSERT_UPDATE)
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler{
@Override
public void insertFill(MetaObject metaObject) {
// 执行插入操作时执行该逻辑
// 实体类属性名称和要自动填充的值
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
// 执行更新操作时执行该逻辑
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
entity包下的实体类进行相应处理
@Data
@TableName("user_info")
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private String password;
private Boolean isDeleted;
private Integer version;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}
4.2 使用演示
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
@Override
public Integer addUser() {
UserInfo userInfo = new UserInfo();
userInfo.setName("zhangsan");
userInfo.setPassword("000000");
// service调用自己实体类对应的dao层可直接使用this.baseMapper.xxx
return this.baseMapper.insert(userInfo);
}
}
5. 逻辑删除
5.1 配置
- 数据表中添加字段is_deleted用于标记记录是否已删除
- 实体类中对相应属性加上@TableLogic注解
- 在MyMetaObjectHandler中设置自动填充
@TableLogic
private Boolean isDeleted;
// 设置逻辑删除字段为0
this.setFieldValByName("is_deleted", 0, metaObject);
5.2 使用
使用方式不变,无感知实现逻辑删除。
注: 只对自动注入的 sql 起效:
- 插入: 不作限制
- 查找: 追加 where 条件过滤掉已删除数据,且使用 wrapper.entity 生成的 where条件会忽略该字段
- 更新: 追加 where 条件防止更新到已删除数据,且使用 wrapper.entity 生成的 where条件会忽略该字段
- 删除: 转变为 更新
例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
6. 分页与乐观锁插件
6.1 配置插件
在config包下新建MybatisConfig.class
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 配置乐观锁插件
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 配置分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
6.2 乐观锁
- 数据表中添加字段version用于标记该记录的版本号
- 实体类中对相应属性加上@Version注解
多线程操作数据时会实现乐观锁功能
6.3 分页
- 查询数据时新建Page对象
- 传入当前页和记录数
- 进行分页查询
@Override
public List<UserInfo> getUserPage(Integer current, Integer size) {
// 创建page对象, 参数为第几页和记录数
Page<UserInfo> pageObj = new Page<>(current, size);
// 按照分页查询
this.page(pageObj);
// 返回查询出来的数据
return pageObj.getRecords();
}
此外Page对象还有几个属性
records: 用来存放查询出来的数据
total:返回记录的总数
size: 每页显示条数,默认 10
current: 当前页,默认1
orders: 排序字段信息
7. 配置打印mybatis日志
application.properties:
# mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
application.yml:
# mybatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
相关文章
暂无评论...