ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MyBatisUtil、 MyBatis分页拦截器

2020-12-26 18:03:38  阅读:188  来源: 互联网

标签:MyBatisUtil 拦截器 ibatis apache session org MyBatis import RowBounds


 

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) {
    }

}

 

标签:MyBatisUtil,拦截器,ibatis,apache,session,org,MyBatis,import,RowBounds
来源: https://www.cnblogs.com/bors/p/MyBatisUtil.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有