zoukankan      html  css  js  c++  java
  • 工具类:mybatis中使用Threadlocal开启session及关闭session

    1、线程容器,给线程绑定一个Object 内容,后只要线程不变,可以随时取出.
    1.1 改变线程,无法取出内容.
    1 final ThreadLocal threadLocal = new ThreadLocal<>();
    2 threadLocal.set("测试");
    3 new Thread(){
    4     public void run() {
    5         String result = threadLocal.get();
    6         System.out.println("结果:"+result);
    7     };
    8 }.start();
    2、使用Threadlocal简化开发
    2.1定义工具类
        将SqlSession创建出来,存放到Threadlocal中,需要时再从中取出
     1 package com.test.util;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 
     6 import org.apache.ibatis.io.Resources;
     7 import org.apache.ibatis.session.SqlSession;
     8 import org.apache.ibatis.session.SqlSessionFactory;
     9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    10 
    11 public class MybatisUtil {
    12 
    13     //工厂
    14     private static SqlSessionFactory factory;
    15     //线程容器
    16     private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
    17     
    18     
    19     static{
    20         try {
    21             InputStream is = Resources.getResourceAsStream("mybatis.xml");
    22             factory = new SqlSessionFactoryBuilder().build(is);
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         }
    26     }
    27     /**
    28      * 获取session
    29      * 从线程容器中获取,没有则创建session在存放到线程容器中
    30      * @return
    31      */
    32     public static SqlSession getSession(){
    33         SqlSession sqlSession = tl.get();
    34         if(sqlSession == null){
    35             sqlSession = factory.openSession();
    36             tl.set(sqlSession);
    37         }
    38         return tl.get();
    39     }
    40     
    41     /**
    42      * 关闭session
    43      * 从容器线程中获取session,有则关闭,且将线程容器的session清空
    44      */
    45     public static void closeSession(){
    46         SqlSession sqlSession = tl.get();
    47         if(sqlSession != null){
    48             sqlSession.close();
    49         }
    50         tl.set(null);
    51     }
    52 }
    将工厂的产生改成单例模式
     1 package com.text.util;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.logging.Level;
     6 import java.util.logging.Logger;
     7 
     8 import org.apache.ibatis.io.Resources;
     9 import org.apache.ibatis.session.SqlSession;
    10 import org.apache.ibatis.session.SqlSessionFactory;
    11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    12 
    13 
    14 public class MybatisUtil {
    15 
    16     //工厂
    17     private static SqlSessionFactory factory;
    18     //类线程锁
    19     private static final Class CLASS_LOCK = MybatisUtil.class;
    20     //线程容器
    21     private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
    22     //构造器私有化
    23     private MybatisUtil(){}
    24     
    25     public static SqlSessionFactory initSqlSessionFactory(){
    26         String resource = "mybatis.xml";
    27         InputStream is = null;
    28         try {
    29             is = Resources.getResourceAsStream(resource);
    30         } catch (IOException e) {
    31             Logger.getLogger(MybatisUtil.class.getName()).log(Level.SEVERE, null, e);
    32         }
    33         synchronized (CLASS_LOCK) {
    34             if(null == factory){
    35                 factory = new SqlSessionFactoryBuilder().build(is);
    36             }
    37         }
    38         return factory;
    39     }
    40     
    41     /**
    42      * 获取session
    43      * 从线程容器中获取,没有则创建session在存放到线程容器中
    44      * @return
    45      */
    46     public static SqlSession getSession(){
    47         SqlSession sqlSession = tl.get();
    48         if(sqlSession == null){
    49             if(factory == null){
    50                 initSqlSessionFactory();
    51             }
    52             sqlSession = factory.openSession();
    53             tl.set(sqlSession);
    54         }
    55         return tl.get();
    56     }
    57     
    58     /**
    59      * 关闭session
    60      * 从容器线程中获取session,有则关闭,且将线程容器的session清空
    61      */
    62     public static void closeSession(){
    63         SqlSession sqlSession = tl.get();
    64         if(sqlSession != null){
    65             sqlSession.close();
    66         }
    67         tl.set(null);
    68     }
    69 }
     
    2.2 定义过滤器
        过滤器可以在调用方法前及方法后添加代码
     1 package com.test.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import java.io.InputStream;
     6 
     7 import javax.servlet.Filter;
     8 import javax.servlet.FilterChain;
     9 import javax.servlet.FilterConfig;
    10 import javax.servlet.ServletException;
    11 import javax.servlet.ServletRequest;
    12 import javax.servlet.ServletResponse;
    13 import javax.servlet.annotation.WebFilter;
    14 
    15 import org.apache.ibatis.io.Resources;
    16 import org.apache.ibatis.session.SqlSession;
    17 import org.apache.ibatis.session.SqlSessionFactory;
    18 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    19 
    20 import com.test.util.MyBatisUtil;
    21 
    22 
    23 /**
    24  * 最开始是由Spring框架提出的.整合Hibernate框架是使用的是OpenSessionInView
    25  * 
    26  * 
    27  * @author Administrator
    28  *
    29  */
    30 @WebFilter("/*")
    31 public class OpenSessionInView implements Filter{
    32 
    33     @Override
    34     public void init(FilterConfig filterconfig) throws ServletException {
    35         // TODO Auto-generated method stub
    36     }
    37 
    38     @Override
    39     public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
    40             throws IOException, ServletException {
    41 //        InputStream is = Resources.getResourceAsStream("mybatis.xml");
    42 //        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    43 //        SqlSession session = factory.openSession();        
    44         SqlSession session = MyBatisUtil.getSession();
    45         try {
    46             filterchain.doFilter(servletrequest, servletresponse);
    47             session.commit();
    48         } catch (Exception e) {
    49             session.rollback();
    50             e.printStackTrace();
    51         }finally{
    52             MyBatisUtil.closeSession();
    53         }
    54 //        session.commit();
    55 //        session.close();
    56     }
    57 
    58     @Override
    59     public void destroy() {
    60         // TODO Auto-generated method stub    
    61     }
    62 }
     
  • 相关阅读:
    mysql中的round函数的使用
    mysql中日期函数的处理,datediff()函数 与 timestampdiff()函数的区别 及使用。
    easyui datagrid 自定义editor
    好的产品 跟 好的 设计师 很类似
    music
    gd库复制图片做水印
    用gd库画矩形和椭圆
    默认安装wamp修改MySQL密码
    中文验证码
    验证码
  • 原文地址:https://www.cnblogs.com/wuweibincqu/p/10382386.html
Copyright © 2011-2022 走看看