MyBatis分页插件

        MyBatis分页插件--有测试代码哦,可以抄袭哦

20人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:

也许分页插件是你最为感兴趣的东西,那好我们开完成一个分页插件。

好长的代码,hold住哦。 博主今天累了,改天再和你们解释一下这个插件的设计思想。

  1. package com.learn.mybatis.plugin;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.util.Map;  
  7. import java.util.Properties;  
  8.   
  9. import org.apache.ibatis.executor.parameter.ParameterHandler;  
  10. import org.apache.ibatis.executor.statement.StatementHandler;  
  11. import org.apache.ibatis.mapping.BoundSql;  
  12. import org.apache.ibatis.mapping.MappedStatement;  
  13. import org.apache.ibatis.plugin.Interceptor;  
  14. import org.apache.ibatis.plugin.Intercepts;  
  15. import org.apache.ibatis.plugin.Invocation;  
  16. import org.apache.ibatis.plugin.Plugin;  
  17. import org.apache.ibatis.plugin.Signature;  
  18. import org.apache.ibatis.reflection.MetaObject;  
  19. import org.apache.ibatis.reflection.SystemMetaObject;  
  20. import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;  
  21. import org.apache.ibatis.session.Configuration;  
  22.   
  23. /** 
  24.  * 
  25.  * @author ykzhen2015 
  26.  */  
  27. @Intercepts({  
  28.     @Signature(type = StatementHandler.class,  
  29.             method = "prepare",  
  30.             args = {Connection.class})})  
  31. public class PagingPlugin implements Interceptor {  
  32.   
  33.     private Integer defaultPage;  
  34.     private Integer defaultPageSize;  
  35.     private Boolean defaultUseFlag;  
  36.     private Boolean defaultCheckFlag;  
  37.   
  38.     @Override  
  39.     public Object intercept(Invocation invocation) throws Throwable {  
  40.         StatementHandler stmtHandler = getUnProxyObject(invocation);  
  41.         MetaObject metaStatementHandler = SystemMetaObject.forObject(stmtHandler);  
  42.         String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");  
  43.         //不是select语句.  
  44.         if (!this.checkSelect(sql)) {  
  45.             return invocation.proceed();  
  46.         }  
  47.         BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");  
  48.         Object parameterObject = boundSql.getParameterObject();  
  49.         PageParams pageParams = null;  
  50.         if (parameterObject instanceof Map) {  
  51.             Map parameterMap = (Map) parameterObject;  
  52.             pageParams = (PageParams) parameterMap.get("$pageParams");  
  53.         } else if (parameterObject instanceof PageParams) {  
  54.             pageParams = (PageParams) parameterObject;  
  55.         }  
  56.         if (pageParams == null) {  
  57.             throw new Exception("没有获得分页参数!!,请正确使用分页参数!!");  
  58.         }  
  59.         //获取参数.  
  60.         Integer pageNum = pageParams.getPage() == nullthis.defaultPage : pageParams.getPage();  
  61.         Integer pageSize = pageParams.getPageSize() == nullthis.defaultPageSize : pageParams.getPageSize();  
  62.         Boolean useFlag = pageParams.getUseFlag() == nullthis.defaultUseFlag : pageParams.getUseFlag();  
  63.         Boolean checkFlag = pageParams.getCheckFlag() == nullthis.defaultCheckFlag : pageParams.getCheckFlag();  
  64.         if (!useFlag) {  //不使用分页插件.  
  65.             return invocation.proceed();  
  66.         }  
  67.         int total = this.getTotal(invocation, metaStatementHandler, boundSql);  
  68.         pageParams.setTotal(total);  
  69.         //计算总页数.  
  70.         int totalPage = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;  
  71.         pageParams.setTotalPage(totalPage);  
  72.         //检查当前页码的有效性.  
  73.         this.checkPage(checkFlag, pageNum, totalPage);  
  74.         //修改sql  
  75.         this.changeSQL(metaStatementHandler, boundSql, pageNum, pageSize);  
  76.         //执行查询,得到最后的结果.  
  77.         Object data = invocation.proceed();  
  78. //        PageDataPO pageData = this.dealPageData(data, pageTotal, total, pageSize, pageNum);  
  79.         return data;  
  80.     }  
  81.   
  82.   
  83.     /** 
  84.      * 判断是否sql语句. 
  85.      * @param sql 
  86.      * @return 
  87.      */  
  88.     private boolean checkSelect(String sql) {  
  89.         String trimSql = sql.trim();  
  90.         int idx = trimSql.toLowerCase().indexOf("select");  
  91.         return idx == 0;  
  92.     }  
  93.   
  94.     /** 
  95.      * 检查当前页码的有效性. 
  96.      * @param checkFlag 
  97.      * @param pageNum 
  98.      * @param pageTotal 
  99.      * @throws Throwable 
  100.      */  
  101.     private void checkPage(Boolean checkFlag, Integer pageNum, Integer pageTotal) throws Throwable  {  
  102.         if (checkFlag) {  
  103.             //检查页码page是否合法.  
  104.             if (pageNum > pageTotal) {  
  105.                 throw new Exception("查询失败,查询页码【" + pageNum + "】大于总页数【" + pageTotal + "】!!");  
  106.             }  
  107.         }  
  108.     }  
  109.   
  110.   
  111.     /** 
  112.      * 修改当前查询的SQL 
  113.      * @param metaStatementHandler 
  114.      * @param boundSql 
  115.      * @param page 
  116.      * @param pageSize 
  117.      */  
  118.     private void changeSQL(MetaObject metaStatementHandler, BoundSql boundSql, int page, int pageSize) {  
  119.         //获取当前需要执行的SQL  
  120.         String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");  
  121.         /** 
  122.          * TODO 这里使用的是MySQL其他数据库需要修改. 
  123.          * 根据你的数据库,修改分页的SQL 
  124.          */  
  125.         String newSql = "select * from (" + sql + ") $_paging_table limit " + (page - 1) * pageSize + ", " + pageSize;  
  126.         //修改当前需要执行的SQL  
  127.         metaStatementHandler.setValue("delegate.boundSql.sql", newSql);  
  128.     }  
  129.   
  130.     /** 
  131.      * 获取综述. 
  132.      * 
  133.      * @param ivt Invocation 
  134.      * @param metaStatementHandler statementHandler 
  135.      * @param boundSql sql 
  136.      * @return sql查询总数. 
  137.      * @throws Throwable 异常. 
  138.      */  
  139.     private int getTotal(Invocation ivt, MetaObject metaStatementHandler, BoundSql boundSql) throws Throwable {  
  140.         //获取当前的mappedStatement  
  141.         MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");  
  142.         //配置对象  
  143.         Configuration cfg = mappedStatement.getConfiguration();  
  144.         //当前需要执行的SQL  
  145.         String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");  
  146.         /** 
  147.         * TODO 如果是其他的数据库需要按你数据库的SQL规范改写. 
  148.         * 改写为统计总数的SQL 
  149.         */  
  150.         String countSql = "select count(*) as total from (" + sql + ") $_paging";  
  151.         //获取拦截方法参数,我们知道是Connection对象.  
  152.         Connection connection = (Connection) ivt.getArgs()[0];  
  153.         PreparedStatement ps = null;  
  154.         int total = 0;  
  155.         try {  
  156.             //预编译统计总数SQL  
  157.             ps = connection.prepareStatement(countSql);  
  158.             //构建统计总数SQL  
  159.             BoundSql countBoundSql = new BoundSql(cfg, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());  
  160.             //构建MyBatis的ParameterHandler用来设置总数Sql的参数。  
  161.             ParameterHandler handler = new DefaultParameterHandler(mappedStatement, boundSql.getParameterObject(), countBoundSql);  
  162.             //设置总数SQL参数  
  163.             handler.setParameters(ps);  
  164.             //执行查询.  
  165.             ResultSet rs = ps.executeQuery();  
  166.             while (rs.next()) {  
  167.                 total = rs.getInt("total");  
  168.             }  
  169.         } finally {  
  170.             //这里不能关闭Connection否则后续的SQL就没法继续了。  
  171.             if (ps != null && ps.isClosed()) {  
  172.                 ps.close();  
  173.             }  
  174.         }  
  175.         System.err.println("总条数:" + total);  
  176.         return total;  
  177.     }  
  178.   
  179.     /** 
  180.      * 从代理对象中分离出真实对象. 
  181.      * 
  182.      * @param ivt --Invocation 
  183.      * @return 非代理StatementHandler对象 
  184.      */  
  185.     private StatementHandler getUnProxyObject(Invocation ivt) {  
  186.         StatementHandler statementHandler = (StatementHandler) ivt.getTarget();  
  187.         MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);  
  188.         // 分离代理对象链(由于目标类可能被多个拦截器拦截,从而形成多次代理,通过循环可以分离出最原始的的目标类)  
  189.         Object object = null;  
  190.         while (metaStatementHandler.hasGetter("h")) {  
  191.             object = metaStatementHandler.getValue("h");  
  192.         }  
  193.         if (object == null) {  
  194.             return statementHandler;  
  195.         }  
  196.         return (StatementHandler) object;  
  197.     }  
  198.   
  199.     @Override  
  200.     public Object plugin(Object statementHandler) {  
  201.         return Plugin.wrap(statementHandler, this);  
  202.     }  
  203.   
  204.     @Override  
  205.     public void setProperties(Properties props) {  
  206.         String strDefaultPage = props.getProperty("default.page""1");  
  207.         String strDefaultPageSize = props.getProperty("default.pageSize""50");  
  208.         String strDefaultUseFlag = props.getProperty("default.useFlag""false");  
  209.         String strDefaultCheckFlag = props.getProperty("default.checkFlag""false");  
  210.         this.defaultPage = Integer.parseInt(strDefaultPage);  
  211.         this.defaultPageSize = Integer.parseInt(strDefaultPageSize);  
  212.         this.defaultUseFlag = Boolean.parseBoolean(strDefaultUseFlag);  
  213.         this.defaultCheckFlag = Boolean.parseBoolean(strDefaultCheckFlag);  
  214.     }  
  215.   
  216.   
  217. }  
