Springboot整合MyBatisplus和快速入门
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: 123456driver-class-name: com.mysql.cj.jdbc.Driverusername: rooturl: 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 {@AutowiredUserMapper userMapper;@Testvoid 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);