springboot集成mybatis-plus及常用功能配置

2年前 (2022) 程序员胖胖胖虎阿
274 0 0

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);
    }
}

springboot集成mybatis-plus及常用功能配置

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注解
    springboot集成mybatis-plus及常用功能配置

多线程操作数据时会实现乐观锁功能

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

版权声明:程序员胖胖胖虎阿 发表于 2022年11月1日 下午3:00。
转载请注明:springboot集成mybatis-plus及常用功能配置 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...