泽兴芝士网

一站式 IT 编程学习资源平台

MyBatis-Plus 日常使用指南(mybatis-plus crud)

MyBatis-Plus 日常使用指南

MyBatis-Plus (简称 MP) 是在 MyBatis 基础上的增强工具,只做增强,不做改变,极大简化了 CRUD 开发,让数据访问层代码更简洁。


一、快速开始

1. 添加依赖

Maven

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

建议锁定版本,避免升级导致的行为变更。


2. 基本配置(application.yml)

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL日志输出
  global-config:
    db-config:
      id-type: auto                  # 主键策略: 自增
      logic-delete-field: deleted    # 逻辑删除字段名
      logic-delete-value: 1          # 删除时的值
      logic-not-delete-value: 0      # 未删除时的值

二、核心功能

1. 基本 CRUD

@Autowired
private UserMapper userMapper;

// 插入
User user = new User();
user.setName("张三").setAge(20);
userMapper.insert(user);

// 查询
User u = userMapper.selectById(1L);

// 更新
u.setName("李四");
userMapper.updateById(u);

// 删除
userMapper.deleteById(1L);

// 查询所有
List<User> users = userMapper.selectList(null);

2. 条件构造器

QueryWrapper 写法

QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name", "张三")
  .gt("age", 18)
  .orderByDesc("create_time");

List<User> users = userMapper.selectList(qw);

LambdaQueryWrapper(推荐)

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.eq(User::getName, "张三")
   .gt(User::getAge, 18)
   .orderByDesc(User::getCreateTime);

List<User> users = userMapper.selectList(lqw);

Lambda 写法避免手写列名,字段重构更安全。


3. 分页插件

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分页查询

Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>()
        .gt(User::getAge, 20);

IPage<User> result = userMapper.selectPage(page, lqw);
System.out.println("总页数: " + result.getPages());
System.out.println("总记录数: " + result.getTotal());

三、高级功能

1. 自动填充

@Data
public class User {
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

2. 逻辑删除

@TableLogic
private Integer deleted;

3. 乐观锁

@Version
private Integer version;

@Bean
public MybatisPlusInterceptor mpInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}

4. 代码生成器

FastAutoGenerator.create("jdbc:mysql://localhost:3306/db", "root", "password")
    .globalConfig(builder -> builder.author("ring")
        .outputDir(System.getProperty("user.dir") + "/src/main/java")
        .enableSwagger()
        .fileOverride())
    .packageConfig(builder -> builder.parent("com.example.mp")
        .moduleName("system")
        .pathInfo(Collections.singletonMap(OutputFile.xml, 
                  System.getProperty("user.dir") + "/src/main/resources/mapper")))
    .strategyConfig(builder -> builder.addInclude("user")
        .addTablePrefix("t_"))
    .execute();

四、常见问题

  1. 字段名与数据库不一致
@TableField("db_column_name")
private String entityField;
  1. 排除非数据库字段
@TableField(exist = false)
private String tempData;
  1. 复杂 SQL
  • 使用 XML Mapper
  • 或注解 @Select、@Update 等
  • 多表 JOIN 建议写在 XML 中
  • 自定义sql
// Mapper接口中定义方法
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersOlderThan(@Param("age") Integer age);

// XML方式
// 在resources/mapper/UserMapper.xml中编写SQL

五、最佳实践建议

  • 简单 CRUD 用 MP 自带方法
  • 复杂查询 用 Wrapper + 自定义 SQL
  • 字段安全 用 Lambda 表达式
  • 插件优先 使用 MP 官方提供(分页、乐观锁、逻辑删除)
  • 定期升级版本,关注 release notes

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言