亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用動態代理實現用AOP對數據庫進行操作

2019-11-17 04:59:29
字體:
來源:轉載
供稿:網友
要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)?,F在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:
在分別討論這兩種方法之前,我們需要先討論一下在處理數據庫的時候的異常的處理。我這里做了一個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();
        …………………………………………
一系列操作
…………………………………………
}

    private Connection getConnection(){
        return ConnectionUtil.getConnection();
    }
    
}
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 = getConnection();
            try {
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                throw new TransactionException(e);
            }
        }
    }

    public void after(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = getConnection();
            try {
                conn.commit();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                        releaseConnection(conn);
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }

    public void exceptionThrow(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = getConnection();
            try {
                conn.rollback();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                        releaseConnection(conn);
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }
    
    private Connection getConnection(){
        return ConnectionUtil.getConnection();
    }
    
    private void releaseConnection(Connection conn){
        ConnectionUtil.releaseConnection(conn);
    }
    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;
    }
}
    最后將這個攔截器添加到AOP攔截框架中去,InterceptorHandler類中的getIntercetors方法中添加一個:

    private synchronized List getIntercetors(){
        if(null == interceptors){
            interceptors = new ArrayList();
            ……………………………………
interceptors.add(new TransactionInterceptor ());
            ……………………………………
        }
        return interceptors;
}

到此全部ok!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成年人免费电影| 欧美影院久久久| 亚洲视频在线观看网站| 久久久亚洲影院你懂的| 最近2019免费中文字幕视频三| 日韩美女写真福利在线观看| 欧美孕妇毛茸茸xxxx| 乱亲女秽乱长久久久| 岛国精品视频在线播放| 亚洲一区二区免费| 欧美综合国产精品久久丁香| 永久免费精品影视网站| 日韩电视剧免费观看网站| 日韩精品欧美国产精品忘忧草| 久久久精品影院| 日韩精品视频免费| 国产成人精品在线视频| 欧美有码在线观看视频| 欧美午夜美女看片| 久久久极品av| 亚洲男人的天堂在线| 欧美激情视频免费观看| 国产有码在线一区二区视频| 国产精品高潮粉嫩av| 亚洲欧美自拍一区| 日韩在线视频导航| 久久综合网hezyo| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品专区h在线观看| 欧美成人在线免费视频| 国产精品福利在线观看网址| 91免费看片在线| 日韩av在线播放资源| 国产精品久久久久久中文字| 日韩激情片免费| 日韩美女视频在线观看| 国产精品日韩在线播放| 久久精品中文字幕免费mv| 亚洲欧洲一区二区三区久久| 在线播放日韩专区| 日韩中文字幕网址| 国产精品美女久久久免费| 亚洲精品二三区| 欧美与欧洲交xxxx免费观看| 亚洲精品自拍偷拍| 日韩在线观看你懂的| 另类少妇人与禽zozz0性伦| 成人网在线免费看| 亚洲精品视频在线播放| 亚洲福利视频网| 国产精品爽爽爽| 国产免费一区视频观看免费| 另类少妇人与禽zozz0性伦| 亚洲国产另类 国产精品国产免费| 九九热这里只有精品6| 欧美夫妻性生活视频| 欧美成人合集magnet| 日韩在线视频线视频免费网站| 美女撒尿一区二区三区| 欧美精品亚州精品| 亚洲国产欧美精品| 日韩在线欧美在线| 欧美日韩精品在线观看| 国产精品久久久久久中文字| 国产日本欧美一区二区三区| 亚洲最新在线视频| 国产精品扒开腿做爽爽爽的视频| 亚洲精品suv精品一区二区| 91中文精品字幕在线视频| 欧美在线视频免费观看| 欧美精品成人91久久久久久久| 性欧美视频videos6一9| www.亚洲天堂| 精品久久国产精品| 欧洲亚洲免费在线| 欧美人成在线视频| 国产精品高精视频免费| 久久久人成影片一区二区三区| 91精品久久久久久久久中文字幕| 欧美日韩国产综合视频在线观看中文| 色无极影院亚洲| 国产精品亚洲第一区| 欧美电影免费观看电视剧大全| 久久久久久久久电影| 欧美激情视频网址| 亚洲午夜精品久久久久久久久久久久| 91久久夜色精品国产网站| 久久久av网站| 亚洲国产欧美久久| 欧美日韩国产一区二区三区| 久久精品99国产精品酒店日本| 欧美视频在线观看免费网址| 97视频在线免费观看| 成人黄色午夜影院| 国产精品丝袜视频| 亚洲视频在线观看网站| 日韩在线视频观看| 国产一区二区三区在线观看视频| 亚洲石原莉奈一区二区在线观看| 国产精品旅馆在线| 欧美成人一区二区三区电影| 国产成人在线亚洲欧美| 国产精品偷伦视频免费观看国产| 久久精品视频免费播放| 最近2019年手机中文字幕| 欧美专区日韩视频| 国产精品高潮呻吟久久av黑人| 在线观看视频亚洲| 久久久久一本一区二区青青蜜月| 日本精品中文字幕| 亚洲精品456在线播放狼人| 成人黄色av免费在线观看| 欧美大片在线看免费观看| 国产精品视频26uuu| 亚洲老头同性xxxxx| 欧美激情奇米色| 亚洲电影免费观看高清| 91香蕉嫩草影院入口| 久久九九免费视频| 日韩中文字幕免费视频| 国产有码在线一区二区视频| 亚洲a一级视频| 欧美午夜精品久久久久久人妖| 欧美成人四级hd版| 色偷偷噜噜噜亚洲男人| 欧美另类69精品久久久久9999| 日韩欧美综合在线视频| 久久久久久97| 欧美乱妇高清无乱码| 黑人欧美xxxx| 国产有码一区二区| 日韩国产欧美精品一区二区三区| 2021国产精品视频| 精品视频在线播放色网色视频| 国产精品久久久久久影视| 亚洲国产精品99| 中文字幕免费精品一区高清| 欧美亚洲一区在线| 91chinesevideo永久地址| 国产精品第一视频| 亚洲欧美激情精品一区二区| 国产成人精品视频在线| 久久精品91久久久久久再现| 国产精品永久免费观看| 国内精久久久久久久久久人| 亚洲精品乱码久久久久久按摩观| 久久久国产精品一区| 中文字幕亚洲欧美日韩在线不卡| 国产精品久久久久91| 亚洲美女av在线播放| 91精品久久久久久久| 久青草国产97香蕉在线视频| 欧美激情久久久| 久久综合免费视频| 隔壁老王国产在线精品| 最近2019中文字幕一页二页| 国产亚洲精品一区二区| 欧美专区在线播放| 亚洲欧美另类国产| 国产精品免费视频xxxx| 亚洲精品综合久久中文字幕| 亚洲系列中文字幕| 欧美成人免费大片| 午夜精品一区二区三区在线视频|