MyBatisPlus
MyBatisPlus简介
入门案例
1、创建项目导入MyBatisPlus起步依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency>
2、配置数据库信息
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/spring_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root password: 123456789
3、创建domain类
public class Book { private long id; private String type; private String name; private String description; public long getId() {return id;} public void setId(long id) {this.id = id;} public String getType() {return type;} public void setType(String type) {this.type = type;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getDescription() {return description;} public void setDescription(String description) {this.description = description;} @Override public String toString() { return "TblBook{" + "id=" + id + ", type='" + type + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + '}'; } }
4、创建一个Dao接口继承BaseMapper类
@Mapper public interface BookDao extends BaseMapper<Book> { }
数据层标准开发
标准数据层功能
Lombok
一个Java类库,提供了一组注解,简化POJO实体类开发。
Lombok依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
常见注解
@Setter:为模型类的属性提供setter方法
@Getter:为模型类的属性提供getter方法
@ToString:为模型类的属性提供toString方法
@EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
@Data:是个组合注解,包含上面的注解的功能
@NoArgsConstructor:提供一个无参构造函数
@AllArgsConstructor:提供一个包含所有参数的构造函数
分页功能
使用方法
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper) //IPage:用来构建分页查询条件 //Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null //IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage
分页功能的使用需要配置拦截器
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //1 创建MybatisPlusInterceptor拦截器对象 MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor(); //2 添加分页拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } }
查询操作
条件查询
MyBatisPlus提供了一个Wrapper类,这个类就是用来构建查询条件的
Wrapper类是一个抽象类,需要使用其实现类
QueryWrapper类
@Test void testGetAll(){ QueryWrapper qw = new QueryWrapper(); //查询年龄小于18 qw.lt("age",18); List<User> userList = userDao.selectList(qw); System.out.println(userList); }
LambdaQueryWrapper类
QueryWrapper类使用时需要输入属性名称,容易出错,可以使用lambda表达式解决
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //查询年龄小于18 lqw.lt(User::getAge, 18); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
多条件查询
Wrapper对象连续输入条件
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //年龄小于30 lqw.lt(User::getAge, 30); //年龄大于10 lqw.gt(User::getAge, 10); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
构建多条件的时候,也可以支持链式编程
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //年龄大于10且小于30 lqw.lt(User::getAge, 10).or().gt(User::getAge, 30); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
or()就相当于我们sql语句中的or关键字,不加默认是and
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //年龄小于10或大于30 lqw.lt(User::getAge, 10).or().gt(User::getAge, 30); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
条件函数的第一个参数可以true或false来设定条件是否启用,常用在非空判定
@Test void testGetAll(){ User user = new User(); user.setAge(20); LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //年龄小于10,如果年龄为空则不判断 lqw.lt((null!=user.getAge(),User::getAge, 10) List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
查询投影
通过select函数设置要查询的字段
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //指定要查询到的字段 lqw.select(User::getId,User::getName,User::getAge); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
模糊查询
使用like进行模糊查询
@Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //查询以“J”开头的用户 lqw.likeLeft(User::getName, "J"); List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
like():前后加百分号,如 %J%
likeLeft():前面加百分号,如 %J
likeRight():后面加百分号,如 J%
排序
使用orderBy方法
@Test void testGetAll(){ LambdaQueryWrapper<User> lwq = new LambdaQueryWrapper<>(); /** * condition :条件,返回boolean, *当condition为true,进行排序,如果为false,则不排序 * isAsc:是否为升序,true为升序,false为降序 * columns:需要操作的列 */ lwq.orderBy(true,false, User::getId); userDao.selectList(lw }