使用动态代理实现用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);
}fina