MyBatisPlus的使用最全实例详解
作者:Leo_lc—lc
MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,内置通用Mapper、Service及条件构造器,支持动态SQL、分页查询与注解配置,适用于单表操作,复杂SQL可手动编写,减少样板代码,优化开发体验
一、MyBatis-Plus 是什么?
- 定位:MyBatis 的增强工具,简化开发,提高效率。
- 特点:内置通用 Mapper、通用 Service、条件构造器、分页插件等,无需编写繁琐的 XML。
- 核心思想:通过少量配置实现单表 CRUD 操作,复杂 SQL 仍可手写。
二、快速开始(Spring Boot 环境)
1. 添加依赖
在 pom.xml
中引入:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本(如3.5.3)</version> </dependency> <!-- 数据库驱动(如MySQL) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency>
2. 配置数据库
在 application.yml
中:
spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
3. 创建实体类
@Data // Lombok 注解,自动生成 getter/setter @TableName("user") // 对应数据库表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; private String email; }
4. 创建 Mapper 接口
public interface UserMapper extends BaseMapper<User> { // 无需写 XML,直接继承 BaseMapper 即具备 CRUD 方法 }
5. 在启动类添加注解
@SpringBootApplication @MapperScan("com.example.mapper") // 扫描 Mapper 接口所在包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
三、基本 CRUD 操作
1. 插入数据
User user = new User(); user.setName("张三"); user.setAge(25); user.setEmail("zhangsan@example.com"); userMapper.insert(user); // 插入后自动回填主键
2. 查询操作
// 根据 ID 查询 User user = userMapper.selectById(1L); // 条件查询(查询 name=张三且 age=25 的用户) QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "张三").eq("age", 25); List<User> users = userMapper.selectList(queryWrapper);
3. 更新操作
User user = new User(); user.setId(1L); user.setAge(30); userMapper.updateById(user); // 根据 ID 更新
4. 删除操作
userMapper.deleteById(1L); // 根据 ID 删除 // 条件删除 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", 25); userMapper.delete(wrapper);
四、条件构造器(Wrapper)
1.QueryWrapper详解
(1)基本用法
QueryWrapper<User> wrapper = new QueryWrapper<>();
(2)常用条件方法
a. 等值条件
wrapper.eq("name", "张三") // name = '张三' .ne("age", 20) // age != 20 .isNotNull("email"); // email IS NOT NULL
b. 范围条件
wrapper.gt("age", 18) // age > 18 .ge("age", 20) // age >= 20 .lt("age", 30) // age < 30 .le("age", 25) // age <= 25 .between("age", 20, 30) // age BETWEEN 20 AND 30 .notBetween("age", 20, 30); // age NOT BETWEEN 20 AND 30
c. 模糊查询
wrapper.like("name", "张") // name LIKE '%张%' .likeLeft("name", "三") // name LIKE '%三' .likeRight("name", "张") // name LIKE '张%' .notLike("name", "李"); // name NOT LIKE '%李%'
d. 逻辑条件
wrapper.and(w -> w.eq("name", "张三").gt("age", 20)) // AND (name = '张三' AND age > 20) .or(w -> w.eq("name", "李四").lt("age", 30)); // OR (name = '李四' OR age < 30)
e. 排序与分组
wrapper.orderByAsc("age") // ORDER BY age ASC .orderByDesc("id") // ORDER BY id DESC .groupBy("department"); // GROUP BY department
f. 指定返回字段
wrapper.select("id", "name", "age"); // SELECT id, name, age
g. 子查询
wrapper.inSql("id", "SELECT id FROM user WHERE age > 18") // id IN (SELECT id ...) .notInSql("id", "SELECT id FROM user WHERE age < 10");
(3)动态条件拼接
根据业务逻辑动态添加条件:
QueryWrapper<User> wrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(name)) { wrapper.like("name", name); } if (age != null) { wrapper.gt("age", age); } List<User> users = userMapper.selectList(wrapper);
2.LambdaQueryWrapper详解
(1)为什么用Lambda
- 优势:避免字段名硬编码,编译时检查,重构友好。
- 语法:通过
User::getXxx
引用字段。
(2)基本用法
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
(3)常用方法
lambdaWrapper.eq(User::getName, "张三") .gt(User::getAge, 20) .between(User::getAge, 20, 30) .like(User::getName, "张") .orderByAsc(User::getAge);
(4)动态条件示例
lambdaWrapper .eq(name != null, User::getName, name) // 仅当 name 不为空时生效 .gt(age != null, User::getAge, age);
3.复杂条件组合
(1)嵌套条件
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.and(w -> w.eq("name", "张三").or().eq("name", "李四")) .and(w -> w.gt("age", 20).lt("age", 30));
生成的SQL:
WHERE (name = '张三' OR name = '李四') AND (age > 20 AND age < 30)
(2)多OR条件
wrapper.or(w -> w.eq("name", "张三").eq("name", "李四"));
生成的SQL:
WHERE name = '张三' OR name = '李四'
4.条件构造器的链式调用优化
(1)直接链式挑战
List<User> users = userMapper.selectList( new QueryWrapper<User>() .eq("name", "张三") .gt("age", 20) .orderByDesc("id") );
(2)复用 Wrapper 对象
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); // 根据不同场景追加条件 if (isAdmin) { wrapper.eq("is_admin", 1); } else { wrapper.eq("department", "IT"); }
5.条件构造器的实际应用场景
(1)动态搜索功能
public List<User> searchUsers(String keyword, Integer minAge, Integer maxAge) { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(keyword), User::getName, keyword) .or() .like(StringUtils.isNotBlank(keyword), User::getEmail, keyword) .ge(minAge != null, User::getAge, minAge) .le(maxAge != null, User::getAge, maxAge); return userMapper.selectList(wrapper); }
(2)多表联查中的条件传递
// 假设联查用户表和订单表 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.inSql("id", "SELECT user_id FROM order WHERE amount > 1000"); List<User> users = userMapper.selectList(wrapper);
6.总结表格
方法名 | 作用 | 示例 |
---|---|---|
eq() / ne() | 等于 / 不等于 | eq("name", "张三") |
gt() / lt() | 大于 / 小于 | gt("age", 20) |
between() | 范围查询 | between("age", 20, 30) |
like() / notLike() | 模糊查询 | like("name", "张") |
and() / or() | 逻辑与 / 或 | and(w -> w.eq(...)) |
orderByAsc() | 升序排序 | orderByAsc("age") |
select() | 指定返回字段 | select("id", "name") |
inSql() | 子查询 | inSql("id", "SELECT id FROM ...") |
五、分页查询
1. 配置分页插件
@Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
2. 使用分页
// 第 2 页,每页 5 条 Page<User> page = new Page<>(2, 5); QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.gt("age", 20); Page<User> result = userMapper.selectPage(page, wrapper); // 获取结果 List<User> users = result.getRecords(); long total = result.getTotal();
六、常用注解
1.@TableName
- 指定实体类对应的表名。
- 示例:
@TableName("sys_user")
2.@TableId
- 标记主键字段。
- 可选主键策略:
IdType.AUTO
:数据库自增IdType.ASSIGN_ID
:雪花算法生成 ID(默认)
3.@TableField
- 解决字段名与数据库列名不一致问题。
- 示例:
@TableField("nick_name")
七、总结
- 优点:减少样板代码,提高开发效率。
- 适用场景:单表操作、简单查询。
- 复杂 SQL:仍可通过 XML 或注解方式编写。
到此这篇关于MyBatisPlus的使用的文章就介绍到这了,更多相关MyBatisPlus使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!