mysql中级联操作 CASCADE
ON DELETE CASCADE :级联删除
ON UPDATE CASCADE :级联修改
当前更新/删除主表的数据,从表数据的随之变化!
-- 修改主表的数据,1号部门---3号部门 (级联修改)
UPDATE dept SET id = 3 WHERE id = 1;
-- 删除主表的数据,从表数据随之删除...(级联删除)
DELETE FROM dept WHERE id = 2 ;
-- sql删除外键 alter table 表名 drop FOREIGN KEY 外键名称;
ALTER TABLE emp DROP FOREIGN KEY dept_emp_fk;
-- 通过sql添加外键
-- alter table 表名
-- add CONSTRAINT 外键名称 FOREIGN KEY 从表的某个id
-- REFERENCES
-- 主表的某个字段(主键字段id)
-- 级联修改
-- 级联删除
ALTER TABLE emp
ADD CONSTRAINT dept_emp_fk FOREIGN KEY
(dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE ;
静态代理/jdk动态代理
静态代理是指,在程序运行前,由程序员创建或特定工具自动生成源代码并对其编译生成.class文件。
静态代理的特点: 代理角色和真实角色都需要实现同一个接口
真实角色专注于自己的事情
代理角色目的就是帮助真实角色完成一件事情
jdk动态代理:是在程序的执行过程中,通过反射产生的代理对象!
jdk动态代理特点:基于接口实现的
静态代理
静态代理需要手写代理实现类去实现接口,并去重写接口中的每个方法。
非常不灵活且麻烦,因为需要对每一个目标对象创建一个实现类;而且一旦接口中新增一个方法,目标对象和实现类都需要进行相应的调整
实现步骤
定义一个接口和实现类;
创建一个代理实现类同样实现这个接口;
将目标对象注入到代理类,然后在代理类的对应方法调用目标对象的相应方法
动态代理
与静态代理相比,动态代理更加灵活。我们不需要针对每一个目标对象都单独创建一个代理类,并且也不必须要实现接口,可以直接代理类。
从 JVM 层面来说,动态代理是在运行时期动态生成类字节码并加载到 JVM 中去。
动态代理的实现方式有很多种,最主要的还是 JDK 动态代理 和 CGLIB 动态代理。
JDK 动态代理
JDK 动态代理是对实现了接口的实现类进行代理。
JDK 动态代理的核心是 InvocationHandleer 接口 和 Proxy 类。
Proxy 类
Proxy 类中使用频率最高的方法是 newProxyInstance,用来生成一个代理对象。
参数:
loader:类加载器,用来加载代理对象;
interfaces:被代理类实现的一些接口;
h:实现了 InvocationHandler 接口的对象
InvocationHandler 接口
要实现 JDK 动态代理,还需要实现 InvocationHandler 接口来自定义增强逻辑,当我们代理对象调用一个方法时,方法的调用会自动转到 InvocationHandler 实现类的 invoke() 方法上。
参数:
proxy:动态生成的代理类;
method:与代理对象调用的方法相对应;
args:method 方法相对应的参数
当你通过 Proxy 类的 newProxyInstance 方法创建的代理对象调用一个方法时,实际上会调用到 InvocationHandler 实现类的 invoke() 方法,可以 在 invoke() 方法内增加自定义的逻辑来增强原生方法。
实现步骤:
定义一个接口和实现类;
定义一个类去实现 InvocationHandler 接口并重写 invoke() 方法,在 invoke() 方法内调用原生方法并自定义增强该方法;
通过 Proxy 类的 newProxyInstance 方法创建一个代理对象