使用动态代理实现用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
使用动态代理实现用AOP对数据库进行操作相关推荐
- 了解动态代理:Spring AOP基础
为什么选择AOP: 要了解AOP(面向方面的编程),我们需要了解软件开发中的"横切关注点". 在每个项目中,都有一定数量的代码在多个类,多个模块中重复执行,例如几乎所有类和所有 ...
- java使用动态代理来实现AOP(日志记录)的实例代码
AOP(面向方面)的思想,就是把项目共同的那部分功能分离开来,比如日志记录,避免在业务逻辑里面夹杂着跟业务逻辑无关的代码 id="cproIframe_u1892994_2" wi ...
- 4种实例 advice aop_JAVA动态代理 和 Spring AOP 4种通知的简单实现
学习Spring AOP 之前,先要了解下JAVA的动态代理.如果不清楚动态代理的概念就百度一下吧.废话不多说,直接上代码. 我们模拟一个简单的登录 首先我们创建一个用户登录的接口 package c ...
- AOP的实现原理 —— 静态代理 和 动态代理( Spring AOP)
文章目录 一.AOP是什么? 二.静态代理 -- AspectJ 2.1.举例说明 三. 动态代理 3.1.JDK 动态代理 3.1.1. 核心类: 3.1.2. 示例1--JDK动态代理 3.2.C ...
- 【转】.NET 自带的动态代理+Expression 实现AOP
下面代码(摘抄之别处,原创在哪不知)是采用TransparentProxy和RealProxy实现对象的动态代理.碍于其使用反射调用方法,所以就小试着将反射改成Expression以提高执行的效率.第 ...
- Spring AOP中的静态代理和动态代理的原理和实践
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...
- AOP动态代理的实现机制
2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...
- .NET 下基于动态代理的 AOP 框架实现揭秘
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 基于 Roslyn 实现一个简单的条件解析引擎 执行过程中会 ...
- AOP的底层实现-CGLIB动态代理和JDK动态代理
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...
最新文章
- 【vsftpd】嵌入式linux简易配置vsftpd服务
- python range函数范围_Python range函数
- linux脚本done报错,linux – 如何在shell脚本中处理错误/异常?
- 机械齿轮网站404单页源码
- Python中的全局变量与局部变量2
- (55)Verilog HDL双沿采样设计
- (转)hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大框架整合
- 140303 命令行选项 ccf
- 第十至十二章 算法分析--高阶数据结构
- Microsoft JDBC Driver 4.0 for SQL Server
- php接口返回一个数组怎末写_PHP写api接口怎么写啊,有什么具体的例子吗?
- 路飞学城—Python—爬虫实战密训班 第三章
- 这辈子都没有好好的认认真真的过过一天
- apache cxf之 一个简单的JAX-WS服务程序
- 使用Go语言实现单词翻译功能/simpledict 命令行词典
- 基于.net的当下传统制造业MES系统的思考(一)
- Android ListView异步获取网络图片
- T470P笔记本安装固态以及固态中安装系统_完整步骤
- Calibre for Mac v5.20.0 中文版 电子书阅读管理工具
- 初读Geoffrey Hinton颠覆之作《Dynamic Routing Between Capsules》