静态代理与JDBC事务管理

本文介绍了Java中的静态代理技术,通过静态代理来实现JDBC事务管理。首先讲解了静态代理的基本概念,即代理类在编译时确定且不可修改。接着,介绍了用于JDBC操作的工具类,然后定义了代理接口。接着详细阐述了委托类,它负责具体的业务处理。代理类实现了这个接口,负责在业务执行前后进行事务的开启和提交/回滚。最后,通过测试类验证了代理类在事务管理中的应用。
摘要由CSDN通过智能技术生成

1、什么是静态代理
静态代理:代理类在编译时生成。简单来说就是在进行编译的过程中,代理类和委托类都已经确定了,不能修改了—硬编码,无法扩展和复用。
2、JDBC工具类

public class DBUtil {
    private static String url = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true";
    private static String username = "root";
    private static String password = "root";
    //此处的jar包根据自己的mysql版本选择
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    public static Connection connectDB() throws Exception {
        // 1、加载数据库驱动
        Class.forName(DRIVER);
        // 2、获取数据库连接
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }
    // 设置事务手动提交
    public static void benigTransction(Connection conn) {
        try {
            if (conn != null) {
                if (conn.getAutoCommit()) {
                    conn.setAutoCommit(false);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 提交事务
    public static void endTransction(Connection conn) {
        try {
            if (conn != null) {
                if (!conn.getAutoCommit()) {
                    conn.commit();
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 发生异常回滚事务
    public static void rollback(Connection conn) {
        try {
            if (conn != null) {
                conn.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3、代理接口

public interface Subject {
    /**
     * 执行给定名字的任务
     *
     * @param order
     */
    void order(Order order);
}

4、 委托类,具体处理业务。

@Slf4j
public class RealSubject implements Subject {
    /**
     * 执行给定名字的任务
     *
     * @param order
     */
    @Override
    @Transactional
    public void order(Order order) {
        Connection conn = null;
        conn = DBUtil.connectDB();
        //此处为了方便,就只写了一个参数
        String sql = "INSERT INTO t_order(id) VALUES( ?)";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, order.getId());
        pstmt.execute();
    }
}

5、代理类,实现了代理接口

public class ProxySubject implements Subject {
    /**
     * 代理类持有一个委托类的对象引用
     */
    private RealSubject realSubject;

    ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    /**
     * 将请求分派给委托类执行
     *
     * @param order
     */
    @Override
    public void order(Order order) {
    //此处需要加上异常的处理
        Connection conn = DBUtil.connectDB();
        realSubject.order(order);
        DBUtil.endTransction(conn);
    }
 }

6、测试类

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class ProxyTest {

    /**
     * 静态代理测试
     */
    @Test
    public void testStaticProxy() {
        Subject instance = StaticProxyFactory.getInstance();
        Order order = new Order();
        order.setName("静态测试");
        instance.order(order);
    }    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值