package com.learn.mybatis.plugin;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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.BoundSql;
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.apache.ibatis.scripting.defaults.DefaultParameterHandler;
import org.apache.ibatis.session.Configuration;

/**
 *
 * @author ykzhen2015
 */
@Intercepts({
    @Signature(type = StatementHandler.class,
            method = "prepare",
            args = {Connection.class})})
public class PagingPlugin implements Interceptor {

    private Integer defaultPage;
    private Integer defaultPageSize;
    private Boolean defaultUseFlag;
    private Boolean defaultCheckFlag;

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler stmtHandler = getUnProxyObject(invocation);
        MetaObject metaStatementHandler = SystemMetaObject.forObject(stmtHandler);
        String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");
        //不是select语句.
        if (!this.checkSelect(sql)) {
            return invocation.proceed();
        }
        BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
        Object parameterObject = boundSql.getParameterObject();
        PageParams pageParams = null;
        if (parameterObject instanceof Map) {
        	Map parameterMap = (Map) parameterObject;
        	pageParams = (PageParams) parameterMap.get("$pageParams");
        } else if (parameterObject instanceof PageParams) {
        	pageParams = (PageParams) parameterObject;
        }
        if (pageParams == null) {
        	throw new Exception("没有获得分页参数!!,请正确使用分页参数!!");
        }
        //获取参数.
        Integer pageNum = pageParams.getPage() == null? this.defaultPage : pageParams.getPage();
        Integer pageSize = pageParams.getPageSize() == null? this.defaultPageSize : pageParams.getPageSize();
        Boolean useFlag = pageParams.getUseFlag() == null? this.defaultUseFlag : pageParams.getUseFlag();
        Boolean checkFlag = pageParams.getCheckFlag() == null? this.defaultCheckFlag : pageParams.getCheckFlag();
        if (!useFlag) {  //不使用分页插件.
            return invocation.proceed();
        }
        int total = this.getTotal(invocation, metaStatementHandler, boundSql);
        pageParams.setTotal(total);
        //计算总页数.
        int totalPage = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
        pageParams.setTotalPage(totalPage);
        //检查当前页码的有效性.
        this.checkPage(checkFlag, pageNum, totalPage);
        //修改sql
        this.changeSQL(metaStatementHandler, boundSql, pageNum, pageSize);
        //执行查询,得到最后的结果.
        Object data = invocation.proceed();
//        PageDataPO pageData = this.dealPageData(data, pageTotal, total, pageSize, pageNum);
        return data;
    }


    /**
     * 判断是否sql语句.
     * @param sql
     * @return
     */
    private boolean checkSelect(String sql) {
        String trimSql = sql.trim();
        int idx = trimSql.toLowerCase().indexOf("select");
        return idx == 0;
    }

    /**
     * 检查当前页码的有效性.
     * @param checkFlag
     * @param pageNum
     * @param pageTotal
     * @throws Throwable
     */
    private void checkPage(Boolean checkFlag, Integer pageNum, Integer pageTotal) throws Throwable  {
        if (checkFlag) {
            //检查页码page是否合法.
            if (pageNum > pageTotal) {
                throw new Exception("查询失败,查询页码【" + pageNum + "】大于总页数【" + pageTotal + "】!!");
            }
        }
    }


    /**
     * 修改当前查询的SQL
     * @param metaStatementHandler
     * @param boundSql
     * @param page
     * @param pageSize
     */
    private void changeSQL(MetaObject metaStatementHandler, BoundSql boundSql, int page, int pageSize) {
        //获取当前需要执行的SQL
        String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");
        /**
         * TODO 这里使用的是MySQL其他数据库需要修改.
         * 根据你的数据库,修改分页的SQL
         */
        String newSql = "select * from (" + sql + ") $_paging_table limit " + (page - 1) * pageSize + ", " + pageSize;
        //修改当前需要执行的SQL
        metaStatementHandler.setValue("delegate.boundSql.sql", newSql);
    }

    /**
     * 获取综述.
     *
     * @param ivt Invocation
     * @param metaStatementHandler statementHandler
     * @param boundSql sql
     * @return sql查询总数.
     * @throws Throwable 异常.
     */
    private int getTotal(Invocation ivt, MetaObject metaStatementHandler, BoundSql boundSql) throws Throwable {
        //获取当前的mappedStatement
        MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
        //配置对象
        Configuration cfg = mappedStatement.getConfiguration();
        //当前需要执行的SQL
        String sql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");
        /**
        * TODO 如果是其他的数据库需要按你数据库的SQL规范改写.
        * 改写为统计总数的SQL
        */
        String countSql = "select count(*) as total from (" + sql + ") $_paging";
        //获取拦截方法参数,我们知道是Connection对象.
        Connection connection = (Connection) ivt.getArgs()[0];
        PreparedStatement ps = null;
        int total = 0;
        try {
            //预编译统计总数SQL
            ps = connection.prepareStatement(countSql);
            //构建统计总数SQL
            BoundSql countBoundSql = new BoundSql(cfg, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
            //构建MyBatis的ParameterHandler用来设置总数Sql的参数。
            ParameterHandler handler = new DefaultParameterHandler(mappedStatement, boundSql.getParameterObject(), countBoundSql);
            //设置总数SQL参数
            handler.setParameters(ps);
            //执行查询.
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                total = rs.getInt("total");
            }
        } finally {
            //这里不能关闭Connection否则后续的SQL就没法继续了。
            if (ps != null && ps.isClosed()) {
                ps.close();
            }
        }
        System.err.println("总条数:" + total);
        return total;
    }

    /**
     * 从代理对象中分离出真实对象.
     *
     * @param ivt --Invocation
     * @return 非代理StatementHandler对象
     */
    private StatementHandler getUnProxyObject(Invocation ivt) {
        StatementHandler statementHandler = (StatementHandler) ivt.getTarget();
        MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
        // 分离代理对象链(由于目标类可能被多个拦截器拦截,从而形成多次代理,通过循环可以分离出最原始的的目标类)
        Object object = null;
        while (metaStatementHandler.hasGetter("h")) {
            object = metaStatementHandler.getValue("h");
        }
        if (object == null) {
            return statementHandler;
        }
        return (StatementHandler) object;
    }

    @Override
    public Object plugin(Object statementHandler) {
        return Plugin.wrap(statementHandler, this);
    }

    @Override
    public void setProperties(Properties props) {
        String strDefaultPage = props.getProperty("default.page", "1");
        String strDefaultPageSize = props.getProperty("default.pageSize", "50");
        String strDefaultUseFlag = props.getProperty("default.useFlag", "false");
        String strDefaultCheckFlag = props.getProperty("default.checkFlag", "false");
        this.defaultPage = Integer.parseInt(strDefaultPage);
        this.defaultPageSize = Integer.parseInt(strDefaultPageSize);
        this.defaultUseFlag = Boolean.parseBoolean(strDefaultUseFlag);
        this.defaultCheckFlag = Boolean.parseBoolean(strDefaultCheckFlag);
    }


}

