使用动态代理实现用AOP对数据库进行操作
生活随笔
收集整理的這篇文章主要介紹了
使用动态代理实现用AOP对数据库进行操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用動態代理實現用AOP對數據庫進行操作
2008-03-14 11:04 作者:reverocean 來源:賽迪網
[摘要] 要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。 [關鍵字] 動態代理 AOP 數據庫
要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。現在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:
在分別討論這兩種方法之前,我們需要先討論一下在處理數據庫的時候的異常的處理。我這里做了一個TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應用框架處理這個異常。下面試這個類的代碼:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通過方法的第一個參數傳進去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 攔截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要進行事務處理的方法的開頭,這個方法可以寫成一個從配置文件里面去讀,這里我就寫死在里面了。只是對insert和update開頭的方法進行事務控制。
2) 將Connection對象放在ThreadLocal中
l ConnectionUtil類:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
實現自己獲取連接的代碼
return null;
}
}
l DAO類
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一頁>>
關鍵詞: 動態代理, AOP, 數據庫,
* 相關文章
1、使用“DB2”數據庫臨時表的6個注意事項
2、大型數據庫的設計原則與開發技巧
3、如何從數據庫查詢結果集中獲得隨機結果
4、關于Access數據庫4種安全方式
5、講解SQL Server 2005數據庫的同義詞Bug
6、如何防止插入刪除表造成的數據庫死鎖
7、詳細講解Oracle表分區相關概念及優點
8、詳細講解各種數據庫使用JDBC連接的方式
9、數據庫相關--Hibernate的事務和并發
10、Linux系統安全機制進階分析
11、安全的配置和應用MySQL數據庫
12、哪些因素可以影響Oracle數據庫的性能
13、SQL端口改變后的遠程連接和數據庫連接
14、Delphi編程:三層數據庫構架實例解析
15、對一些代碼加密后再放到Oracle數據庫中
16、SQL Server 2008關系數據庫引擎新增功能
17、J2EE綜合:業務邏輯和數據庫的訪問決策
18、J2EE綜合--業務邏輯和數據庫訪問決策
19、融會貫通Oracle數據庫的25條基本知識
20、exp的版本高于數據庫版本導出時出現報錯
21、使用“DB2”數據庫臨時表的6個注意事項
* 我要留言
論壇焦點
*
* PLSQL程序設計
*
* 經典資料3----oracle培訓18天老師
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函數大全
*
* 提供點ORACLE9i_優化設計與系統調整
*
* ORACLE初始化參數詳解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初學者的好書,圖文講解
*
* oracle超級幫助文件(中文版)-OR
*
* Oracle SQL 內置函數大全
技術分類
* 微軟技術
* vista Windows ISA Exchange SharePoint
* Oracle
* 入門與認證 數據庫管理 開發應用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 數據庫
* SQL Server Sybase DB2 Access MySQL
* WEB開發
* ASP JSP PHP JavaScript VB VC
* JAVA開發
* J2SE J2EE J2ME Web Services XML
開源 SOA Eclipse Jbuilder
* NET開發
* C# J# ASP.NET VB.NET VC.NET C++
* 圖形設計
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒體技術
* Authorware MAYA 3Dmax Flash
* 虛擬技術
* vmware Virtual PC Virtuozzo xen
* 其他技術
* 中間件 嵌入式開發 移動開發 游戲開發
關于硅谷動力 | 廣告服務 | 版權聲明 | 加入硅谷動力 | 聯系我們 | 建議/投訴 | 網站導航 | 加入收藏
網站合作、內容監督、商務咨詢、投訴建議:010-65245588
合作建議:hezuo@mail.enet.com.cn
2008-03-14 11:04 作者:reverocean 來源:賽迪網
[摘要] 要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。 [關鍵字] 動態代理 AOP 數據庫
要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。現在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:
在分別討論這兩種方法之前,我們需要先討論一下在處理數據庫的時候的異常的處理。我這里做了一個TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應用框架處理這個異常。下面試這個類的代碼:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通過方法的第一個參數傳進去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 攔截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要進行事務處理的方法的開頭,這個方法可以寫成一個從配置文件里面去讀,這里我就寫死在里面了。只是對insert和update開頭的方法進行事務控制。
2) 將Connection對象放在ThreadLocal中
l ConnectionUtil類:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
實現自己獲取連接的代碼
return null;
}
}
l DAO類
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一頁>>
關鍵詞: 動態代理, AOP, 數據庫,
* 相關文章
1、使用“DB2”數據庫臨時表的6個注意事項
2、大型數據庫的設計原則與開發技巧
3、如何從數據庫查詢結果集中獲得隨機結果
4、關于Access數據庫4種安全方式
5、講解SQL Server 2005數據庫的同義詞Bug
6、如何防止插入刪除表造成的數據庫死鎖
7、詳細講解Oracle表分區相關概念及優點
8、詳細講解各種數據庫使用JDBC連接的方式
9、數據庫相關--Hibernate的事務和并發
10、Linux系統安全機制進階分析
11、安全的配置和應用MySQL數據庫
12、哪些因素可以影響Oracle數據庫的性能
13、SQL端口改變后的遠程連接和數據庫連接
14、Delphi編程:三層數據庫構架實例解析
15、對一些代碼加密后再放到Oracle數據庫中
16、SQL Server 2008關系數據庫引擎新增功能
17、J2EE綜合:業務邏輯和數據庫的訪問決策
18、J2EE綜合--業務邏輯和數據庫訪問決策
19、融會貫通Oracle數據庫的25條基本知識
20、exp的版本高于數據庫版本導出時出現報錯
21、使用“DB2”數據庫臨時表的6個注意事項
* 我要留言
論壇焦點
*
* PLSQL程序設計
*
* 經典資料3----oracle培訓18天老師
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函數大全
*
* 提供點ORACLE9i_優化設計與系統調整
*
* ORACLE初始化參數詳解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初學者的好書,圖文講解
*
* oracle超級幫助文件(中文版)-OR
*
* Oracle SQL 內置函數大全
技術分類
* 微軟技術
* vista Windows ISA Exchange SharePoint
* Oracle
* 入門與認證 數據庫管理 開發應用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 數據庫
* SQL Server Sybase DB2 Access MySQL
* WEB開發
* ASP JSP PHP JavaScript VB VC
* JAVA開發
* J2SE J2EE J2ME Web Services XML
開源 SOA Eclipse Jbuilder
* NET開發
* C# J# ASP.NET VB.NET VC.NET C++
* 圖形設計
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒體技術
* Authorware MAYA 3Dmax Flash
* 虛擬技術
* vmware Virtual PC Virtuozzo xen
* 其他技術
* 中間件 嵌入式開發 移動開發 游戲開發
關于硅谷動力 | 廣告服務 | 版權聲明 | 加入硅谷動力 | 聯系我們 | 建議/投訴 | 網站導航 | 加入收藏
網站合作、內容監督、商務咨詢、投訴建議:010-65245588
合作建議:hezuo@mail.enet.com.cn
總結
以上是生活随笔為你收集整理的使用动态代理实现用AOP对数据库进行操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个GaussDB常用的对象语句
- 下一篇: 《MATLAB智能算法30个案例》:第2