插件
分页插件
1、MyBatis Plus 自带分页插件,只要配置即可实现分页功能
2、配置插件
(1)Spring xml 方式
<property name="plugins">
<array>
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
<property name="sqlParser" ref="自定义解析类、可以没有"/>
<property name="dialectClazz" value="自定义方言类、可以没有"/>
<!-- COUNT SQL 解析.可以没有 -->
<property name="countSqlParser" ref="countSqlParser"/>
</bean>
</array>
</property>
<bean id="countSqlParser" class="com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize">
<!-- 设置为 true 可以优化部分 left join 的sql -->
<property name="optimizeJoin" value="true"/>
</bean>
(2)Spring Boot 注解方式
@Configuration
//扫描Mapper接口所在的包
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
//旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true 调回到首页,false 继续请求,默认 false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
//最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3、测试
@Test
public void testPage(){
//设置分页参数:当前页码,每页显示条数
Page<User> page = new Page<>(1, 5);
userMapper.selectPage(page, null);
//获取分页数据
List<User> list = page.getRecords();
list.forEach(System.out::println);
System.out.println("当前页:"+ page.getCurrent());
System.out.println("每页显示的条数:"+ page.getSize());
System.out.println("总记录数:"+ page.getTotal());
System.out.println("总页数:"+ page.getPages());
System.out.println("是否有上一页:"+ page.hasPrevious());
System.out.println("是否有下一页:"+ page.hasNext());
}
4、xml 自定义分页
(1)UserMapper 中定义接口方法
public interface UserMapper {//可以继承或者不继承BaseMapper
/**
* 查询:根据state状态查询用户列表,分页显示
*
* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page,即自动分页,必须放在第一位(可以继承Page实现自己的分页对象)
* @param state 状态
* @return 分页对象,必须为Page
*/
IPage<User> selectPageVo(Page<?> page, Integer state);
}
(2)UserMapper.xml 中编写 SQL,mybatis-plus 自动分页
<!-- SQL片段,记录基础字段 -->
<sql id="BaseColumns">
id,username,age,email
</sql>
<!-- IPage<User> selectPageVo(Page<User> page, Integer age); -->
<select id="selectPageVo" resultType="User">
SELECT
<include refid="BaseColumns"></include>
FROM t_user WHERE age > #{age}
</select>
(3)测试
@Test
public void testSelectPageVo(){
//设置分页参数
Page<User> page = new Page<>(1, 5);
userMapper.selectPageVo(page, 20);
//获取分页数据
List<User> list = page.getRecords();
list.forEach(System.out::println);
System.out.println("当前页:"+page.getCurrent());
System.out.println("每页显示的条数:"+page.getSize());
System.out.println("总记录数:"+page.getTotal());
System.out.println("总页数:"+page.getPages());
System.out.println("是否有上一页:"+page.hasPrevious());
System.out.println("是否有下一页:"+page.hasNext());
}
乐观锁
1、配置插件
(1)Spring xml 方式
<bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor" id="optimisticLockerInnerInterceptor"/>
<bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
<property name="interceptors">
<list>
<ref bean="optimisticLockerInnerInterceptor"/>
</list>
</property>
</bean>
(2)Spring Boot 注解方式
@Configuration
//扫描Mapper接口所在的包
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
2、实现流程
(1)数据库中添加 version 字段
(2)更新前,取出记录,获取当前 version
(3)更新时,version+ 1,如果 where 语句中的 version 版本不对,则更新失败
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战