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);
}
}