第五章 插件扩展
1. Mybatis插件机制简介
1.1 插件机制
Mybatis通过插件(Interceptor)可以做到拦截四大对象相关方法的执行,根据需求完成相关数据的动态改变。
- Executor
- StatementHandler
- ParameterHandler
- ResultSetHandler
1.2 插件原理
四大对象的每个对象在创建时,都会执行interceptorChain.pluginAll(),会经过每个插件对象的 plugin()方法,目的是为当前的四大对象创建代理。代理对象就可以拦截到四大对象相关方法的执行,因为要执行四大对象的方法需要经过代理。
2. 分页插件
com.baomidou.mybatisplus.plugins.PaginationInterceptor
2.1 在spring的配资文件中添加分页插件
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.mp.entity"/>
<property name="globalConfig" ref="globalConfig"/>
<property name="configuration" ref="configuration"/>
<property name="plugins">
<array>
<!-- 添加分页插件 -->
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
<!--<property name="dialectClazz" value="自定义方言类、可以没有" />-->
</bean>
</array>
</property>
</bean>
2.2 分页API
IPage<T>接口:分页对象接口
方法 | 功能 |
---|---|
String[] descs() | 降序字段数组 |
String[] ascs() | 升序字段数组 |
Map<Object, Object> condition() | 查询条件 |
boolean optimizeCountSql() | 自动优化COUNT SQL,默认:true |
boolean isSearchCount() | 进行count查询,默认: true |
long offset() | 计算当前分页偏移量 |
long getPages() | 总页数 |
getRecords() | 获取分页记录列表 |
IPage<T> setRecords(List<T> records) | 设置分页记录列表 |
getTotal() | 获取总条数 |
IPage<T> setTotal(long total) | 设置总条数 |
long getSize() | 获取每页条数 |
IPage<T> setSize(long size) | 设置每页条数 |
long getCurrent() | 获取当前页,默认:1 |
IPage<T> setCurrent(long current) | 设置当前页 |
Page<T>:IPage<T>接口的实现类
方法 | 功能 |
---|---|
Page() | 无参构造 |
Page(long current, long size) | 构造方法,并初始化当前页和每页条数 |
Page(long current, long size, long total) | 构造方法,并初始化当前页,每页条数,总记录数 |
Page(long current, long size, boolean isSearchCount) | 构造方法,并初始化当前页,每页条数,是否进行count查询 |
Page(long current, long size, long total, boolean isSearchCount) | 构造方法,并初始化当前页,每页条数,总记录数,是否进行count查询 |
boolean hasPrevious() | 是否存在上一页 |
boolean hasNext() | 是否存在下一页 |
Page<T> setAsc(String… ascs) | 设置多个升序字段 |
Page<T> setAscs(List<String> ascs) | 设置多个升序字段 |
Page<T> setDesc(String… descs) | 设置多个降序字段 |
Page<T> setDescs(List<String> descs) | 设置多个降序字段 |
2.3 MP中自带分页查询的方法
通过BaseMapper<T>接口中IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)方法实现分页查询
@Test
public void testPage1(){
IPage<Person> page = personDao.selectPage(new Page<>(2, 2), null);
System.out.println("当前页面数:" + page.getCurrent());
System.out.println("每页条数:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("分页记录列表:" + page.getRecords());
System.out.println("是否存在上一页:" + ((Page<Person>)page).hasPrevious());
System.out.println("是否存在下一页:" + ((Page<Person>)page).hasNext());
}
2.4 自定义分页
定义接口
public interface PersonDao{
IPage<Person> selectMyPage(Page page);
}
注:
- UserMapper可以继承或者不继承BaseMapper
- 方法参数传递Page对象即自动分页,并且Page对象必须放在第一位,可以继承Page实现自己的分页对象
定义mapper文件
<select id="selectMyPage" resultType="Person">
select id,last_name,age,gender,email from tmp_person
</select>
注:编写一个普通list查询,mybatis-plus自动替你分页