MyBatisUtil、 MyBatis分页拦截器

 

MyBatisUtil

 

package com.edu.common;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
    private static SqlSessionFactory factory;
    private static ThreadLocal<SqlSession> locale = new ThreadLocal<SqlSession>();
    
    static{
        //确保factory只加载一次,并且实例只有一份
        InputStream in = Test.class.getResourceAsStream("/configuration.xml");
        factory = new SqlSessionFactoryBuilder().build(in);
    }
    //获取sqlSession
    public static SqlSession getSession(){
        SqlSession session = locale.get();
        if(session==null){
            session = factory.openSession();
            locale.set(session);
            System.out.println("您建立了一个session");
        }
        return session;
    }
    
    public static void close(){
        SqlSession session = locale.get();
        if(session!=null){
            session.close();
            //灰常重要
            locale.set(null);
        }
    }
    
}

 

PaginationInterceptor : MyBatis分页拦截器
package com.edu.common;

import java.sql.Connection;
import java.util.Properties;

import org.apache.ibatis.executor.statement.StatementHandler;
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.session.RowBounds;

//表明拦截StatementHandler类的prepare方法(Connection)
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class PaginationInterceptor implements Interceptor {
    // intercept(拦截器方法):拦截所有对象
    public Object intercept(Invocation arg0) throws Throwable {
        System.out.println("拦截器执行之前");
        // 执行的这个方法是否带RowBounds参数了
        StatementHandler statementHandler = (StatementHandler) arg0.getTarget();//arg0调取被拦截的(target)对象
        MetaObject metaObject = MetaObject.forObject(statementHandler); //获取原对象:包含SQL执行的相关内容,条件RowBounds
        RowBounds rowBounds = (RowBounds) metaObject.getValue("delegate.rowBounds"); // 返回原对象中的RowBounds对象
        if (rowBounds != null && rowBounds != RowBounds.DEFAULT) { // RowBounds有值,数据还被重新设置过,证明你要分页了
            System.out.println("老子要分页了");
            // 更改SQL语句:
            String Sql = (String) metaObject.getValue("delegate.boundSql.sql"); // 得到原来你要执行的SQL语句
            int offset = rowBounds.getOffset();   // RowBounds里面的start起始行号
            int limit = rowBounds.getLimit();    // RowBounds里面的rows每页行数
            Sql = Sql + " limit " + offset + "," + limit + "";  // 拼接得到MySQL分页的sql语句
            metaObject.setValue("delegate.boundSql.sql", Sql); // 重置分页的SQL语句
            metaObject.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);// 设置原有的分页的参数为初始化
            metaObject.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);  // 设置原有的分页的参数为初始化
        }
        Object obj = arg0.proceed();// 拦截对象直接执行
        System.out.println("拦截器执行之后");
        return obj;
    }
    // 返回该拦截器插件
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
    public void setProperties(Properties properties) {
    }

}

 

上一篇:tomcat 启动start.bat显示中文乱码处理方法


下一篇:浏览器访问项目资源时,报HTTP Status 500 – Internal Server Error