工具類: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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM