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 }