静态代理
静态代理,动态代理----都属于代理设计模式,让代理角色帮助真实角色完成一个事情;
从代码角度去讲:将业务代码和系统监控相关代码(权限校验,系统日志的产生)进行分离;
静态代理:
特点:
代理角色和真实角色需要实现同一个接口;类似多线程的实现方式第二种
class MyRunnable implements Runnable{
public void run(){
//..
//完成耗时的操作
}
}
//本身Thread类
class Thread implements Runnable{
private Runnable target ;
public Thread(Runnable target){
//初始化的操作
}
//重写run方法
public void run(){
if(target !=null){
target.run() ;
}
}
}
jdk动态代理
/*jdk动态代理: 使用反射的方式,在程序执行过程中产生代理对象---->利用反射调用接口中的方法,前提条件
必须基于接口,才能完成jdk动态代理;
*/
//java.lang.reflect.Proxy 代理
public static Object newProxyInstance(ClassLoader classloader,Class[] interfaces,InvocationHandler handler)
//在第三个参数InvocationHandler:基于代理的处理程序---需要调用我们接口的方法
/**
* @author Kuke
* @date 2022/5/16
* 针对用户访问的数据接口
*/
public interface UserDao {
/**
* 添加功能
*/
void add() ;
/**
* 修改功能
*/
void update() ;
/**
* 查询功能
*/
void select() ;
/**
* 删除功能
*/
void delete() ;
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 基于代理的处理程序
*/
public class MyInvocationhandler implements InvocationHandler {
//要针对谁产生代理: ud UserDao ud = new UserDaoImpl() ;
private Object target ; //因为代理角色可以是任意Java类型,所
// 以用Object
public MyInvocationhandler(Object target){
this.target = target ;
}
//方法的返回值就是代理对象
@Override //就是我们的接口的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限校验") ;
//调用接口的列表自己的方法:update(),delete(),add(),select()
//当前实例--->真实角色
Object obj = method.invoke(target, args); //调用方法产生的返回值
System.out.println("产生日志文件");
return obj;
}
}
//测试类
public class JdkProxyDemo {
public static void main(String[] args) {
//接口多态:测试UserDao
UserDao ud = new UserDaoImpl() ; //真实角色
//版本1:现在需要对功能增强,这个代码不合适!
ud.add();
ud.update();
ud.select();
ud.delete();
System.out.println("----------------Jdk动态代理------------------");
//前提示需要一个接口:UserDao
MyInvocationhandler handler = new MyInvocationhandler(ud) ;
// public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//代理角色proxyInstance
UserDao proxyInstance = (UserDao) Proxy.newProxyInstance(
ud.getClassLoader(),
ud.getClass().getInterfaces(),
handler);
proxyInstance.add();
proxyInstance.update();
proxyInstance.select();
proxyInstance.delete();
}
}
级联操作
级联操作cascade:当修改或者删除主表的数据,从表随之变化;
级联修改:on update cascade
级联删除:on delete cascade
创建主表
create table 主表名(
id int primary key auto_increment,
字段名1 字段类型1,
字段名2 字段类型2
);
创建从表
create table 从表名(
id int primary key auto_increment,
字段名1 字段类型1,
字段名2 字段类型2,
外键字段名 外键字段类型,
constraint 外键约束名 foreign key (外键字段名) references 主表(主键字段名)
on update cascade on delete cascade
);
级联修改(修改主表的数据):
update 主表名 set 修改结果 where 条件
级联删除(删除主表的数据,从表数据随之删除):
delete from 主表名 where 条件
通过sql删除外键
alter table 表名 drop foreign key 外键名称
通过sql添加外键
alter table 表名 add constraint 外键约束名 foreign key (外键字段名)
references 主表(主键字段名) on update cascade on delete cascade