• 使用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");
        }
    }
  • 相关阅读:
    关于自定义UICollectionViewLayout的一点个人理解<一>
    自定义进度条
    iOS 无限轮播图的两种实现
    图片的拉伸
    关于plist文件
    加载gif图过渡效果
    关于textView的字数限制
    php-fpm服务启动脚本
    转载:PHP支付宝接口RSA验证
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/dzcici/p/10142989.html
Copyright © 2020-2023  润新知