我們都知道在javaee實(shí)際開(kāi)發(fā)中,分為3層結(jié)構(gòu)來(lái)開(kāi)發(fā),controller,service和dao
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)遂昌免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
那么為什么事物要存在于業(yè)務(wù)層中,事物是通過(guò)connection對(duì)象操作的,使用原始jdbc鏈接數(shù)據(jù)庫(kù)的鏈接也是connection操作的,connection是在到是怎么傳遞到dao的呢?
這里講解兩種方式
第一種通過(guò)形式參數(shù)的方式
第二種通過(guò)ThreadLocal的方式
ThreadLocal的底層是個(gè)map,該map的key是固定的,當(dāng)前線程。value可以讓我們存入任意對(duì)象
public class JdbcUtils {
// 成員變量,創(chuàng)建了C3P0的連接池(連接池中已經(jīng)存在連接了...)
private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();
// 把Connection綁定到當(dāng)前的線程中
private static ThreadLocal tl = new ThreadLocal();
/**
* 返回的是C3P0的連接池
* @return
*/
public static DataSource getDataSource(){
return DATASOURCE;
}
/**
* 獲取連接,返回連接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
Connection conn = null;
// 從tl中獲取
conn = tl.get();
if(conn == null){
// 從連接池中獲取連接
conn = DATASOURCE.getConnection();
// 非常關(guān)鍵,把連接存入到tl中
tl.set(conn);
}
return conn;
}
/**
* 開(kāi)啟事務(wù)
* @throws SQLException
*/
public static void beginTransaction() throws SQLException{
// 調(diào)用getConnection()
Connection conn = getConnection();
conn.setAutoCommit(false);
}
/**
* 提交事務(wù)
* @throws SQLException
*/
public static void commitTransaction() throws SQLException{
// 調(diào)用getConnection()
Connection conn = getConnection();
conn.commit();
}
/**
* 回滾事務(wù)
* @throws SQLException
*/
public static void rollBackTransaction() throws SQLException{
// 調(diào)用getConnection()
Connection conn = getConnection();
conn.rollback();
}
/**
* 歸還連接
* @throws SQLException
*/
public static void closeConn() throws SQLException{
// 調(diào)用getConnection()
Connection conn = getConnection();
conn.close();
tl.remove();
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 已經(jīng)變成了歸還了...
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 把close()給修改了,原來(lái)是銷毀連接,現(xiàn)在讓方法變成歸還連接。
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}