使用动态代理实现用AOP对数据库进行操作

2016-02-19 20:24 3 1 收藏

下面是个使用动态代理实现用AOP对数据库进行操作教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

要实现对数据库的操作,离不开数据源(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!

来源:https://www.tulaoshi.com/n/20160219/1623581.html

延伸阅读
从本节开始正式介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关操作,查看、建立和删除等操作。 用SHOW显示已有的数据库 句法:SHOW DATABASES [LIKE wild] 如果使用LIKE wild部分,wild字符串可以是一个使用SQL的“%”和“_”通配符的字符串。 功能:SHOW DATABASES列出在MySQL服务器主机上的数据库。 你可...
标签: Web开发
有的时候,我们经常需要把客户信息等一些资料发布到网上以便联系,但是随着客户资料的越来越多,网上更新是越来越力不从心,这该怎么办?其实,除了用asp、php等这些后台语言来实现快捷更新外,Dreamweaver本身就提供了数据导入与排序的方法,这对不懂后台的朋友来说绝对是个大大的福音,Dreamweaver从版本3到最新的MX一直都保留了该功能,可...
一 事务的概念 事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。 oracle的数据语音分为数据定义语言(DDL)、数据控制语言(DCL)和数据操纵语言(DML)。其中的DML语言会生成事务,其...
标签: ASP
  前段日子发表的文章,数据库的连接代码可以直接在ASP文件中显示出来。这次又进行了一次封装。 打开vb,新建Activex控件,工程名称为WebDb,类模块名称为GetInfomation 引用”Microsoft Activex Data Object 2.6 Library ” Private Conn As ADODB.Connection Private Rs As ADODB.Recordset ‘作用:判断数据库是否正确连结 '自...
标签: ASP
     其实,大家在书写asp程序时,最担心的可能就是数据库的连接信息,会被一些人看到,进行一些破坏。下面我们用vb6.0来做一个动态链接库(.dll)来隐藏数据库的连接信息。 启动vb6.0,新建--Active  dll工程。单击"工程"--引用,选择"microsoft  active  server  pages  object  library" ...

经验教程

191

收藏

58
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部