00:00
好,这个插件我们看完了以后呢,那么我们接下来,哎,就应该知道咱们这个插件的流程,哎,就是用我们这个插件为我们目标对象产生一个动态代理,接下来呢,目标对象的目标方法要执行的时候,都会来到我们代理对象的intercept方法,而intercept方法只有我在这个方法里边给你调用invocation proceed给你放行了,你的目标方法才能执行,我不放行你就不能执行。所以说呢,我们可以在目标方法放行前后,我们做非常多的事情,以达到我们动态修改咱们这个马贝蒂斯咱们这个运行流程的这个事情。比如呢,我们以一个分页来说,我们想让一个非常普通的circle语句,哎,这个circle呢,比如就是我们原来的这个select。比如就是我们这个select select星from,我们这个TBL杠,咱们这个employee表,然后呢,它还带了一些where条件,我想让呢,一个非常普通的这个SQ语句能实现风页查询,那大家呢,就可以去拦截到我们这个查询方法,然后呢,在查询方法运行之前,我可以把这个S扣改造一下,改造成一个分页S扣,让它去运行分页S扣,这样的话呢,哎,我们就能实现分页效果了,当然复杂的一些操作,哎,我们就不做了,我们来演示一个简单的插件,这简单的插件怎么做呢?嗯,既然我们是拦截的statement对象的,咱们只要设置。
01:39
参数的方法,那么呢,我们就来动态的改变一下SQL运行的参数。动态的咱们只可以改变,改变一下咱们这个运行的参数。比如呢,我们以前以前呢,我们查询的是一号员工,现在呢,我让你看起来的效果,你虽然调方法查一号员工,实际啊从数据库里。
02:10
库查询三号,所以说呢,我想要做一个偷梁换柱这个事怎么做呢?哎,我们要怎么做,首先你就得搞清楚你拦你的这个拦截方法什么时候会执行,我们一定是STEM的对象,执行它的参数设置的时候会执行,所以说呢,我们可以在这里边能获得到我们当前拦截到的对象。到到咱们这个对象拦截到的对象呢,我们可以用invoc点,哎,我们来看啊,能获取到很多当前拦截到的这个对象用的这个参数,以及它的呃类型,它的当前拦截的方法,以及拦截的目标对象,我们可以看一下我们当前拦截的目标对象,这个目标对象呢,哎,就是我们这个死在他们的看到了,所以说我要拦截它,而我们现在要拦截它,以后呢,我们就得搞清楚它有什么用。
03:08
Handle里边诶能执行增删改查,但是之前呢,我们只是拦截这个参数预变异方法,所以说我们就来打开,哎,我们来看啊,这个sta看到了。我们把要拦截的东西的关系,我们得搞清楚啊,这是我们这个。看到了这是一个接口,哎,我们规定的接口,而实际呢,我们我们这一块是一个routine,看到了。而这个statement handle呢,它不重要,嗯,因为它里边呢,保存一个我们来看这个RO。CRC,好,Routine statement看到了,它里边呢,其实是根据我们是prepare呢,还是able,还是statementment会创建prepare的state,所以说呢,其实最终是这个我们拦截到对象,哎相当于就是它,哎是它,然后呢,我们可以来看一下。
04:09
这个handle里边呢,它就有我们这个。参数预编译方法,哎,就是它它呢借助我们啊handler。来设置我们参数,哎,这是咱们这个四大对象的,咱们这个参数处理器STEM handle呢,是借助咱们这个叫right米特。Handle了来设置参数的,哎,来借助它的,而这个handle了呢,我们来看啊,你看这都是我们这个statement handle里边的一个属性点进去,诶,你看这是有一个叫best statement handle,那所有的statement handle肯定都是这个best旗下的,我们就啊。不用这么说,过多的来说他了,好。然后呢,相当于handle是我们prepared handle属性。
05:04
而它呢,能执行参数设置。哎,就是它把它点开,我们呢,Permit handler,我们用的都是default,好它进行参数设置的时候呢,我们来看一下这个设置方法,这个设置方法呢,哎,其实它里边呢,就做一大堆,哎判断我们传过来的参数对象的值,哎给参数对象赋值等等来做一堆事,所以说呢,我们在这一块我们可以看到在它里边就会有咱们封装了咱们这个参数值的这个对象,哎,这个还没给值,虽然是final还没给值,如果你调用了get object就会返回值,好所以说呢,这里边哎,Private handle里边就有一些东西,这个map的statement我们都知道,这是我们,哎四大,哎不是四大对象,这是封装了我们当前增删改查详细信息的,而棒的circle是封装了我们circle的详细信息的。
06:04
所以说呢,Handle里边又会有这些东西,就说我想达到更改circle语句用的参数,那只需要改掉这个object就行了,或者呢,改掉咱们这个b circle,这就是我们circle语句的详细信息,它里边也有object,改掉它就行了,只不过这个object赋值是在构造器里赋的值,而咱们这一块呢,它没有S方法为它赋值,好,我们先放在这。也就是说呢,我们要改这些属性,你只要把这个对应的属性值改掉了,就能实现我们的效果好,要想改怎么办呢?非常简单,来到我们这个插件里边,看好我怎么做啊。我们现在想做的目效果就是拿到拿到拿到拿到谁呢?拿到拿到我们这个里边,里边的这个object值怎么拿呢?非常简单。
07:11
使了它里边的perter。看到了,哎,里边的咱们这个值叫object值。Primeterter object的值,所以说呢,非常简单,我们可以借助马有一个类叫c matter object,点你看啊,它有一个叫for object,能为我们当前对象,哎,我们当前正在拦截的对象是他,哎,这是我们拦截的目标对象。拿到我们这个目标对象的原数据,也就是说目标对象里边的啊,各种属性数据,拿到咱们这个target的原数据。
08:04
哎,比如呢,来操作,来操作这个matter object就能非常方便的得到我们这个target目标对象的所有属性的值,所以说呢,我们可以来可以看一下,我们先看一下object有一个东西叫get。来Y6GETY6就是获取哪个属性的值,而我们当前的这个对象呢,是一个statement handler,我们要获取它里边handler。的。的private object值你可以拿到没问题的,哎,只要是这个对象里面的属性就没问题来,我们可以打印一下咱们这个circle语句用的参数是是什么哎。这个Y6拿过来,来,我们来可以先看一下运行效果,走,我们看,哎,S与军用的参数是一没问题,我们拿到了,接下来呢,我们相当于只改这个参数的值就行了,那要想改那就更简单了,Matter object点有一个叫set y6有get就有set,哎,把这个把它里边para handle属性的para object的值改成,比如我来改成11,好。
09:26
接下来我们实现的效果就是你不管来,当我们改完修改完啊,我们偷梁换柱了啊,修改完咱们这个。SQ语句要用的参数,要用的参数以后呢,我们让它目标方法执行,我们来看。现在我们再来看我们调方法,查的是一号员工好,但是实际看返回的数据是谁呀,是不是11号啊,哎,这就达到了我们插件啊,定制我们这个增删改查效果,哎,我们就可以拦截到我们具体的位置,给大家提供一个写插件的思路,至于哎,至于插件的高深写法,大家也可以哎去多看一些插件,自己呢,或者多研究研究,只是呢,插件写的时候,你一定要搞清楚你所拦截到的当前对象里边的每一个属性,每一个内容都能干什么,我们就可以达到修改咱们这个当前对象里边的每一个东西。
10:28
好,这是我们一个简单的插件。
我来说两句