2. 修改配置文件 application.properties:com.baomidou mybatis-plus-boot-starter 3.4.1 mysql mysql-connector-java junit junit
# 服务端口 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=123456application.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依赖
com.baomidou mybatis-plus-generator 3.4.1 org.apache.velocity velocity-engine-core 2.3 org.freemarker freemarker 2.3.31
模板引擎两者选其一即可,这里选择的是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 以下的请参考 代码生成器旧
- 代码生成器详细配置参考:代码生成器配置新
在handler包下新建自动填充handler类
@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 ServiceImpl5. 逻辑删除 5.1 配置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); } }
- 数据表中添加字段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 ListgetUserPage(Integer current, Integer size) { // 创建page对象, 参数为第几页和记录数 Page pageObj = new Page<>(current, size); // 按照分页查询 this.page(pageObj); // 返回查询出来的数据 return pageObj.getRecords(); }
此外Page对象还有几个属性
7. 配置打印mybatis日志 application.properties:records: 用来存放查询出来的数据
total:返回记录的总数
size: 每页显示条数,默认 10
current: 当前页,默认1
orders: 排序字段信息
# mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImplapplication.yml:
# mybatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl



