第一篇:初识MyBatis-Plus
什么是MyBatis-Plus?
MyBatis-Plus(简称MP)是MyBatis的增强工具,在MyBatis基础上只做增强不做改变,简化开发、提高效率。
为什么选择MyBatis-Plus?
- 🚀 简化开发:内置通用CRUD操作,减少30%以上代码量
- ⚡ 功能丰富:代码生成器、分页插件、性能分析插件等
- 🔥 无缝兼容:完全兼容原生MyBatis,学习成本低
- 📈 社区活跃:GitHub 20k+ Star,持续更新维护
第一篇:快速开始
- 添加依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
- 配置数据源:
server:
port: 8080
spring:
application:
name: demo
datasource:
url: jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: xxx
password: xxx
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
type-aliases-package: com.it.domain
global-config:
db-config:
id-type: auto
logging:
level:
root: info
com.it: debug
pattern:
dateformat: "yyyy-MM-dd HH:mm:ss.SSS"
第二篇:基础CRUD操作
实体类配置
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField("email")
private String mail;
}
Mapper接口
public interface UserMapper extends BaseMapper<User> {
}
基础操作示例
| 操作 | 代码示例 |
|---|
| 插入 | userMapper.insert(user) |
| 删除 | userMapper.deleteById(1L) |
| 修改 | userMapper.updateById(user) |
| 查询 | userMapper.selectById(1L) |
| 列表 | userMapper.selectList(queryWrapper) |
第三篇:条件构造器
Wrapper使用场景
构建复杂查询条件,替代原生MyBatis的动态SQL
查询常用方法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三")
.between("age", 20, 30);
wrapper.like("name", "张");
wrapper.orderByDesc("create_time");
wrapper.and(w -> w.gt("age", 18).or().isNotNull("email"));
Lambda写法(推荐)
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.eq(User::getName, "张三")
.lt(User::getAge, 30);
更新常用方法
// 示例:将年龄大于 30 的用户名字改为 "管理员"
UpdateWrapper<User> wrapper = new UpdateWrapper<>()
wrapper.gt("age", 30)
User updateUser = new User()
updateUser.setName("管理员")
userMapper.update(updateUser, wrapper)
Lambda写法(推荐)
// 示例:将名字包含 "张" 且年龄小于 20 的用户状态改为 0
userMapper.lambdaUpdate()
.set(User::getStatus, 0) // 更新字段
.like(User::getName, "张") // 条件:name LIKE '%张%'
.lt(User::getAge, 20) // 条件:age < 20
.update();
第四篇:进阶功能
分页查询
- 添加分页插件:
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
- 使用分页:
Page<User> page = new Page<>(1, 10)
userMapper.selectPage(page, queryWrapper)
自动填充
- 标记填充字段:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime
- 实现填充处理器:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
}
}
第五篇:代码生成器
一键生成全套代码
FastAutoGenerator.create(dataSourceConfig)
.globalConfig(builder -> builder.author("作者"))
.packageConfig(builder -> builder.parent("com.example"))
.strategyConfig(builder -> builder.addInclude("user", "order"))
.templateConfig(builder -> builder.disable(TemplateType.CONTROLLER))
.execute();
生成内容包含:
- 实体类(PO)
- Mapper接口
- XML映射文件
- Service接口及实现
- Controller(可选)
第六篇:最佳实践
1. 统一返回结果
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public Result<User> getById(@PathVariable Long id) {
return Result.success(userService.getById(id));
}
}
2. 逻辑删除配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
3. 性能优化建议
- 避免使用
select *,明确指定查询字段
- 大数据量查询使用分页
- 复杂查询考虑使用原生XML
附带:常用注解说明
1. @TableName 注解(表名映射)
| 属性 | 类型 | 默认值 | 说明 | 常用性 |
|---|
value | String | "" | 指定数据库表名(优先级最高) | ⭐⭐⭐⭐⭐ |
schema | String | "" | 数据库 schema(如 PostgreSQL) | ⭐⭐ |
keepGlobalPrefix | boolean | false | 是否保持全局表前缀配置 | ⭐ |
resultMap | String | "" | 自定义结果映射 ID(XML 中定义) | ⭐ |
autoResultMap | boolean | false | 是否自动生成 resultMap | ⭐⭐ |
2. @TableField 注解(字段映射)
常用属性
| 属性 | 类型 | 默认值 | 说明 | 常用性 |
|---|
value | String | "" | 指定数据库字段名(优先级最高) | ⭐⭐⭐⭐⭐ |
exist | boolean | true | 是否为数据库字段(false 表示非表字段) | ⭐⭐⭐⭐ |
fill | Enum | FieldFill.DEFAULT | 字段自动填充策略(如 INSERT、UPDATE) | ⭐⭐⭐⭐ |
select | boolean | true | 是否参与查询(false 表示不查询) | ⭐⭐⭐ |
condition | String | "" | 字段的 WHERE 条件(如 age > 18) | ⭐⭐ |
不常用属性
| 属性 | 类型 | 默认值 | 说明 | 常用性 |
|---|
jdbcType | JdbcType | JdbcType.UNDEFINED | 指定 JDBC 类型(如 VARCHAR) | ⭐ |
numericScale | String | "" | 数字类型的小数位数(如 2) | ⭐ |
el | String | "" | SpEL 表达式(动态计算值) | ⭐ |
keepGlobalFormat | boolean | false | 是否保持全局字段格式配置 | ⭐ |
typeHandler | Class | UnknownTypeHandler.class | 自定义类型处理器 | ⭐⭐ |
使用示例
@TableName 示例
@TableName(value = "t_user", schema = "public", autoResultMap = true)
public class User {
}
@TableField 示例
public class User {
@TableField(value = "user_name", fill = FieldFill.INSERT)
private String name;
@TableField(exist = false)
private String nonDbField;
@TableField(condition = "age > 18")
private Integer age;
}
总结
| 分类 | 核心作用 | 高频使用属性 |
|---|
| 常用 | 基础字段映射、自动填充、逻辑控制 | value, exist, fill, select |
| 不常用 | 特殊场景定制化 | jdbcType, el, numericScale |
📌 总结:MyBatis-Plus让MyBatis开发效率提升50%,本文涵盖90%日常使用场景,收藏备用!一文读懂系统持续更新!