這個(gè)類(lèi)能夠?qū)⒁粋€(gè)對(duì)象和一個(gè)線程綁定起來(lái),我的理解就是他維持了一個(gè)Map<Thread, T>集合。
之所以寫(xiě)這個(gè)類(lèi)是因?yàn)?DBUtils 工具類(lèi),在 JavaEE 經(jīng)典三層結(jié)構(gòu)中對(duì)于事務(wù)的操作,不方便放在 DAO 層,因?yàn)榫哂星秩胄?,只適合放在 Service層開(kāi)啟事務(wù),但是由于要調(diào)用 DAO 中不同的方法來(lái)完成一個(gè)事務(wù),就涉及到 conn 對(duì)象的傳遞,因?yàn)橐WC是同一個(gè) conn 對(duì)象在操作事務(wù),要不然就會(huì)出亂子了,就會(huì)想到將 conn 對(duì)象當(dāng)成參數(shù)傳遞給 ADO 層的若干方法,但是有時(shí)候連 Service 都沒(méi)有 conn 對(duì)象的持有,更別說(shuō)當(dāng)成參數(shù)傳遞給 DAO 層了,但是想一想,執(zhí)行一個(gè)事務(wù)的線程肯定是同一個(gè)線程,這樣就可以用上ThreadLocal 類(lèi)了,在使用連接池時(shí)就將 conn 對(duì)象和當(dāng)前線程綁定,在之后的 ADO 中獲取 conn 對(duì)象時(shí),也是通過(guò)連接池獲取 conn 對(duì)象,此時(shí)也肯定是同一個(gè) conn 對(duì)象。
這個(gè)ThreadLocal類(lèi)中提供的方法不多,我下面使用的就是 get/set 方法
下面是一個(gè)轉(zhuǎn)賬的事務(wù):(數(shù)據(jù)庫(kù)中 account 表有三個(gè)字段:id, name, money)
下面是JDBCUtils工具類(lèi)中核心代碼:
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式