基于MyBatis的增强工具,简化开发,提高效率

1. 快速入门

1.1 入门案例

MyBatisPlus是基于MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

​实现步骤​​:

  1. 引入MyBatisPlus的起步依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
  1. 定义Mapper接口继承BaseMapper:

public interface UserMapper extends BaseMapper<User> {}
  1. 直接使用Mapper实现CRUD:

// 新增用户
userMapper.insert(user);

// 根据id查询用户
User user = userMapper.selectById(1L);

// 根据id批量查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));

// 根据id更新
userMapper.updateById(user);

// 根据id删除
userMapper.deleteById(1L);

1.2 常见注解

MyBatisPlus通过扫描实体类获取数据库表信息,常用注解:

注解

说明

@TableName

指定表名

@TableId

指定主键字段

@TableField

指定普通字段

@TableName("tb_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    @TableField("username")
    private String name;
    
    @TableField("is_married")
    private Boolean isMarried;
    
    @TableField("`order`")
    private Integer order;
    
    @TableField(exist = false)
    private String address;
}

​IdType枚举值​​:

  • AUTO:数据库自增

  • INPUT:手动输入

  • ASSIGN_ID:雪花算法生成

1.3 常见配置

application.yml中添加配置:

mybatis-plus:
  type-aliases-package: com.example.domain
  mapper-locations: classpath*:/mapper/**/*.xml
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
  global-config:
    db-config:
      id-type: assign_id
      update-strategy: not_null

2. 核心功能

2.1 条件构造器

构建复杂查询条件:

// 查询名字含'o'且余额≥1000的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "username", "info", "balance")
      .like("username", "o")
      .ge("balance", 1000);
List<User> users = userMapper.selectList(wrapper);

// 更新用户名Jack的余额
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("username", "jack")
             .set("balance", 2000);
userMapper.update(null, updateWrapper);

2.2 自定义SQL

构建复杂WHERE条件,自定义SQL剩余部分:

// Mapper接口
@Update("UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}")
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, 
                        @Param("amount") int amount);

// 调用
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class)
        .in(User::getId, Arrays.asList(1L, 2L, 4L));
userMapper.updateBalanceByIds(wrapper, 200);

2.3 Service接口

服务层增强接口:

// 自定义接口
public interface IUserService extends IService<User> {
    List<User> listByName(String name);
}

// 实现类
@Service
public class UserServiceImpl 
        extends ServiceImpl<UserMapper, User>
        implements IUserService {
    
    @Override
    public List<User> listByName(String name) {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.like(User::getUsername, name);
        return list(wrapper);
    }
}

​批量插入性能对比​​:

  • 普通for循环:约120秒

  • MP的saveBatch:约15秒

  • JDBC批处理:约2秒

3. 扩展功能

3.1 代码生成

自动生成实体、Mapper、Service等代码:

FastAutoGenerator.create(url, username, password)
    .globalConfig(builder -> 
        builder.author("author").outputDir("src/main/java"))
    .packageConfig(builder -> 
        builder.parent("com.example"))
    .strategyConfig(builder -> 
        builder.addInclude("user", "address"))
    .execute();

3.2 静态工具

使用Db静态工具类:

// 根据ID查询用户及其地址
User user = Db.getById(1L, User.class);
List<Address> addresses = Db.lambdaQuery(Address.class)
        .eq(Address::getUserId, user.getId())
        .list();

3.3 逻辑删除

配置逻辑删除:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

3.4 枚举处理器

处理枚举类型:

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结");
    
    @EnumValue
    private final int value;
    private final String desc;
    
    // 构造方法
}

3.5 JSON处理器

处理JSON类型字段:

@TableName(value = "user", autoResultMap = true)
public class User {
    private Long id;
    private String username;
    
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
}

@Data
public class UserInfo {
    private Integer age;
    private String intro;
    private String gender;
}

3.6 配置加密

加密敏感配置信息:

// 生成密钥
String key = AES.generateRandomKey();

// 加密配置
String encryptedUsername = AES.encrypt("root", key);
String encryptedPassword = AES.encrypt("password", key);

配置文件中使用加密值:

spring:
  datasource:
    username: mpw:${encryptedUsername}
    password: mpw:${encryptedPassword}

启动时添加密钥:

java -jar app.jar --mpw.key=your_key_here

4. 插件功能

4.1 分页插件

配置分页插件:

@Configuration
public class MybatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pageInterceptor = 
            new PaginationInnerInterceptor(DbType.MYSQL);
        pageInterceptor.setMaxLimit(1000L);
        interceptor.addInnerInterceptor(pageInterceptor);
        return interceptor;
    }
}

使用分页查询:

Page<User> page = Page.of(1, 10);
page.addOrder(new OrderItem("balance", false));
Page<User> p = userService.page(page);

4.2 通用分页实体

实现通用分页参数和结果:

@Data
public class PageQuery {
    private Integer pageNo;
    private Integer pageSize;
    private String sortBy;
    private Boolean isAsc;
    
    public <T> Page<T> toMpPage() {
        Page<T> page = Page.of(pageNo, pageSize);
        if (sortBy != null) {
            page.addOrder(new OrderItem(sortBy, isAsc));
        }
        return page;
    }
}

@Data
public class PageDTO<T> {
    private Long total;
    private Long pages;
    private List<T> list;
    
    public static <T> PageDTO<T> of(Page<T> page) {
        PageDTO<T> dto = new PageDTO<>();
        dto.setTotal(page.getTotal());
        dto.setPages(page.getPages());
        dto.setList(page.getRecords());
        return dto;
    }
}

通过本文,您已经全面了解了MyBatisPlus的核心功能和高级用法。无论是快速开发简单CRUD,还是处理复杂业务场景,MyBatisPlus都能提供优雅的解决方案,显著提升开发效率。