【MyBatis-Plus】SpringBoot整合MyBatis-Plus增删查改 SQL日志配置 代码生成器 条件查询 分页查询

本文为SpringBoot整合MyBatis-Plus的基本增删查改,条件查询,分页查询,SQL日志配置及代码生成器相关的开发笔记

官方文档

快速开始 | MyBatis-Plus (baomidou.com)

Maven依赖

  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
  </dependency>

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    //自动生成id,雪花算法
    @TableId(type = IdType.ASSIGN_ID)
    private Integer id;

    private String name;
    private String password;
    
    //乐观锁
    @Version
    private Integer version;

    //创建时间,在插入时自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;

    //更新时间,在插入与更新时自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;
    
    //逻辑删除
    @TableLogic
    private Integer deleted;
}

Mapper类

//继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}

Config配置类

@Configuration
public class MybatisConfiguration {

    //注册插件主体到IOC容器
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //添加乐观锁拦截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

}

用于处理自动填充的handler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 配置@TableField(fill = FieldFill.INSERT)注解,插入时填充
    @Override
    public void insertFill(MetaObject metaObject) {
        
        // MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        //fieldName方法名,fieldVal填充值
        this.setFieldValByName("gmtCreate",new Date(),metaObject);
        this.setFieldValByName("gmtModified",new Date(),metaObject);
    }

    // 配置  @TableField(fill = FieldFill.INSERT_UPDATE)注解,插入与更新时填充
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("gmtModified",new Date(),metaObject);
    }
}

application.yml配置文件

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启日志
  global-config:
    db-config:
      logic-delete-value: 1     #逻辑删除值
      logic-not-delete-value: 0 #未被逻辑删除值

CRUD测试

查询

    @Autowired
    private UserMapper userMapper;
   

    @Test
    public void selectTest() {
        
        //遍历全表,参数为QueryWrapper,这里不需要暂时填写null
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

插入

    @Test
    public void insertTest() {
        User user = new User();
      
        user.setName("test");
        user.setPassword("123456");

        //这里id使用了自动填充
        userMapper.insert(user);
    }

查看结果:

 可以看到Version已经设为默认值1,自动填充的日期也成功实现

更新

 @Test
    public void updateTest() {
        
        //根据id查询user对象
        User user = userMapper.selectById(1);
        user.setName("test1");
        
        //更新
        userMapper.updateById(user);
    }

删除

 @Test
    public void deleteTest() {

        //将要删除的信息放到map里
        Map<String, Object> userHashMap = new HashMap<>();
        userHashMap.put("id", 1);
        userMapper.deleteByMap(userHashMap);
    }

条件查询

  @Test
    public void wrapperTest(){
        
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        
        //配置wrapper条件,详细的条件函数在官方文档中有
        wrapper.isNotNull("id")
                .eq("id",1);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

分页查询

在配置类中加上

@Configuration
public class MybatisConfiguration {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        
        //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }

}
 @Test
    public void pageTest(){
        
        // public Page(long current, long size)
        //current当前页,size每页的大小
        Page<User> userPage = new Page<>(1,3);
        userPage = userMapper.selectPage(userPage, null);
        userPage.getRecords().forEach(System.out::println);
       
    }

SQL分析打印

依赖

    <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.9.1</version>
    </dependency>

application.yml

将数据库驱动设为com.p6spy.engine.spy.P6SpyDriver

url前缀改为jdbc:p6spy:mysql:

driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/...

建立spy.properties配置

modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger

# 设置 p6spy driver 代理
deregisterdrivers=true

# 取消JDBC URL前缀
useprefix=true

# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss

# 是否开启慢SQL记录
outagedetection=true

# 慢SQL记录标准
outagedetectioninterval=1

效果如下:

代码生成器

Swagger和freemarker依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>       

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

新建测试类

public class CodeGenerate {
    @Test
    public void generateCode(){
        FastAutoGenerator.create("jdbc:p6spy:mysql://localhost:3306/...",
                        "数据库账户", "密码")
                .globalConfig(builder -> {
                    builder.author("test") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(System.getProperty("user.dir")+"/src/main/java"); 
                // 指定输出目录为工程目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.test") // 设置父包名
                            .moduleName("module01") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 设置需要生成的表名,可为多个
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }
}

生成完毕后,运行时swagger如出现 Failed to start bean 'documentationPluginsBootstrapper'; 错误

在配置文件中加上

Spring.mvc.pathmatch.matching-strategy=ant_path_matcher

猜你喜欢

转载自blog.csdn.net/yscjhghngh/article/details/122962831