注意:在代码注解的地方有些地方有TODO,这里我采用的是MySQL修改语句,如果你是其他数据库需要在哪里修改为对应数据库的SQL语句。


有了这个插件,还不行哦,还要配置一下:

  1.      <plugins>  
  2.         <plugin interceptor="com.learn.mybatis.plugin.PagingPlugin">  
  3.             <!--默认第1页-->  
  4.             <property name="default.page" value="1" />  
  5.             <!--默认每页20条-->  
  6.             <property name="default.pageSize" value="20" />  
  7.             <!--默认不启用分页插件-->  
  8.             <property name="default.useFlag" value="false" />  
  9.             <!--默认不检查页码-->  
  10.             <property name="default.checkFlag" value="false" />  
  11.         </plugin>  
  12.     </plugins>  
     <plugins>
        <plugin interceptor="com.learn.mybatis.plugin.PagingPlugin">
            <!--默认第1页-->
            <property name="default.page" value="1" />
            <!--默认每页20条-->
            <property name="default.pageSize" value="20" />
            <!--默认不启用分页插件-->
            <property name="default.useFlag" value="false" />
            <!--默认不检查页码-->
            <property name="default.checkFlag" value="false" />
        </plugin>
    </plugins>

这样在MyBatis上下文就可以引用这个插件了。

