有個疑惑,如果不用框架開發,操作資料庫只用jdbc,那么獲取connection是不是只能寫在service方法里?比如一個公司新進一名員工,那么員工表里新增一條記錄, 部門表里的人員數量欄位數值要加一,這涉及到兩張表的操作,員工表對應YuanGongDaoImpl,部門表對應BuMenDaoImpl.
Service層的代碼是不是得這樣寫:
class xxxServiceImpl{
private YuanGongDao ygd = 省略;
privaet BuMenDao bmd = 省略;
void ZengJiaYuanGong(YuanGong yg){
// 獲取連接
Connection con = 省略;
// 開啟事務
con.setAutoCommit(false);
ygd.insert(yg);//新增員工記錄
bmd.update(String sql);//部門人員數量加一
con.commit();
con.close();
}
}
但是上面得con沒傳入 ygd.insert(yg)和bmd.update(String sql),那么這兩個方法也不能對資料庫操作啊,假如這兩個方法里各自new 一個新得con,那這個事務也操作不起來啊,如果是這樣的方法ygd.insert(yg,con)和bmd.update(String sql,con),好像也沒人這樣設計!
我看網上很多教程里面,講資料庫操作,都是把connection或者sqlsession等等設計成在在dao層里獲取,當然那些例子都只是對資料庫增刪改查,簡單的操作,我是想不明白,如果要用到事務,到底要怎么設計啊,不考慮使用框架!
uj5u.com熱心網友回復:
突然想到,如果在service層里把con存盤到執行緒里,然后帶到dao層,這樣是不是可行?uj5u.com熱心網友回復:
spring的事務管理就是將connection存到ThreadLocal里的,只是你自己要寫好也不容易,比如service呼叫service你的connection該在哪里獲取,在哪里提交?
uj5u.com熱心網友回復:
如果不用框架的話,你除了在dao內設計正常的添加,洗掉,查詢,更新方法以外你還要設計一個鏈接資料庫方法,框架是通過bean注入方式鏈接資料庫的,不用框架的話你需要自己撰寫出來。
uj5u.com熱心網友回復:
不使用框架的話,一般會定義一個Connection的工具來,來獲取連接、執行sql、獲取結果集,執行完后釋放連接。開啟事務就是設定下aotucommit的事情。uj5u.com熱心網友回復:
大部分情況下都是一條sql一個connection,事物自動提交,自己寫一個DBUtil就能搞定,多條sql一個connection,一起提交事物,可以參考如下代碼:
/**
* 批量執行多條SQL
*
* @param connection 資料庫連接
* @param sqls 多條更新陳述句
*/
public static void moreSql(Connection connection, JSONArray sqls) {
Statement statement = null;
try {
connection.setAutoCommit(false);
statement = connection.createStatement();
for (Object sql : sqls) {
if (null != sql && !ToolUtil.isBlank(sql.toString())) {
SqlUtil.show(sql.toString(), null, null);
statement.addBatch(sql.toString());
}
}
statement.executeBatch();// 執行更新
connection.commit();// 統一提交事務
statement.clearBatch();// 清除批量
} catch (Exception e) {
try {
connection.rollback();// 事務回滾
} catch (Exception e2) {
}
throw new RuntimeException(e);
} finally {
ReflectUtil.close(connection, statement);
}
}
uj5u.com熱心網友回復:
你在dao層 新加一個處理事務的方法把獲取連接去掉 在ServiceImpl層獲取就行了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49450.html
標籤:Web 開發
下一篇:c/s程式
