zoukankan      html  css  js  c++  java
  • 使用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");
        }
    }
  • 相关阅读:
    [React Router v4] Render Catch-All Routes with the Switch Component
    [React Router v4] Render Nested Routes
    关系数据库规范化理论 函数依赖与范式理论
    Notepad++背景颜色设置
    initial pointer [expert c]
    世界微波射频领域传奇人物
    hdu 4619 Warm up 2 ( 二分图最大匹配 )
    关于数据的归档存入文件和读取文件
    android中通过自定义xml实现你需要的shape效果 xml属性配置
    Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
  • 原文地址:https://www.cnblogs.com/dzcici/p/10142989.html
Copyright © 2011-2022 走看看