这里的配置:

  • default.page -- 缺省页码的时候,采用第1页
  • default.pageSize -- 缺省每页多少条配置的时候,才有每页20条
  • default.useFlag -- 查询是否启用分页插件,如果为false则不启用。
  • default.checkFlag -- 查询是否检查page当前页有效。如最大页码是2,程序传递为3,如此项为true,则抛出异常提示错误。如果为false则不抛出异常

以上的默认参数都可以通过这个类进行改变:

  1. package com.learn.mybatis.plugin;  
  2.   
  3.   
  4. /** 
  5.  * 
  6.  * @author ykzhen2015 
  7.  */  
  8. public class PageParams {  
  9.   
  10.     private Integer page;  
  11.     private Integer pageSize;  
  12.     private Boolean useFlag;  
  13.     private Boolean checkFlag;  
  14.     private Integer total;  
  15.     private Integer totalPage;  
  16.   
  17.     public Integer getPage() {  
  18.         return page;  
  19.     }  
  20.   
  21.     public void setPage(Integer page) {  
  22.         this.page = page;  
  23.     }  
  24.   
  25.     public Integer getPageSize() {  
  26.         return pageSize;  
  27.     }  
  28.   
  29.     public void setPageSize(Integer pageSize) {  
  30.         this.pageSize = pageSize;  
  31.     }  
  32.   
  33.     public Boolean getUseFlag() {  
  34.         return useFlag;  
  35.     }  
  36.   
  37.     public void setUseFlag(Boolean useFlag) {  
  38.         this.useFlag = useFlag;  
  39.     }  
  40.   
  41.     public Boolean getCheckFlag() {  
  42.         return checkFlag;  
  43.     }  
  44.   
  45.     public void setCheckFlag(Boolean checkFlag) {  
  46.         this.checkFlag = checkFlag;  
  47.     }  
  48.   
  49.     public Integer getTotal() {  
  50.         return total;  
  51.     }  
  52.   
  53.     public void setTotal(Integer total) {  
  54.         this.total = total;  
  55.     }  
  56.   
  57.     public Integer getTotalPage() {  
  58.         return totalPage;  
  59.     }  
  60.   
  61.     public void setTotalPage(Integer totalPage) {  
  62.         this.totalPage = totalPage;  
  63.     }  
  64.   
  65. }  
package com.learn.mybatis.plugin;


/**
 *
 * @author ykzhen2015
 */
public class PageParams {

	private Integer page;
	private Integer pageSize;
	private Boolean useFlag;
	private Boolean checkFlag;
	private Integer total;
	private Integer totalPage;

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	public Boolean getUseFlag() {
		return useFlag;
	}

	public void setUseFlag(Boolean useFlag) {
		this.useFlag = useFlag;
	}

	public Boolean getCheckFlag() {
		return checkFlag;
	}

	public void setCheckFlag(Boolean checkFlag) {
		this.checkFlag = checkFlag;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}

}

当以下属性被设置会有这样的效果:

  • page  --插件默认设置default.page作废,采取这个值

  • pageSize --插件默认设置default.pageSize作废,采取这个值

  • useFlag --插件默认设置default.useFlag作废,采取这个值

  • checkFlag --插件默认设置default.checkFlag作废,采取这个值

而:

total  ——代表总条数,插件回自动帮我们回填

totalPage ——代表总页数,插件回自动帮我们回填



有了这个类,我们来举例如何使用它,我们先定义Mapper接口。

  1. package com.learn.mybatis.chapter1.mapper;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.apache.ibatis.annotations.Param;  
  7.   
  8. import com.learn.mybatis.chapter1.po.TRole;  
  9. import com.learn.mybatis.plugin.PageParams;  
  10. import com.learn.mybatis.plugin.TestParams;  
  11.   
  12. public interface RoleMapper {  
  13.     public TRole getRole(Long id);  
  14.   
  15.     public List<TRole> selectAllRole(TestParams pageParams);  
  16.   
  17.     public List<TRole> selectRoleByMap(Map<String, Object> params);  
  18.   
  19.       //"$pageParams"这个键不能修改   
  20.      public List<TRole> selectRoleByMap(@Param("roleName") String roleName, @Param("$pageParams") PageParams pageParams);  
  21. }  
package com.learn.mybatis.chapter1.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.learn.mybatis.chapter1.po.TRole;
import com.learn.mybatis.plugin.PageParams;
import com.learn.mybatis.plugin.TestParams;

public interface RoleMapper {
    public TRole getRole(Long id);

    public List<TRole> selectAllRole(TestParams pageParams);

    public List<TRole> selectRoleByMap(Map<String, Object> params);

      //"$pageParams"这个键不能修改 
     public List<TRole> selectRoleByMap(@Param("roleName") String roleName, @Param("$pageParams") PageParams pageParams);
}
 

 好,这里有三个select开头的方法,参数分别为POJO, map和MyBatis的注解型。这三种类型这个插件都可以适用。 
 

让我们看看POJO---TestParams,它继承了PageParams

  1. package com.learn.mybatis.plugin;  
  2.   
  3. public class TestParams extends PageParams {  
  4.   
  5.     String roleName;  
  6.   
  7.     public String getRoleName() {  
  8.         return roleName;  
  9.     }  
  10.   
  11.     public void setRoleName(String roleName) {  
  12.         this.roleName = roleName;  
  13.     }  
  14. }  
package com.learn.mybatis.plugin;

public class TestParams extends PageParams {

	String roleName;

