zoukankan      html  css  js  c++  java
  • 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) {
        }
    
    }
  • 相关阅读:
    ubuntu远程windows桌面
    spring boot 给返回值加状态 BaseData
    spring boot 拦截异常 统一处理
    IntelliJ IDEA spring boot 远程Ddbug调试
    IntelliJ IDEA 常用插件
    spring boot 请求地址带有.json 兼容处理
    spring boot 接口返回值去掉为null的字段
    spring boot 集成disconf
    Spring boot 自定义拦截器
    Linux下安装MySQL
  • 原文地址:https://www.cnblogs.com/bors/p/MyBatisUtil.html
Copyright © 2011-2022 走看看