在对数据库的操作中,查询数据是最为常用的功能,像一些基本的根据Id查询单条和多条数据,单条件和多条件查询,数据分页查询等;这些都需要我们去编写对应的接口方法和SQL语句,十分麻烦,在工作中,大大降低了我们的开发效率;而在MyBatisPlus中,它不仅为我们封装了一些常用的查询方法,而且还内置了好用的分页插件,不需要我们再去集成第三方插件!
今天我们要学习的内容便是,MybatisPlus中查询功能和分页插件的简单使用,希望在学习完后对你会有所帮助!
6.1 查询操作
6.1.1 查询单条数据
1. 编写查询测试类
package com.kuang.mybatis_plus;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//测试查询(只查询单条用户信息)
@Test
public void testSelectById() {
//通过Id查询用户信息
User user = userMapper.selectById("1405056510844735489");
//打印查询到的用户信息
System.out.println(user);
}
}
2.查看测试结果
结果:查询单条数据成功!
6.1.2 查询批量数据
1.编写查询测试类
package com.kuang.mybatis_plus;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//测试查询(查询多条用户信息)
@Test
public void testSelectByBatchId() {
//通过批量Id查询多条用户信息
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
//打印查询到的多条用户信息
users.forEach(System.out::println);
}
}
2. 查看测试结果
结果:查询多条数据成功!
6.1.3 条件查询数据
1. 编写查询测试
package com.kuang.mybatis_plus;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//条件查询(使用map)
@Test
public void testSelectByMap() {
//获取HashMap对象
HashMap<String,Object> map = new HashMap<>();
//设置map中的键值对信息
map.put("name","周杰伦");
map.put("age","26");
//通过Map查询用户信息
List<User> users = userMapper.selectByMap(map);
//打印查询到的用户信息
users.forEach(System.out::println);
}
}
2. 查看测试结果
结果:通过条件查询用户数据成功!
6.2 分页查询
6.2.1 简单了解分页查询
1. 为什么要使用分页查询?
- 对数据进行分页,缓解数据库压力
- 避免出现瀑布流数据,给用户好的体验
2.分页的实际应用有哪些?
例如当今最流行的视频网站“哔哩哔哩”和博客论坛CSDN,站内的视频和博客,动态和评论都有分页,应用十分之多!
3.分页的实现方式有哪些?
- 原始的 limit 进行分页
- 使用pageHelper第三方插件
- MP内置的分页插件
6.2.2 使用MP内置分页插件
1. 修改MyBatisPlusConfig配置类
package com.kuang.mybatis_plus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
//开启自动事务管理,默认是开启状态
@EnableTransactionManagement
//将MyBatisPlusConfig注册为Spring的IOC容器中的配置类
@Configuration
public class MyBatisPlusConfig {
/**
* 注册乐观锁和分页插件
*/
/**
* 3.3.4版本以后推荐使用以下配置
* 新的分页插件,一缓和二缓遵循mybatis的规则
* 需要设置 MybatisConfiguration#useDeprecatedExecutor = false
* 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
//将mybatisPlusInterceptor方法注册为Spring的IOC容器中的组件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
//获取MybatisPlusInterceptor对象
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加OptimisticLockerInterceptor(乐观锁拦截器)到内部拦截器中
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//添加PaginationInnerInterceptor(即分页拦截器,并且其参数为DbType.MYSQL(即数据库类型为MySQL))到内部拦截器中
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//将interceptor进行返回
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
2. 查看源码Page类和BaseMapper接口
2-1 查看Page泛型类源码
package com.baomidou.mybatisplus.extension.plugins.pagination;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
public class Page<T> implements IPage<T> {
private static final long serialVersionUID = 8545996863226528798L;
protected List<T> records;
protected long total;
protected long size; //分页大小
protected long current; //当前页数
protected List<OrderItem> orders;
protected boolean optimizeCountSql;
protected boolean isSearchCount;
protected boolean hitCount;
protected String countId;
protected Long maxLimit;
public Page() {
this.records = Collections.emptyList();
this.total = 0L;
this.size = 10L;
this.current = 1L;
this.orders = new ArrayList();
this.optimizeCountSql = true;
this.isSearchCount = true;
this.hitCount = false;
}
.....
//两个参数:current是当前页数,size是分页大小
public Page(long current, long size) {
this(current, size, 0L);
}
......
}
2-2 查看BaseMapper接口源码
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> extends Mapper<T> {
......
/**
* @Param page:分页
* @Param queryWrapper:查询wrapper
*/
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
......
}
6.2.3 编写分页查询测试类
1.只查询分页记录
1-1 编写分页查询测试类
- 查询第一页
package com.kuang.mybatis_plus;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//测试分页查询
@Test
public void testPage() {
//使用了分页插件之后,所有的分页操作也变得简单!
//获取Page对象(设置当前页数为1,分页大小为5)
Page<User> page = new Page<>(1,5);
//通过分页查询
userMapper.selectPage(page,null);
//打印分页查询的数据记录
page.getRecords().forEach(System.out::println);
}
}
- 查询第二页
package com.kuang.mybatis_plus;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//测试分页查询
@Test
public void testPage() {
//使用了分页插件之后,所有的分页操作也变得简单!
//获取Page对象(设置当前页数为2,分页大小为5)
Page<User> page = new Page<>(2,5);
//通过分页查询
userMapper.selectPage(page,null);
//打印分页查询的数据记录
page.getRecords().forEach(System.out::println);
}
}
1-2 查看测试结果
- 查询第一页
结果:查询第1到5条数据成功!
- 查询第二页
结果:查询第6到10条数据成功!
2. 查询分页记录和条数
2-1 编写分页查询测试
package com.kuang.mybatis_plus;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuang.mybatis_plus.mapper.UserMapper;
import com.kuang.mybatis_plus.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
//扫描mapper接口所在包
@MapperScan("com.kuang.mybatis_plus.mapper")
class MybatisPlusApplicationTests {
//通过类型自动装配UserMapper接口
@Autowired
private UserMapper userMapper;
//测试分页查询
@Test
public void testPage() {
//使用了分页插件之后,所有的分页操作也变得简单!
//获取Page对象(设置当前页数为1,分页大小为5)
Page<User> page = new Page<>(1,5);
//通过分页查询
userMapper.selectPage(page,null);
//打印分页查询的数据记录
page.getRecords().forEach(System.out::println);
//打印记录总条数
System.out.println("总记录数为:"+page.getTotal()+"条");
}
}
2-2 查看测试结果
结果:成功查询到1到5条数据,并且总记录数为11条!
到这里,有关MybatisPlus的查询操作和分页插件简单使用的学习就结束了,欢迎大家学习和讨论!
参考视频链接:https://www.bilibili.com/video/BV17E411N7KN (B站UP主遇见狂神说的MybatisPlus快速入门)