	public String getRoleName() {
		return roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
}

这时候我们看看roleMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2.  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4. <mapper namespace="com.learn.mybatis.chapter1.mapper.RoleMapper">  
  5.     <select id="getRole" parameterType="long" resultType="com.learn.mybatis.chapter1.po.TRole">  
  6.         select id, role_name as roleName, note from t_role where id=#{id}  
  7.     </select>  
  8.    
  9.    <select id="selectAllRole" parameterType="com.learn.mybatis.plugin.TestParams" resultType="com.learn.mybatis.chapter1.po.TRole">  
  10.         select id, role_name as roleName, note from t_role  
  11.         <where>  
  12.         <if test="roleName != null">  
  13.         role_name like concat('%', #{roleName}, '%')  
  14.         </if>  
  15.         </where>  
  16.     </select>  
  17.   
  18.     <select id="selectRoleByMap" parameterType="map" resultType="com.learn.mybatis.chapter1.po.TRole">  
  19.         select id, role_name as roleName, note from t_role  
  20.         <where>  
  21.         <if test="roleName != null">  
  22.         role_name like concat('%', #{roleName}, '%')  
  23.         </if>  
  24.         </where>  
  25.     </select>  
  26.   
  27.     <select id="selectRoleByKey"  resultType="com.learn.mybatis.chapter1.po.TRole">  
  28.         select id, role_name as roleName, note from t_role  
  29.         <where>  
  30.         <if test="roleName != null">  
  31.         role_name like concat('%', #{roleName}, '%')  
  32.         </if>  
  33.         </where>  
  34.     </select>  
  35. </mapper>  
<?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.learn.mybatis.chapter1.mapper.RoleMapper">
    <select id="getRole" parameterType="long" resultType="com.learn.mybatis.chapter1.po.TRole">
        select id, role_name as roleName, note from t_role where id=#{id}
    </select>
 
   <select id="selectAllRole" parameterType="com.learn.mybatis.plugin.TestParams" resultType="com.learn.mybatis.chapter1.po.TRole">
        select id, role_name as roleName, note from t_role
        <where>
        <if test="roleName != null">
        role_name like concat('%', #{roleName}, '%')
        </if>
        </where>
    </select>

    <select id="selectRoleByMap" parameterType="map" resultType="com.learn.mybatis.chapter1.po.TRole">
        select id, role_name as roleName, note from t_role
        <where>
        <if test="roleName != null">
        role_name like concat('%', #{roleName}, '%')
        </if>
        </where>
    </select>

    <select id="selectRoleByKey"  resultType="com.learn.mybatis.chapter1.po.TRole">
        select id, role_name as roleName, note from t_role
        <where>
        <if test="roleName != null">
        role_name like concat('%', #{roleName}, '%')
        </if>
        </where>
    </select>
</mapper>

可以看好,三个select都有方法了。

我们用main方法测试一下:

  1. public static void main(String[] args) {  
  2.         testParams();  
  3.         testPOJO();  
  4.         testMap();  
  5.   
  6.     }  
  7.   
  8.     public static void testPOJO() {  
  9.         SqlSession sqlSession = null;  
  10.         try {  
  11.             sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();  
  12.             RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);  
  13.             TestParams params = new TestParams();  
  14.             params.setUseFlag(true);  
  15.             params.setCheckFlag(false);  
  16.             params.setPage(2);  
  17.             params.setPageSize(5);  
  18.             params.setRoleName("test");  
  19.             List<TRole> pageData = roleMapper.selectAllRole(params);  
  20.             System.err.println("#######################测试POJO##################");  
  21.             System.err.println("总页数:" + params.getTotalPage());  
  22.             System.err.println("总条数:" + params.getTotal());  
  23.         } finally {  
  24.             sqlSession.close();  
  25.         }  
  26.     }  
  27.   
  28.     public static void testMap() {  
  29.         SqlSession sqlSession = null;  
  30.         try {  
  31.             sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();  
  32.             RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);  
  33.             Map<String, Object> paramMap = new HashMap<String, Object>();  
  34.             PageParams pageParams = new PageParams();  
  35.             pageParams.setUseFlag(true);  
  36.             pageParams.setCheckFlag(false);  
  37.             pageParams.setPage(2);  
  38.             pageParams.setPageSize(5);  
  39.             paramMap.put("roleName""test");  
  40.            paramMap.put("$pageParams", pageParams);//"$pageParams"这个键不能修改  
  41.             List<TRole> pageData2 = roleMapper.selectRoleByMap(paramMap);  
  42.             System.err.println("#######################测试Map##################");  
  43.             System.err.println("总页数:" + pageParams.getTotalPage());  
  44.             System.err.println("总条数:" + pageParams.getTotal());  
  45.         } finally {  
  46.             sqlSession.close();  
  47.         }  
  48.     }  
  49.   
  50.     public static void testParams() {  
  51.         SqlSession sqlSession = null;  
  52.         try {  
  53.             sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();  
  54.             RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);  
  55.             PageParams pageParams2 = new PageParams();  
  56.             pageParams2.setUseFlag(true);  
  57.             pageParams2.setCheckFlag(true);  
  58.             pageParams2.setPage(2);  
  59.             pageParams2.setPageSize(5);  
  60.             List<TRole> pageData3 = roleMapper.selectRoleByMap("test", pageParams2);  
  61.             System.err.println("#######################测试@Param##################");  
  62.             System.err.println("总页数:" + pageParams2.getTotalPage());  
  63.             System.err.println("总条数:" + pageParams2.getTotal());  
  64.         } finally {  
  65.             sqlSession.close();  
  66.         }  
  67.     }  
public static void main(String[] args) {
        testParams();
        testPOJO();
        testMap();

    }

    public static void testPOJO() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            TestParams params = new TestParams();
            params.setUseFlag(true);
            params.setCheckFlag(false);
            params.setPage(2);
            params.setPageSize(5);
            params.setRoleName("test");
            List<TRole> pageData = roleMapper.selectAllRole(params);
            System.err.println("#######################测试POJO##################");
            System.err.println("总页数:" + params.getTotalPage());
            System.err.println("总条数:" + params.getTotal());
        } finally {
            sqlSession.close();
        }
    }

    public static void testMap() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Map<String, Object> paramMap = new HashMap<String, Object>();
            PageParams pageParams = new PageParams();
            pageParams.setUseFlag(true);
            pageParams.setCheckFlag(false);
            pageParams.setPage(2);
            pageParams.setPageSize(5);
            paramMap.put("roleName", "test");
           paramMap.put("$pageParams", pageParams);//"$pageParams"这个键不能修改
            List<TRole> pageData2 = roleMapper.selectRoleByMap(paramMap);
            System.err.println("#######################测试Map##################");
            System.err.println("总页数:" + pageParams.getTotalPage());
            System.err.println("总条数:" + pageParams.getTotal());
        } finally {
            sqlSession.close();
        }
    }

    public static void testParams() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            PageParams pageParams2 = new PageParams();
            pageParams2.setUseFlag(true);
            pageParams2.setCheckFlag(true);
            pageParams2.setPage(2);
            pageParams2.setPageSize(5);
            List<TRole> pageData3 = roleMapper.selectRoleByMap("test", pageParams2);
            System.err.println("#######################测试@Param##################");
            System.err.println("总页数:" + pageParams2.getTotalPage());
            System.err.println("总条数:" + pageParams2.getTotal());
        } finally {
            sqlSession.close();
        }
    }

