使用AOP思想封装JDBC

看代码

package learning.aop2;

import org.springframework.stereotype.Component;

import java.sql.SQLException;
@Component
public class UserDAO {

    public void getAddUser(String name) throws SQLException {
        ConnMariaDB.getConn().createStatement().
                execute("insert into user(name) VALUE (‘" + name + "‘)");
    }

}

得到连接

package learning.aop2;

import java.sql.Connection;

public class ConnMariaDB {
    public static ThreadLocal<Connection> threadLocal = null;

    public static Connection getConn() {
        return threadLocal.get();
    }
}

调用方法前往当前线程注入一个连接再调用

package learning.aop2;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

@Component
@Aspect
public class JDBCAdvice {

    @Around("execution(* learning.aop2.UserDAO.*(..))")
    public Object wrapDAO(ProceedingJoinPoint joinPoint) throws Throwable {
        Connection conn = null;
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/user", "root", "dz520123");
            conn.setAutoCommit(false);

            ConnMariaDB.threadLocal = new ThreadLocal<Connection>();
            ConnMariaDB.threadLocal.set(conn);

            Object proceed = joinPoint.proceed();

            conn.commit();

            return proceed;
        } catch (Throwable throwable) {
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException e) {
                }
            }
            throwable.printStackTrace();
            throw throwable;
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}

扫描包

package learning.aop2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan(basePackages = "learning.aop2")
@EnableAspectJAutoProxy
public class SpringConfig {
}

测试.java

package learning.aop2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) throws SQLException {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        UserDAO bean = applicationContext.getBean(UserDAO.class);
        bean.getAddUser("nihao");
    }
}

原文地址:https://www.cnblogs.com/dzcici/p/10142989.html

时间: 2024-08-30 14:43:53

使用AOP思想封装JDBC的相关文章

java8的lambdas表达式模拟aop思想,封装一下锁功能

java8的lambdas,其实在编译后,会变为此类中的方法,lambdas表达式只不过是一种简单的语法.lambdas表达式其实就是模拟的c,c++语言中的函数指针,这两个语言都可以把函数当作方法的参数传递,但java中就不行了,因为java中一切都是类,方法必须依附于类而存活. 这就免不了java8之前出现的匿名类.不过java8简化了语法,但和命名类还是有实质的区别.我们可以利用aop思想,封装一下通用逻辑,客户端不必要考虑的非业务逻辑,而那些业务逻辑就可以通过lambdas表达式传入.

Sping之AOP思想

AOP是指面向切面编程,横向重复,纵向提取.在最早接触AOP思想是从servlet开始的,代码如下,设置字符集,通过filter统一设置. 1 @Override 2 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 3 throws IOException, ServletException { 4 request.setCharacterEncoding("UTF

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

Java - 面向对象思想进行JDBC编程

mysql-connector-java-5.1.7-bin.jar jdbc.properties driver=com.mysql.jdbc.Driver jdbcUrl=jdbc\:mysql\://localhost\:3306/lesson user=root password= JDBCTools.java package 面向对象思想进行JDBC编程; import java.io.IOException; import java.io.InputStream; import ja

规范和封装jdbc程序代码

JDBC 部分方法引用工具类 1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class jdbcUtils { 10 11 private static String

spring框架学习(四)AOP思想

导包 aop思想介绍 横向重复,纵向抽取 spring中的aop概念 spring实现aop的原理 1.动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术 2.cglib代理(没有接口) 第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理. aop名词学习

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

责任链模式进阶:与AOP思想的融合与应用

摘要: AOP的理念可以很容易抽象出横切关注点,基于AOP理念我们可以将责任链模式中各具体处理角色中共同的实现责任链结构的行为抽象出来并将其模块化,以便进一步提高代码复用率和系统可维护性.实际上,无论是Java Web中的过滤器,还是Struts2中的Interceptor,它们都是责任链模式与AOP思想互相融合的巧妙实践.为了更进一步理解AOP (Aspect-Oriented Programming,AOP) 和 CoR (Chain of Responsibility),本文还概述了Fil