(3).mybatis編寫工具類


編寫工具類

復用與重構

復用:使用方法與函數,復用的類,構成JAR包。(工具類屬於復用)

一。創建工具類(一般在src下創建util包,在util包下創建工具類)。

例如:MybatisUtilds為工具類:

 二:本工具類,作用如下:

1.創建和初始化SqlSessionFactory封裝成方法

2.能夠創建在一定范圍內(線程)有效的SqlSession

3.能夠關閉在一定范圍內()有效的SqlSession

4.能夠進行事務控制

5.一些額外的支持Dao層便捷開發的方法

實現:

ThreadLocal:線程本地存儲(只能存儲一個對象,但是可以保證這個線程一直有效,除非線程銷毀)

ThreadGroup:線程組

ThreadPool:線程池

泛型方法:

public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
}

eg:

    public static void rollback(){
        SqlSession session = threadLocal.get();
        if(session!=null) session.rollback();
        UsersMapper dao=session.getMapper(UsersMapper.class); NewsMapper newDao=session.getMapper(NewsMapper.class);
    }
    public static <T> T getMapper(Class<T> tClass){ return open().getMapper(tClass); }

可更改:

public static void rollback(){
        SqlSession session = threadLocal.get();
        if(session!=null) session.rollback();
        UsersMapper dao=getMapper(UsersMapper.class); NewsMapper newDao=getMapper(NewsMapper.class); } public static <T> T getMapper(Class<T> tClass){ return open().getMapper(tClass); }

 三:完整代碼:

MybatisUtils類:

 1 package com.util;
 2 
 3 import com.dao.NewsMapper;
 4 import com.dao.UsersMapper;
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 
10 import java.io.IOException;
11 import java.io.InputStream;
12 
13 public class MybatisUtils {
14     /**
15      * 1.創建和初始化SqlSessionFactory
16      * 2.能夠創建在一定范圍內(線程)有效的SqlSession
17      * 3.能夠關閉在一定范圍內()有效的SqlSession
18      * 4.能夠進行事務控制
19      * 5.一些額外的支持Dao層便捷開發的方法
20      *  * 場景1:重定向
21      *  * me -> A(伊濱)      1request->response   1線程
22      *  *    -> B(西工)      2request->response   2線程
23      *  *    -> C(澗西)      3request->response   3線程
24      *  *    -> A(伊濱)      4request->response   4線程
25      *  * 場景2:轉發         1request->response   1線程
26      *  * me -> A(伊濱)
27      *  *             -電話-> B(西工)
28      *  *             -電話-> C(澗西)
29      *  *     <-
30      *  * 多線程環境下訪問SqlSession是同一個么、需要是同一個么?  不是同一個
31      *  * 單線程環境下訪問SqlSession是同一個么、需要是同一個么?  是同一個
32      */
33     static final String CONFIG_FILE = "mybatis-config.xml";
34     static SqlSessionFactory factory;
35     static{
36         initFactory(CONFIG_FILE);
37     }
38     public static void initFactory(String configName){
39         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
40         try {
41             InputStream resourceAsStream =
42                     Resources.getResourceAsStream(configName);
43             factory = builder.build(resourceAsStream);
44         } catch (IOException e) {
45             e.printStackTrace();
46         }
47     }
48     static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
49     public static SqlSession open(){
50         SqlSession session = threadLocal.get();
51         if(session==null){
52             session = factory.openSession();
53             threadLocal.set(session);//線程綁定session,保證每次調用的是同一個線程
54         }
55         return session;
56     }
57     public static void close(){
58         SqlSession session = threadLocal.get();
59         if(session!=null){
60             session.close();
61             threadLocal.set(null);
62         }
63     }
64     public static void commit(){
65         SqlSession session = threadLocal.get();
66         if(session!=null) session.commit();
67     }
68     public static void rollback(){
69         SqlSession session = threadLocal.get();
70         if(session!=null) session.rollback();
71         UsersMapper dao=getMapper(UsersMapper.class);
72         NewsMapper newDao=getMapper(NewsMapper.class);
73     }
74     public static <T> T getMapper(Class<T> tClass){
75         return open().getMapper(tClass);
76     }
77 
78 }

 

測試類MybatisUtilsTest:

 1 package com.dao;
 2 
 3 import org.apache.ibatis.session.SqlSession;
 4 import org.junit.Test;
 5 
 6 import static com.util.MybatisUtils.open;
 7 
 8 public class MybatisUtilsTest {
 9     //單線程測試
10     @Test
11     public void openInUniqueThread() throws InterruptedException{
12         SqlSession s1=open();
13         Thread.sleep(2000);
14         SqlSession s2=open();
15         Thread.sleep((int)(Math.random()*10000)+1000);
16         SqlSession s3=open();
17         Thread.sleep((int)(Math.random()*10000)+1000);
18         assert s1==s2&&s1==s3;
19     }
20     //多線程測試
21     SqlSession s1 = null;//全局變量
22     SqlSession s2 = null;
23     SqlSession s3 = null;
24     @Test
25     public void openInMultiplyThread() throws InterruptedException {
26         // 匿名類對象(匿名內部類)。1.創建匿名內部類(thread)2.重寫run方法 3.創建對象
27         new Thread(){//子線程
28             public void run(){
29                 s1 = open();
30             }
31         }.start();
32         new Thread(){
33             public void run(){
34                 s2 = open();
35             }
36         }.start();
37         new Thread(){
38             public void run(){
39                 s3 = open();
40             }
41         }.start();
42         // 等待,輪訓
43         while(true){
44             if(s1 != null && s2 != null && s3 != null){
45                 System.out.println("結束了!");
46                 break;
47             }
48             System.out.println("等待:s1=" + s1 +",s2=" + s2 + ",s3=" + s3);
49             Thread.sleep(10);
50         }
51         assert s1 != s2 && s2 != s3 && s1 != s3;//主線程,s1,S2,S3為子線程。
52     }
53 
54 }

 


免責聲明!

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



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