好,他们都执行相同的查询,并且打印了总页数和总条数,会不会成功呢?我们看看打印的日志:

  1. run:  
  2. DEBUG 2016-06-16 21:03:46,208 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.  
  3. DEBUG 2016-06-16 21:03:46,818 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  4. DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  5. DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  6. DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  7. DEBUG 2016-06-16 21:03:47,583 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection  
  8. DEBUG 2016-06-16 21:03:48,646 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 2042495840.  
  9. DEBUG 2016-06-16 21:03:48,646 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  10. DEBUG 2016-06-16 21:03:48,662 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging   
  11. DEBUG 2016-06-16 21:03:48,802 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  12. DEBUG 2016-06-16 21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1  
  13. 总条数:11  
  14. DEBUG 2016-06-16 21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 55   
  15. DEBUG 2016-06-16 21:03:48,912 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  16. DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5  
  17. #######################测试@Param##################  
  18. 总页数:3  
  19. 总条数:11  
  20. DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  21. DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  22. DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.  
  23. DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection  
  24. DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection 2042495840 from pool.  
  25. DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  26. DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging   
  27. DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  28. DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1  
  29. 总条数:11  
  30. DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 55   
  31. DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  32. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5  
  33. #######################测试POJO##################  
  34. 总页数:3  
  35. 总条数:11  
  36. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  37. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  38. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.  
  39. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection  
  40. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection 2042495840 from pool.  
  41. DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  42. DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging   
  43. DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  44. 总条数:11  
  45. DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1  
  46. DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 55   
  47. DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  48. DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5  
  49. #######################测试Map##################  
  50. 总页数:3  
  51. 总条数:11  
  52. DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  53. DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]  
  54. DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.  
  55. 成功构建 (总时间: 5 秒)  
run:
DEBUG 2016-06-16 21:03:46,208 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG 2016-06-16 21:03:46,818 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2016-06-16 21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2016-06-16 21:03:47,583 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2016-06-16 21:03:48,646 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 2042495840.
DEBUG 2016-06-16 21:03:48,646 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,662 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging 
DEBUG 2016-06-16 21:03:48,802 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
DEBUG 2016-06-16 21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1
总条数:11
DEBUG 2016-06-16 21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5 
DEBUG 2016-06-16 21:03:48,912 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5
#######################测试@Param##################
总页数:3
总条数:11
DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.
DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection 2042495840 from pool.
DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,943 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging 
DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1
总条数:11
DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5 
DEBUG 2016-06-16 21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5
#######################测试POJO##################
总页数:3
总条数:11
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection 2042495840 from pool.
DEBUG 2016-06-16 21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging 
DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
总条数:11
DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1
DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5 
DEBUG 2016-06-16 21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)
DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 5
#######################测试Map##################
总页数:3
总条数:11
DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
DEBUG 2016-06-16 21:03:49,005 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 2042495840 to pool.
成功构建 (总时间: 5 秒)

好,我们看到,我们的分页参数的总条数和总页数被回填了。而且我们可以通过useFlag属性来控制是否启用分页,这样对于select count(*) from t_role这样的语句我们通过设置参数,就可以不启用这个分页功能了。


此外还有检查页码的功能,只要设置了属性,checkFlag插件会为我们检查这个页码的正确性,让我们看看:

  1. public static void testException() {  
  2.         SqlSession sqlSession = null;  
  3.         try {  
  4.             sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();  
  5.             RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);  
  6.             TestParams params = new TestParams();  
  7.             params.setUseFlag(true);  
  8.             params.setCheckFlag(true);//检查页码正确性  
  9.             params.setPage(5);//故意超过最大页数  
  10.             params.setPageSize(5);  
  11.             params.setRoleName("test");  
  12.             List<TRole> pageData = roleMapper.selectAllRole(params);  
  13.             System.err.println("#######################测试POJO##################");  
  14.             System.err.println("总页数:" + params.getTotalPage());  
  15.             System.err.println("总条数:" + params.getTotal());  
  16.         } finally {  
  17.             sqlSession.close();  
  18.         }  
  19.     }  
