一、MyBatis-Plus 是什么?
一句话:MyBatis 的“超强外挂”,让数据库操作更简单!
- 核心功能:自动生成基本 CRUD 代码,避免手写重复 SQL。
- 优势:开发效率提升 50%,代码更简洁。
- 特色:
- 自动分页
- 注解配置表字段映射
- 智能化条件构造器
- 支持主流数据库(MySQL、PostgreSQL 等)
二、快速上手:5 分钟实现增删改查
1. 添加依赖
<!-- Spring Boot -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
2. 配置数据源(application.yml)
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 SQL 日志
3. 编写实体类和 Mapper
@Data
@TableName("user_info") // 实体类对应表名
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String name;
private Integer age;
@TableField("email") // 字段名映射(解决驼峰与下划线问题)
private String email;
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后,自动获得 CRUD 方法
}
4. 使用 MyBatis-Plus 的 CRUD
@SpringBootTest
public class UserTest {
@Autowired
private UserMapper userMapper;
// 新增
@Test
void testInsert() {
User user = new User();
user.setName("Alice");
user.setAge(25);
user.setEmail("alice@example.com");
userMapper.insert(user); // 自动生成 INSERT 语句
}
// 查询
@Test
void testSelect() {
User user = userMapper.selectById(1L); // SELECT * FROM user WHERE id=1
List<User> users = userMapper.selectList(null); // 查询所有
}
// 分页查询
@Test
void testPage() {
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
userMapper.selectPage(page, null); // 分页自动处理
}
// 更新
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setAge(30);
userMapper.updateById(user); // UPDATE user SET age=30 WHERE id=1
}
}
三、高级功能:注解与条件构造器
1. 常用注解
- @TableName:指定表名(默认自动匹配)
- @TableField:字段映射(解决属性名与字段名差异)
- @TableId:标记主键,支持策略(如自增、UUID)
2. 条件构造器:动态构建 SQL
QueryWrapper(手动指定字段名):
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20) // WHERE age > 20
.like("name", "张") // AND name LIKE '%张%'
.orderByDesc("create_time");
List<User> users = userMapper.selectList(wrapper);
LambdaQueryWrapper(避免字段硬编码):
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.gt(User::getAge, 20)
.like(User::getName, "李")
.orderByDesc(User::getCreateTime);
List<User> users = userMapper.selectList(lambdaWrapper);
3. 更新操作的构造器
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 1)
.set("age", 30)
.set("email", "new@email.com");
userMapper.update(null, updateWrapper); // UPDATE user SET age=30, email='..' WHERE id=1
四、自定义 SQL:复杂场景的解决方案
1. 注解方式
@Select("SELECT * FROM user ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
// 使用示例:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, 18);
List<User> users = userMapper.selectAll(wrapper);
2. XML 方式
<!-- UserMapper.xml -->
<select id="selectByCustom" resultType="User">
SELECT id, name FROM user ${ew.customSqlSegment}
</select>
五、核心重点总结
- 快速开发:继承
BaseMapper
,自动获得 CRUD 方法,无需手动写 XML。 - 条件构造器:
- QueryWrapper:适合简单条件,但字段名需写死。
- LambdaQueryWrapper:通过 Lambda 表达式引用属性,避免字段名错误。
- 注解灵活映射:处理表名和字段名不一致问题。
- 自定义 SQL:结合条件构造器,处理复杂查询或更新。
六、避坑指南
- 字段映射出错时:检查
@TableField
的值是否正确。 - 分页失效:确保添加分页拦截器。
- 自定义 SQL 参数:必须用
ew
或@Param(Constants.WRAPPER)