程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 使用動態代理實現用AOP對數據庫進行操作

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

編輯:JAVA編程入門知識
要實現對數據庫的操作,離不開數據源(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();
          …………………………………………
  一系列操作
  …………………………………………
  }
  
      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!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved