基于MyBatis的增强工具,简化开发,提高效率
1. 快速入门
1.1 入门案例
MyBatisPlus是基于MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。
实现步骤:
引入MyBatisPlus的起步依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
定义Mapper接口继承BaseMapper:
public interface UserMapper extends BaseMapper<User> {}
直接使用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("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都能提供优雅的解决方案,显著提升开发效率。
评论