public static void testException() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            TestParams params = new TestParams();
            params.setUseFlag(true);
            params.setCheckFlag(true);//检查页码正确性
            params.setPage(5);//故意超过最大页数
            params.setPageSize(5);
            params.setRoleName("test");
            List<TRole> pageData = roleMapper.selectAllRole(params);
            System.err.println("#######################测试POJO##################");
            System.err.println("总页数:" + params.getTotalPage());
            System.err.println("总条数:" + params.getTotal());
        } finally {
            sqlSession.close();
        }
    }

params.setCheckFlag(true);//检查页码正确性

注意这里设置了需要检验

params.setPage(5);//故意超过最大页数

这样让他超过了最大的页数。

我们测试它,得到日志:

  1. run:  
  2. DEBUG 2016-06-16 21:09:22,123 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.  
  3. DEBUG 2016-06-16 21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  4. DEBUG 2016-06-16 21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  5. DEBUG 2016-06-16 21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  6. DEBUG 2016-06-16 21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  7. DEBUG 2016-06-16 21:09:22,732 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection  
  8. DEBUG 2016-06-16 21:09:23,482 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 1033490990.  
  9. DEBUG 2016-06-16 21:09:23,482 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]  
  10. DEBUG 2016-06-16 21:09:23,513 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging   
  11. DEBUG 2016-06-16 21:09:23,669 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: test(String)  
  12. DEBUG 2016-06-16 21:09:23,794 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1  
  13. 总条数:11  
  14. DEBUG 2016-06-16 21:09:23,810 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]  
  15. DEBUG 2016-06-16 21:09:23,810 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]  
  16. DEBUG 2016-06-16 21:09:23,826 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 1033490990 to pool.  
  17. Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:   
  18. ### Error querying database.  Cause: java.lang.reflect.UndeclaredThrowableException  
  19. ### The error may exist in com\learn\mybatis\chapter1\sqlmap\role.xml  
  20. ### The error may involve com.learn.mybatis.chapter1.mapper.RoleMapper.selectAllRole-Inline  
  21. ### The error occurred while setting parameters  
  22. ### Cause: java.lang.reflect.UndeclaredThrowableException  
  23.     at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)  
  24.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)  
  25.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)  
  26.     at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)  
  27.     at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)  
  28.     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)  
  29.     at com.sun.proxy.$Proxy3.selectAllRole(Unknown Source)  
  30.     at com.learn.mybatis.chapter1.main.MyBatisExample.testException(MyBatisExample.java:33)  
  31.     at com.learn.mybatis.chapter1.main.MyBatisExample.main(MyBatisExample.java:18)  
  32. Caused by: java.lang.reflect.UndeclaredThrowableException  
  33.     at com.sun.proxy.$Proxy4.prepare(Unknown Source)  
  34.     at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:76)  
  35.     at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:61)  
  36.     at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)  
  37.     at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)  
  38.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)  
  39.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)  
  40.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)  
  41.     ... 7 more  
  42. Caused by: java.lang.Exception: 查询失败,查询页码【5】大于总页数【3】!!  
  43.     at com.learn.mybatis.plugin.PagingPlugin.checkPage(PagingPlugin.java:105)  
  44.     at com.learn.mybatis.plugin.PagingPlugin.intercept(PagingPlugin.java:73)  
  45.     at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)  
  46.     ... 15 more  
  47. C:\Users\ykzhen\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1  
  48. 构建失败 (总时间: 2 秒)  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis分页插件是为了解决默认的基于内存分页效率较低的问题而开发的插件。默认情况下,Mybatis是通过查出所有数据再进行截取的方式来实现分页的。这种方式在数据量较大的情况下效率较低。然而,通过使用Mybatis的插件机制,我们可以拦截StatementHandler类的prepare方法,并改变要执行的SQL语句为分页语句,从而提高分页查询的效率。插件可以改变Mybatis的核心对象的行为,如处理参数、处理SQL、处理结果。 使用分页插件可以帮助我们更方便地获取分页信息,如上一页、下一页、首页和尾页。通过设置标签中的参数,如pageSize(每页显示的条数)、pageNum(当前页的页码)和index(当前页的起始索引),我们可以灵活地控制分页查询的结果。 要使用Mybatis分页插件,首先需要在项目的pom.xml文件中添加依赖。然后,在mybatis-config.xml文件中创建插件配置,并指定使用的插件类。最后,在进行查询操作时,开启分页功能即可。 总结来说,Mybatis分页插件是为了提高分页查询效率而开发的插件,可以通过拦截器的方式改变SQL语句,从而实现分页功能。使用分页插件可以方便地获取各种分页信息,并且通过配置参数可以灵活地控制分页查询结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatis分页插件](https://blog.csdn.net/ABAAAAABBB/article/details/117415076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis中的分页插件](https://blog.csdn.net/qq2844509367/article/details/126427670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值