MySQL_4

静态代理

静态代理,动态代理----都属于代理设计模式,让代理角色帮助真实角色完成一个事情;
从代码角度去讲:将业务代码和系统监控相关代码(权限校验,系统日志的产生)进行分离;
静态代理:
    特点:
       代理角色和真实角色需要实现同一个接口;类似多线程的实现方式第二种
  
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
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值