Mybatis的封装

问题:
1.Mybatis的缓存:一个SqlSession对象默认有一个缓存区,在使用同一个SqlSession对象操作相同的Sql时,除了第一次以外,其他的都会走缓存,提升效率,降低数据库操作的频率,有为了避免不同的SqlSession对象缓存相同的数据,造成资源浪费,所以开启了Factory缓存
2.每次获取SqlSession对象的代码都是相同的,每次都要书写,比较麻烦。
解决:
1.不同的请求,需要使用同一个Factory对象。
2.不同的请求,使用不同的SqlSession对象。
3.同一个请求,在责任链的任意位置获取的是同一个SqlSession对象。
4.对SqlSession对象的获取进行封装。
方案:
将Factory对象声明为静态属性使用,可以多线程共享。
将创建的SqlSession对象存储到ThreadLocal中即可。
ThreadLocal对象的特点:
该对象中存储的数据只能是当前线程内共享。
概念:
在使用MVC开发思想后,我们将功能实现的代码进行拆分为不同的类和方法,然后使用这些类和方法的相互调用来完成功能的处理,从而形成了一个链条式的执行机制,我们将链条成为责任链
封装工具类的方法:

public class GetMybatis {
    private static SqlSessionFactory factory;//创建SqlSessionFactory对象
    private static ThreadLocal threadLocal;//声明ThreadLocal对象
    //使用static代码域来为静态属性赋值
    static{
        try {
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
            threadLocal = new ThreadLocal();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        //保证1.不同的请求,需要使用同一个Factory对象
        // 2.不同的请求,使用不同的SqlSession对象
        // 3.同一个请求,在责任链的任意位置获取的是同一个SqlSession对象,使用ThreadLocal对象
        SqlSession ss = threadLocal.get();
        if(ss==null){
            ss=factory.openSession();
            threadLocal.set(ss);
        }
        return ss;
    }
    //声明关闭的方法:
    public static void closeAll(){
        SqlSession ss = threadLocal.get();
        if(ss!=null){
            ss.close();
        }
        threadLocal.set(null);
    }
}

增加过滤器:再执行代码的时候先获的SqlSession对象,执行结束的时候,提交事件和关闭SqlSession对象和将ThreadLocal对象中的SqlSession对象去除

@WebFilter("/*") //过滤所有的类
public class MyFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        SqlSession ss = GetMybatis.getSqlSession();
        try{
            chain.doFilter(req, resp);
            ss.commit();
        }catch (Exception e) {
            e.printStackTrace();
            ss.rollback();
        }finally {
            GetMybatis.closeAll();
        }

    }

    public void init(FilterConfig config) throws ServletException {

    }
}

你可能感兴趣的:(Java基础知识整理)