Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁
新建一個(gè)類MyPageInterceptor.java(注意在springboot中要添加注解@Component)
package com.grand.p1upgrade.mapper.test;import java.sql.Connection;import java.util.Map;import java.util.Properties;import org.apache.ibatis.executor.parameter.ParameterHandler;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.plugin.Intercepts;import org.apache.ibatis.plugin.Invocation;import org.apache.ibatis.plugin.Plugin;import org.apache.ibatis.plugin.Signature;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.SystemMetaObject;import org.springframework.stereotype.Component;@Component@Intercepts({@Signature(type=StatementHandler.class,method='prepare',args={Connection.class,Integer.class})})public class MyPageInterceptor implements Interceptor { private int page; private int size; @SuppressWarnings('unused') private String dbType; @SuppressWarnings('unchecked') @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println('plugin is running...'); StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); while(metaObject.hasGetter('h')){ Object object = metaObject.getValue('h'); metaObject = SystemMetaObject.forObject(object); } while(metaObject.hasGetter('target')){ Object object = metaObject.getValue('target'); metaObject = SystemMetaObject.forObject(object); } MappedStatement mappedStatement = (MappedStatement)metaObject.getValue('delegate.mappedStatement'); String mapId = mappedStatement.getId(); if(mapId.matches('.+ByPager$')){ ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue('delegate.parameterHandler'); Map<String, Object> params = (Map<String, Object>)parameterHandler.getParameterObject(); page = (int)params.get('page'); size = (int)params.get('size'); String sql = (String) metaObject.getValue('delegate.boundSql.sql'); sql += ' limit '+(page-1)*size +','+size; metaObject.setValue('delegate.boundSql.sql', sql); } return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { String limit = properties.getProperty('limit','10'); this.page = Integer.parseInt(limit); this.dbType = properties.getProperty('dbType', 'mysql'); } }
添加測試TestMapper.java
package com.grand.p1upgrade.mapper.test;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.Mapper;@Mapperpublic interface TestMapper { public List<Map<String,Object>> findByPager(Map<String, Object> params); public long count();}
TestMapper.xml
<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='com.grand.p1upgrade.mapper.test.TestMapper'> <select resultType='java.util.HashMap'> select * from p1project.sys_user </select> <select resultType='long'> select count(1) from p1project.sys_user </select></mapper>
在調(diào)用TestMapper.findByPager傳遞參數(shù)的時(shí)候?qū)age和size傳入即可
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 用xslt+css讓RSS顯示的跟網(wǎng)頁一樣漂亮2. ASP.NET MVC把數(shù)據(jù)庫中枚舉項(xiàng)的數(shù)字轉(zhuǎn)換成文字3. 《CSS3實(shí)戰(zhàn)》筆記--漸變?cè)O(shè)計(jì)(一)4. 測試模式 - XSL教程 - 55. Ajax實(shí)現(xiàn)異步加載數(shù)據(jù)6. 教你JS更簡單的獲取表單中數(shù)據(jù)(formdata)7. ASP.NET Core自定義中間件的方式詳解8. html5手機(jī)觸屏touch事件介紹9. CSS3實(shí)現(xiàn)動(dòng)態(tài)翻牌效果 仿百度貼吧3D翻牌一次動(dòng)畫特效10. 讓chatgpt將html中的圖片轉(zhuǎn)為base64方法示例
