MyBatisPlus
MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatisPlus的官方网址: MyBatis-Plus 🚀 为简化开发而生
快速入门
导入起步依赖
首先创建一个boot项目,导入MyBatisPlus依赖:
SpringBoot 2:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.11</version> </dependency>
SpringBoot 3:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.11</version> </dependency>
注意:导入MyBatisPlus依赖后不要导入其他MyBatis的依赖,因为MyBatisPlus的依赖中包含了mybatis的依赖,避免版本冲突导致的报错。
顺便再启用一下lombok:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
编写yml配置文件
spring:
datasource:
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
url: jdbc:mysql://localhost:3306/ssm_pro?serverTimezone=Asia/Shanghai
编写实体类
MyBatisPlus提供了几个注解用于解决表和实体类对应的问题:
注解 | 说明 |
---|---|
@TableName | 用于指定该类对应的表名 |
@TableId | 用于指定表中的主键字段信息 |
@TableField | 指定表中普通字段的信息 |
编写与数据库表对应的实体类:
@Data //lombok提供get、set方法 @TableName("`tb_user`") //与数据库表名对应 public class User { private Integer id; private String name; private String gender; private Integer age; private String address; private String qq; private String email; private String photo; }
编写mapper接口
使用MyBatisPlus无需编写mapper.xml文件,也无需在配置文件中配置mybatis,只需创建一个接口继承BaseMapper即可,并且也无需在里面写sql语句就能进行简单的增删改查操作,注意还需要加上@Mapper注解。
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
编写测试类
这里就只展示MyBatisPlus的使用,就不编写service等类。
@SpringBootTest class MybatisPlusApplicationTests { @Autowired UserMapper userMapper; @Test void contextLoads() { //查询单个 User user1 = userMapper.selectById(2); System.out.println("查询单个"+user1); //查询所有 List<User> list = userMapper.selectList(null); System.out.println("查询所有"); System.out.println(list); //添加数据 User user2 = new User(); user2.setName("李白"); user2.setAge(20); user2.setGender("男"); user2.setEmail("d3333ahs"); userMapper.insert(user2); //更新数据 user2.setAge(32); userMapper.updateById(user2); //删除数据 userMapper.deleteById(2); } }
注意事项:使用insert方法时,需要注意实体类中的主键要设置
@TableId(type = IdType.AUTO)
否则插入的id会出现异常。
更新时使用updateById,会自动根据传入的实体类的id进行更新。如果使用update方法,会更新所有的数据。
条件构造器
在实际开发中,对于数据库的增删改查操作会更加复杂,MyBatisPlus自带的方法并不能满足我们所需的操作,这个时候就要使用条件构造器Wrapper。
Wrapper 类是构建复杂查询和更新条件的关键工具。它允许开发者以链式调用的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性。
条件构造器的核心类:
类型 | 特点 | 适用场景 |
---|---|---|
QueryWrapper | 基础条件构造器 | 简单条件查询 |
LambdaQueryWrapper | 类型安全的Lambda表达式构造器 | 避免字段硬编码 |
UpdateWrapper | 更新条件构造器 | 字段更新操作 |
LambdaUpdateWrapper | Lambda风格的更新构造器 | 类型安全的更新操作 |
条件构造器的常用方法
方法 | 说明 |
---|---|
eq(R column, Object val) | WHERE column= 'val' |
ne(R column, Object val) | WHERE column<> 'val' |
gt(R column, Object val) | WHERE column> val |
ge(R column, Object val) | WHERE column>= val |
lt(R column, Object val) | WHERE column< val |
le(R column, Object val) | WHERE column<= val |
between(R column, Object val1, Object val2) | WHERE column BETWEEN val1 AND val2 |
notBetween(R column, Object val1, Object val2) | WHERE column NOT BETWEEN val1 AND val2 |
like(R column, Object val) | WHERE column LIKE '%val%' |
notLike(R column, Object val) | WHERE column NOT LIKE '%val%' |
likeLeft(R column, Object val) | columnLIKE '%val' |
likeRight(R column, Object val) | WHERE column LIKE 'val%' |
isNull(R column) | WHERE column IS NULL |
in(R column, Collection<?> value) in(R column, Object... values) | WHERE column IN (value) |
示例
- 查询年龄大于20的姓名和性别
- 查询年龄小于30并且名字中带有“张”记录
- 将地址为湖南的记录改为四川
//查询年龄大于20的姓名和性别
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name","gender").gt("age",20);
List<User> users = userMapper.selectList(queryWrapper);
System.out.println(users);
//查询年龄小于30并且名字中带有“张”记录
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.lt("age",30).like("name","张");
List<User> users1 = userMapper.selectList(queryWrapper1);
System.out.println(users1);
//将地址为湖南的记录改为四川
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper.eq("address","湖南");
User user = new User();
user.setAddress("四川");
userMapper.update(user,userUpdateWrapper);
基于lambda表达式写法
MyBatisPlus还提供了一种解决上述硬编码方式的构造器:
//基于lambda表达式写法
//查询年龄大于20的姓名和性别
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(User::getName,User::getGender).gt(User::getAge,20);
List<User> users = userMapper.selectList(queryWrapper);
System.out.println(users);
//查询年龄小于30并且名字中带有“张”记录
LambdaQueryWrapper<User> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.lt(User::getAge,30).like(User::getName,"张");
List<User> users1 = userMapper.selectList(queryWrapper1);
System.out.println(users1);
//将地址为湖南的记录改为四川
LambdaUpdateWrapper<User> userUpdateWrapper = new LambdaUpdateWrapper<>();
userUpdateWrapper.eq(User::getAddress,"湖南");
User user = new User();
user.setAddress("四川");
userMapper.update(user,userUpdateWrapper);