MyBatis工廠類封裝與簡化實(shí)現(xiàn)
1.工廠類
在Java中,工廠類是一種設(shè)計(jì)模式,主要用于創(chuàng)建對象的過程。工廠類的目的是將對象的創(chuàng)建邏輯封裝在一個(gè)類中,以便客戶端代碼無需了解具體的實(shí)現(xiàn)細(xì)節(jié),只需要通過工廠類獲取所需的實(shí)例。
工廠類的主要作用包括:
封裝對象創(chuàng)建邏輯: 將對象的創(chuàng)建過程和細(xì)節(jié)封裝在工廠類中,使客戶端代碼無需關(guān)心如何創(chuàng)建對象,降低了代碼的耦合性。
統(tǒng)一接口: 工廠類提供了一個(gè)統(tǒng)一的接口或方法來創(chuàng)建對象,客戶端代碼只需要調(diào)用這個(gè)接口或方法,而無需關(guān)心具體的實(shí)現(xiàn)類。
簡化實(shí)例化過程: 對于某些復(fù)雜的對象創(chuàng)建過程,工廠類可以隱藏創(chuàng)建對象的復(fù)雜性,簡化了客戶端代碼。
靈活切換實(shí)現(xiàn): 如果需要更改或替換某個(gè)類的實(shí)現(xiàn),只需修改工廠類的實(shí)現(xiàn),而無需修改客戶端代碼。這種方式支持更靈活的實(shí)現(xiàn)替換。
2.對工廠類再封裝
這是我們之前的代碼:
package Mybatis; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.List; /** * 我們已經(jīng)配置好了myBatis,當(dāng)我們希望使用myBatis的時(shí)候, * 我們就會(huì)創(chuàng)建一個(gè)SqlSessionFactory類,在這個(gè)類里使用myBatis的各種功能。 */ public class Main { public static void main(String[] args) throws FileNotFoundException { //尋找配置文件,參數(shù)就是配置文件的路徑,這里是相對路徑 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml")); //sqlSession就像之前的statement一樣,創(chuàng)建一個(gè)連接,執(zhí)行sql語句,它也需要關(guān)閉,所以寫進(jìn)try //參數(shù)true代表開啟自動(dòng)提交,如果不自動(dòng)提交,就類似與之前說的mysql的事務(wù)模式 try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){ //這里的參數(shù)是mapper里指定的那個(gè)sql語句的名稱 //也就是UserMapper.xml里的id字段的名稱 List<User> student = sqlSession.selectList("selectUser"); //這行代碼使用了 Java 8 引入的新特性之一,稱為方法引用(Method Reference)。 // 具體來說,System.out::println 是一個(gè)靜態(tài)方法引用,用于將 println 方法關(guān)聯(lián)到 System.out 對象上。 //在這里,System.out::println 等效于 lambda 表達(dá)式 (s) -> System.out.println(s)。 // 它表示將遍歷 student 集合的每個(gè)元素,并將每個(gè)元素傳遞給 System.out.println 方法,實(shí)現(xiàn)在控制臺(tái)上打印每個(gè)元素的效果。 student.forEach(System.out::println); } } }
我們發(fā)現(xiàn)在之前的代碼中,我們首先新建了一個(gè)工廠類,然后執(zhí)行查詢。
但是很這里的代碼邏輯有些不清晰,我們希望的是 連接->查詢。
我們希望:
MybatisUtil.getSession(true)
而不是:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));
工廠類雖然封裝對象創(chuàng)建邏輯,但在這里還有些臃腫,所以我們新建一個(gè)工具類,來封裝這個(gè)工廠類。
package Mybatis; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.FileInputStream; import java.io.IOException; public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; static { try{ sqlSessionFactory=new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml")); }catch (IOException e){ e.printStackTrace(); } } /** * 獲取一個(gè)新的會(huì)話 * @param autoCommit 是否開啟自動(dòng)提交(跟JDBC是一樣的,如果不自動(dòng)提交,則會(huì)變成事務(wù)操作) * @return SqlSession對象 */ public static SqlSession getSession(boolean autoCommit){ return sqlSessionFactory.openSession(autoCommit); } }
在這段代碼里,有一個(gè)靜態(tài)段和靜態(tài)變量。靜態(tài)段和靜態(tài)變量會(huì)在類加載的過程中執(zhí)行,并且只執(zhí)行一次。(無論你new多少個(gè)MyBatisUtil對象,都只會(huì)執(zhí)行一i,不會(huì)重復(fù)執(zhí)行)
這樣的MyBatisUtil
寫法有幾個(gè)好處:
單例模式:
SqlSessionFactory
是一個(gè)比較重量級(jí)的對象,包含了對數(shù)據(jù)庫的配置信息、映射信息等,創(chuàng)建和初始化它可能是一個(gè)相對耗時(shí)的操作。這樣寫確保在整個(gè)應(yīng)用程序生命周期內(nèi)只創(chuàng)建了一個(gè)SqlSessionFactory
對象,提高了性能。全局唯一性:
SqlSessionFactory
對象在整個(gè)應(yīng)用程序中是唯一的,保證了全局唯一性。這意味著在應(yīng)用程序中的任何地方,都可以通過MyBatisUtil
獲取到相同的SqlSessionFactory
實(shí)例。資源共享:
SqlSessionFactory
是一個(gè)比較重的資源,通過單例模式,可以確保所有的SqlSession
對象都共享同一個(gè)SqlSessionFactory
。這樣,在應(yīng)用程序中多個(gè)地方需要訪問數(shù)據(jù)庫時(shí),共享的SqlSessionFactory
可以提高資源利用效率。簡化使用: 封裝了
SqlSessionFactory
的創(chuàng)建過程,對客戶端代碼提供了簡單的接口,通過MyBatisUtil
的getSession
方法,客戶端可以方便地獲取到一個(gè)新的SqlSession
實(shí)例,而無需關(guān)心SqlSessionFactory
的創(chuàng)建和初始化過程。
所以現(xiàn)在,我們的Main類變成了:
package Mybatis; import org.apache.ibatis.session.SqlSession; import java.util.List; public class MainWithUtil { public static void main(String args[]){ //用MyBatisUtil來包裝之前MainWithoutUtil的工廠類,更簡單地得到連接 try(SqlSession sqlSession = MyBatisUtil.getSession(true)){ //這里的參數(shù)是mapper里指定的那個(gè)sql語句的名稱 //也就是UserMapper.xml里的id字段的名稱 List<User> student = sqlSession.selectList("selectUser"); //這行代碼使用了 Java 8 引入的新特性之一,稱為方法引用(Method Reference)。 // 具體來說,System.out::println 是一個(gè)靜態(tài)方法引用,用于將 println 方法關(guān)聯(lián)到 System.out 對象上。 //在這里,System.out::println 等效于 lambda 表達(dá)式 (s) -> System.out.println(s)。 // 它表示將遍歷 student 集合的每個(gè)元素,并將每個(gè)元素傳遞給 System.out.println 方法,實(shí)現(xiàn)在控制臺(tái)上打印每個(gè)元素的效果。 student.forEach(System.out::println); } } }
到此這篇關(guān)于MyBatis工廠類封裝與簡化實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis工廠類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java開發(fā)Dubbo注解Adaptive實(shí)現(xiàn)原理
這篇文章主要為大家介紹了java開發(fā)Dubbo注解Adaptive實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java7和Java8中的ConcurrentHashMap原理解析
這篇文章主要介紹了Java7和Java8中的ConcurrentHashMap原理解析,對ConcurrentHashMap感興趣的讀者,一定要好好看一下2021-04-04java如何讀取resources目錄和同級(jí)目錄文件
介紹了Java中讀取resources目錄和同級(jí)目錄文件的方法,并討論了在IDE和發(fā)布環(huán)境中可能遇到的問題,通過測試發(fā)現(xiàn),執(zhí)行目錄可能會(huì)影響文件讀取,建議在使用`user.dir`時(shí)注意jar包的運(yùn)行目錄問題2024-12-12java基于遞歸算法實(shí)現(xiàn)漢諾塔問題實(shí)例
這篇文章主要介紹了java基于遞歸算法實(shí)現(xiàn)漢諾塔問題,結(jié)合具體實(shí)例形式分析了java遞歸算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-07-07Spring請求參數(shù)校驗(yàn)功能實(shí)例演示
這篇文章主要介紹了Spring請求參數(shù)校驗(yàn)功能實(shí)例演示,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05