00:00
好,那么昨天大家遇到的问题最多的第二个呢,就是关于这个自动填充了,所以自动填充这块呢,我们先把。My matter object handler,嗯,这个类给它打开,然后呢,我们具体的来看一下,这里面有两个抽象方法的一个实现,一个是inser的费,在当前的这个数据记录呀,被增加的时候,那么它会被自动的调用,另外一个呢是update费,是在当前的这条数据记录被修改的时候,它会被自动的调用好,然后呢,接下来呢,我们来做测试,做测试的话呢,这里面呢有一个。嗯,Insert方法啊,还有一个呢,是R的方法都相对应的呢,可以在执行的时候调用刚才那两个抽象方法,那么我们以一个抽象方法为例,比如说我们以这个update为例来讲什么呢?来讲在我们的填充的过程当中,这个strict update file和strict insert file,它到底底层逻辑是什么,然后他俩的区别又是什么?好,那接下来呢,我们先在进行调试之前,在进行测试之前,我们先来走一下这样的一个代码,就是按住这个control哈,然后我们看一下strict update field的一个源码。
01:18
好,点进来之后,我们就可以看到这个my Meta object handler这个接口的这个源代码,那么这个源代码里面呢,它是调用了第221行的strict update field啊好,然后接下来呢,我们再来看上面的这个inser field的源代码,我们按住CTRL点进去,那么它调用的是一百八十五行的strict insert view,对不对啊,所以呢,一个调用的是这个代码啊,还有一个呢,是调用的。这个代码对不对?好,那我们分别来看这个代码调用了什么呢?调用了strict inser file,又进一步调用了它,好那么这个呢,就203行的这个strict insert field啊,然后接下来呢,刚才那个221行它调用了什么呢?调用的是这个对吧?好,我们再点进去,点进去之后呢,发现它调用的是230行的这个strict update费我们来比较一下刚才这两个方法的一个区别啊,一个是。
02:20
203行的啊这个。一个是他是吧,嗯。还有一个呢,是230行的。还有一个是他啊。好,你比较一下它们两个的区别呢,实际上就在这。一个呢是这是处对吧?啊,还有一个呢,就是。这是false是这意思吧,啊,所以呢,这个就是这两个的区别了,那么这两个区别,它到底这个就是产生了什么样的一个不同的结果呢?我们再仔细来看一下,所以呢,我们来看一下这两个方法,那么很显然他们调用的都是同一个方法,叫做strict feel,所以呢,我们直接点进去其中之一就可以了,我们点进来。
03:14
点进来之后呢,这个方法里面啊,它是有这样的一个逻辑的,然后这个逻辑里面,我们其实大家在走这个源代码的时候啊,不用就是每一个细节都去看啊,那你这样的话呢,其实针对于咱们面对于咱们解决问题这个这个角度来说的话,效率有点低,除非你就是想去呃借鉴一下的源代码,学习一下它的源代码啊,那现在我们要解决的问题是什么?就是这个布尔值,当它是true和false的时候,它究竟有什么区别,那所以我们就看这个布尔值出现在哪了啊,所以呢,大家看这个布尔值出现在了四个地方,这四个地方呢,分别是。哎哟,这么粗呢。
04:05
分别是这啊。还有这儿是不是啊,嗯,另外还有一个位置。这。和这是不是,所以只要咱们把这四个地方搞明白,咱们就知道这个insert和update的区别到底是什么了啊,所以呢,接下来呢,咱们来看一下这四个位置,这四个位置呢,首先第一这个呢叫insert fill,也就是说这个参数是否为真啊,然后第二这个呢,叫table info table INF是什么呢?Table info是咱们这个里面特别重要的一个对象,这个对象呢,是存在哪个里面的呢?是存在这个对象里面的。叫买卖object,那这个买object里面存什么呢?就存当前被操作的那个对象里面的所有的原数据信息,什么叫当前被操作的对象,比如说在这个地方我操作的对象呢,是user,对不对?好,那他就存user的所有的原数据信息,好那么它这里面会存什么呢?会存user的。
05:08
这个呃,它是什么类,它是什么类型的,比如说它是user类型的,User的权限定类名什么的都会存在这个里面,然后接下来他还会存什么呢?他还会存user所对应的这个数据库表里面。都有哪些列啊,然后这些列呢,它对应到我们的实体类当中,它对应的是哪个属性名,都会存到这个里面,那具体的是在这个里面的。一个叫做table ino的一个对象。啊好,所以table info里面呢,存的就是具体的我们的啊这个。实体类和表里面的列的一个具体的一个映射关系都会存到这个里面啊,那如果大家感兴趣的话呢,我们就可以在这个地方设置一个断点。然后一会我们代码执行的时候呢,我们可以进入到这个断点当中来进行一个判断,好那么在真正的去执行这个断点之前呢,我们先从这个字面意思来简单的猜测一下这句话到底是什么意思啊,所以说其实我其实我跟跟大家分享一个我自己读源代码的方式啊,我一开始去读这个源代码的时候,我不会说啊,一定要搞明白这句话到底是什么意思,然后去找到它的原始的一个调用,我就先猜。
06:30
什么叫猜呢?在咱们的这个Java的这个编程当中,甚至是一些整个的软件开发领域的编程当中,如果你养成一个良好的开发习惯的话,这个名字你一定起的是贱名之意的,就是你看到这个名字,一定要让这个代码的阅读者通过这个名字。不用通过注释直接就能够知道你这个代码是干什么的,明白吧,这样的话你才是一个最好的一个一个编程习惯啊。嗯,有些同学的编程习惯就是写一行代码,写十行注释什么得,是不是就就想把这行代码的这个意思给他,给他写明白,实际上其实最好的编程习惯是什么呀,是没有注释的代码啊,因我原来在外企工作哈,我们就是有一个编码规范,编码规范就是你的应用程序啊。
07:21
你如果能不写注释,你就不写注释,如果你能通过你的代码这个语言,把你的这个。应用程序的意思表达明白,那你就不用写注释,除非是非常必要的情况下再写注释,那现在咱们写程序有一个什么习惯呢?比如说我写一个函数,要public wide,要I是不是?好,然后大家一定要在这个上面呢,加一个注释对吧,叫增加哈。然后再写一下啊。你觉得这个有必要吗?其实是完全没有必要的,像原来我们的这个公司的编码习惯就是,如果是这样的话,你还不如不写,为什么?对于外国人来说这个你想他写注释怎么写爱的对吧?嗯,他写注释呢,实际上就是。
08:12
和方法名是一样的啊,如果我们把这个方法名起的特别好的话,那么实际上从这个方法名字上就直接能够体现出它的意思了啊,所以说呢,如果作为一个呃英语为母语国家的一个呃程序工程师来说的话呢,他写这样的一个注释其实是完全没有必要的,因为和他的方法名字一模一样,所以其实现在我们写注释是什么呀,我们写注释其实就是翻译。就是一个中英翻译,其实对不对啊,所以这个就是咱们为什么大家都愿意写注释的原因,就是因为你可能对这个英文还是不太敏感啊,呃,一定要翻译一下,所以呢,这个是我们之前的一个习惯,那当然了,这个里面,呃,由于他要这个生成API嘛,所以他就严格按照这个编码规范,要把这个API里面的这个相应的注释的内容呢,就给它写清楚,但是在这里面我提醒一下大家的就是什么,就是我们一定是能够通过这个。
09:11
对象的名字以及方法的名字,猜测到这个方法到底是做什么的啊,这个是我们可以通过一些标准的啊,尤其是框架底层的代码里面是可以体会到的,好,那现在我们就猜测一下,猜测一下的话呢,就是table in for is with insert。那刚才我提到了table info呢,它里面列出的是什么呀?列出的是当前被你操作的这个对象的所有的属性啊,也就是实体当中的属性信息,以及表当中的列信息,以及属性和列的一个对应关系的信息,那么在这个里面我们就能够判断出他有没有insert。Feel,什么叫insert fill,我们看user啊。
10:01
这个叫做feel。对吧,啊,这个就是它的feel类型,那么我们看当前的这个free time。它呢,就有一个叫做insert的feel对吧,那么update time它呢,既有insert feel又有update,这个可以理解吧,所以。这句话的意思就是判断我当前的user类的,当前的被修改的这个列里面有没有一个注解,这个注解的feel属性是insert。所以说白了就是如果当前被操作的被判断的这个字段啊是。C time的话,那么他就会判断一下time有没有。注解的这一部分属性的定义,如果有,那么这个方法就会返回处啊,就会返回处,同样后面这个也是一样的,判断一下当前的这一个列啊,有没有update。
11:10
这样的一个,呃,注解属性对不对,如果有的话,那么这个方法就会返回处啊,那也就是说如果当前。我们这条记录,也就是说这个对吧?Strict update feel,它针对的是谁来进行一个操作呀,Update time嘛,这个属性对不对啊,它针对update time这个属性进行操作,然后呢,接下来在我们的应用程序当中,通过Meta object会取出什么呢?会取出table INF for,好在这个table ino当中,然后呢,来判断我们当前所基于的这个列啊,所判断当前基的这就是field name嘛,好判断当前机遇的这个列里面有没有一个注解,这个注解有没有什么呀,有没有这个insert,如果有就返回出,这可以理解吧?啊,我再说一遍啊,判断你当前操作的这个列,也就是说我们的代码是从这来的,从这来肯定是传这个了,传这个了对不对,有效信息都在这个里面,判断这个列里面。
12:16
有没有?就是。Insert啊,这块有没有insert,如果有这块就返回出啊,然后再有呢,就是后面这个判断。这个列里面,或者是说这个属性里面有没有。Update注解,如果有的话,那么它就返回出好,那所以现在大家来看,如果我现在这个地方我调用的是update file的话。就证明什么呀,证明。这个值应该是false对吧,刚才咱们已经分析过了,如果是insert,这个值就是出,如果是update,这个值就是false,所以说呢,如果当前我是走的这段代码的话,那么呢,到这个地方他应该是false,好,这是false,然后呢,他会判断当前的你。
13:10
这个。记录里面有没有ins色或者是费,当然根据我们的这个呃,这个表达式的这样的一个呃特点,它直接就短路了是吧?啊,因为音色的feel等于false嘛,所以后面这块呢,它就不会去继续判断了,那我们就来到或语句,好来到或语句之后呢,音色的feel等于false,好整体的结果是个true,那么它就对这个地方进行判断,判断什么呢?判断当前的这个属性有没有update注解,那我们看看当前的这个属性哪个属性啊。Update time有没有update注解?有update注解是不是啊,就是ins色update,意思是它既有音色注解又有update注解的这样的一个属性的定义啊,那有update注解,如果有的话就说明什么呀?是不是这个if表达式就成立了,为true,为true的话就进行下面的操作,下面的操作是什么?你不用去仔细的看,就是为这个内容做自动填充,所有的自动填充的逻辑就在这个里面,所以前面全都是判断,判断什么我应不应该为它进行自动填充,好判断出来应该为它自动填充,那么在这个地方就做自动填充。
14:24
明白哈,所以呢,大家看。这个地方我如果写音色的可不可以?写音色的可不可以?写音色的话呢,就是首先。走到这个代码,走到这的时候。这个insert fill,它应该是什么?应该是true,对不对?好,然后接下来呢,判断一下当前的这个列有没有inser feel,判断谁。判断当前的update time有没有insert file。有没有有。明白吧,啊,当前我的这个update time是有insert这个属性的,所以它更不更新更新明白哈,所以在这个地方呢,通过前面的这第一个表达式,它已经返回处了,那么第一个表达式返回处了,后面是个或直接短路,后面这个部分的内容就不执行了,那么直接就又进入到了这个方法当中,那么他就会对我们当前的内容根据什么进行填充,根据你后面的这个内容。
15:28
进行一个填充,明白吧,所以这几个字段都是非常有必要的,好,那接下来呢,我们已经分析出这样的一个结论了,所以呢,我们来针对刚才我们啊分析出来猜测出来的他的这个。啊,应用程序的一个分支的一个走向呢,我们来进行一个判断,看看是不是验证了我们刚才的这个分析啊好,那接下来呢,大家看我们先按照正常的这个我昨天说的。比较严谨的这个流程来写一下。这样哈,然后呢,接下来呢,我现在这也设置一个断点啊,然后在这也设置一个断点,然后接下来呢,我在。
16:08
这个地方。这个地方咱们先不改,就是insert update是不是啊,然后呢,接下来呢,在这个地方我们来对它进行一个修改,这个修改的话呢,我们来明确一下,咱们的数据库当中是有33L这条记录的。33L。应该是他对吧,啊,我们嗯,把它改成最后一条吧,这样看起来方便一些啊。好,然后接下来呢,我们给他改一个,比如说改成99吧,然后在接下来呢,我们直接就执行debug啊,因为我们设断点了,大家要善于用这个debug,我们调试它。
17:04
好,接下来首先进入到这个断点当中,那因为在这个里面呢,我们还是有一个断点的,所以呢,我们直接就点击这个按钮,让它直接进入到下一个断点,好来到下一个断点,那么在这个断点当中呢,我们刚才判断。就是啊,因为我们这边用的是update file,所以呢,我们可以猜测到,或者说我们可以推断到这个音色的feel呢,它应该是个false,对吧?如果音色的feel是个false的话,那么是不是意味着直接就会来到这个后面的或语句当中去做判断呢?好,那么来到或语句当中去做判断的话呢,它实际上就是会走到哪啊,会走到这个is with update feel这个方法里面,然后。然后进行一个判断是吧,嗯,好,然后呢,我们看一下啊,In色few是个false,这块是个true,这块是个true,那它还要活,并且并且,所以它一定要判断这,一定要判断这的话,我们现在就要知道这个table in for里有啥,那么table in for里有啥呢?我们来看一下,在这个地方点开。
18:07
你看这里面的信息非常多啊,包括就是当前的这个user,它的这个数据类型是什么啊,好,包括包括它的这个ID的组件的生成策略是什么,包括它对应的数据库表的名字是什么,所以你从这个地方是不是可以看出它既有针对于当前的呃,这样的一个类的一个原数据,也有针对于当前的表的一个原数据呀,对吧?啊,然后这块也是一样的,你看这个是主键的列啊,这个叫主件的属性对不对?所以它就是我们的数据库表和实体的一个映射关系的,所有的原数据信息都在这里面存着呢啊,所以呢,我们可以从这个里面获取到好多的内容啊,然后呢,包括这个里面有一个。你看我们的这个SQL语句是吧。配置的这个SQL语句也在这个里面,然后再有呢,就是。
19:06
还有一些其他的内容,我就不一一给大家展开看了,有兴趣的话大家可以自己去展开看啊,然后matter object里面也有一些非常有用的一些信息,明白哈,还有这个,这里面有一些非常有用的一些信息,总之大家从这个地方能够得到的一个答案是什么呀?就这里面有我们很多原数据信息,然后另外呢,大家看最后这块。Strict fields,就是我当前要填充的这个字段叫什么啊,从这个地方我们可以判断出我我当前的这个字段的名字呢,就叫做update time是不是啊,所以大家可以自己把它展开啊,都可以看一看,然后这块呢,是我当前要填充的字段,我要填充什么类型的,我要填充的是local data time类型的,对吧?啊,所以说呢,你就可以知道了,这里面就会有非常丰富的内容啊,包括当前你要填充的字段是谁,是他当前你要填充的字段,它是属于哪个类的,是属于这个类的当前你要填充的字段,它对应数据库中的哪个表,是这个表当前你要填充的字段,这个类所对应的主键和这个表所对应的主键列是哪个是是这个对不对,都在这个里面有体现啊,所以呢,我们呢,在这个地方通过is with insert field,我再往下走一步啊。
20:26
点这个debug,然后在哪往下走呢?直接点step over就行了,往下走一步,我们直接看结论啊,是不是来到了这个if语句内部呀,那么既然来到了if语句内部的话,我们就可以知道了当前这个table in for。Is with update in for,它的返回值。我们再我看一下啊。点一下这个,呃,Evaluate expression啊叫计算表达式。
21:01
然后点evaluate,它的返回值是什么呀?是不是true呀?啊,也就是说明我们刚才走的这个代码实际上最后来到了或语句后面的这个表达式,然后呢,这个地方是true了,然后呢又对他进行了计算,最后他也计算出了一个true,所以最后呢才来到了这个if语句的里面,那么它为什么是true呢?就是因为当前我们操作的这个列,它是有update field的,什么叫做有update field呢?是这块。有update feel,那么言外之意就是如果当前你操作的这个列没有update feel的话,它实际上在走到最后的时候,是不是就不会走到这个if语句当中来呀,明白这个意思吧,啊好,所以呢,这是我们得出的第一个初步的结论,我们先把整个应用程序给它运行完好,那这个时候呢,我们的这个自动填充肯定就实现了,所以呢,在这个地方呢,我们刷新一下,看一看是不是今天09:01:09啊,对吧?所以这个是我们实现的一个自动填充,那么根据刚才我们的分析判断呢,我们可以得到一个结论就是这个地方有什么。
22:12
我们在这个地方就可以写什么,所以呢,我们刚才看到的是我们这个地方既有insert又有update,所以呢,我们这个地方是其实是写insert和update都可以的。明白这个逻辑吧,啊,是写insert和update都可以的,所以在这个地方我再给大家写一下insert啊,看一下它的业务逻辑是如何走的。呃,写好了之后呢,我们再来进行一个测试。还是debug方式啊。好,第八个进来,首先呢,这是我们第一个断点,接下来我们进入到我们的第二个断点,点这个好进来之后,那刚才因为我们写的是音色的方法。
23:02
这块写的是in色的方法,所以这个很明显这个ins色field的值应该等于true,那么既然这个等于true的话,那么它就会执行啊与符号后面的这个表达式的判断了,那这个表达式等于什么呢?我们还是右键。然后呢,Evaluate expression,然后对它进行计算,你会发现这个表达式也等于除,对不对,好,这个表达式的意思是什么呢?就是当前的这个列啊,判断当前的这个列它有没有insert feel,我们来看一下实际的情况,它有没有,它是有的,对不对,所以它有insert fill,它还是一个insert方法。啊,那么呢,他就会走到。这个代码段当中进行判断,那么这个代码段最后判断出来的结果是true,所以呢,就发生了短路,后面就不判断了,不判断了直接就进入到后面的这个流程当中,所以我们执行下一步看看是不是进来了,是不是进来了,进来了之后呢,我们让他执行这个,呃,应用程序的一个自动填充好,填充完成,填充完成之后我们再来看一下这面的这个结果啊,刷新一下。
24:08
大家看是不是也被更新了啊,这个结果好,那这个我们的第二个测试就做完了,第三个测试我们来看一下,假设说我们这块是insert field。好,然后这面我们没有insert,只有update,会不会完成自动填充,根据我们刚才的判断是不能够完成的,是不能够完成的,好,那我们来执行一下。还是我们的MYMY在这个地方呢,我们右键debug。好,那么进入到这个我们刚才的这个源代码当中啊,就是我们自己写的这个这个方法当中,然后我们还是点这个进入到源代码当中,那么在源代码当中呢,我们来先来人工的判断一下,首先我们这个地方写的是insert对不对,所以这个地方应该返回true啊,那在这地方我们也看到了,它确实是处是吧啊。
25:12
好,确实出,然后第二我们。这个地方如果是true的话,它就会走这段代码,判断当前的这个列里面有没有insert file,那我们来看一下有吗?没有,我们写的是update,所以说这样的话就匹配不上了,匹配不上了的话呢,那么这个位置很显然就会返回false,我们来看一下它是不是返回false。把它选中右键啊,然后呢,选这个evaluate expression,然后呢点击evaluate。哎,我看一下啊,返回table in for is insert field往下走一下啊。往下走。是不是没有?啊,好,走到哪了?
26:00
呃,好像我点错了哈,我重来一遍啊。重来一遍啊,咱们现在呢,我这个地方写的是in third feel是吧,Update time,然后user里面写的是。Update,是不是咱从来一遍啊?嗯,断点。断点在这儿。在这儿是吧,从来。右键。点击debug。好,然后接下来呢,我还是进入到刚才这个位置啊,然后现在呢,我呢就直接点下一步,刚才我点错了,点的是这实际上我应该点这啊step over点下一步,大家看点下一步的时候呢,它进入到的是。这个地方我看一下啊,好像有点。我先看一下这个方法返回的是true是吧。
27:02
这个方法返回的是。哎,不对呀,他应该返回。他应该返回的是false,我重新编一下我的程序啊,总感觉不太对。把它停掉。嗯,现在我的这个update time这块,我改的是update time吧。Update time,对啊。然后这块呢,我是。Update time。呃,我看一下啊,比如说我这块写update。然后这块写这个insert哈。
28:03
我试一下啊。应该是完成不了的。我在我直接做一个测试。好,然后呢,看数据库先。是吧,他是完成不了的。嗯。再走一遍啊这个代码。右键。然后debug。好,然后debug进来的时候呢,刚才我这面写的是,这回我写的是update是吧,然后接下来呢,我嗯。诶稍等啊,我是debug嘛。Debug。
29:04
诶,稍等我这个好像debug出现问题了,他现在不走断点了。Update。稍等稍等啊。这块写的是update是不是,然后这面我们断点断的是这块是吧。我把它关了啊,重开重开一下好像出现问题了呢。嗯,我先把这个target目录给它删一下啊。删掉。好,然后接下来呢,在。Src这个地方我们再重新的去把它测试一下。
30:04
In a。Map test是吧,然后呢,还是update,然后update呢,我们去更新这条记录,更新这条记录的话呢,在。User这个地方啊,我们还是应该写update,因为你如果不写update的话,它是不是不会走那个断点呀,是不是刚才出现问题,主要是这个原因啊,你要是不写update的话,不会走这个断点是吧?所以这块呢,我们还是写update,写update的话呢,然后这个地方呢,我们去写insert啊。还是之前我们的那个逻辑。Insert fill,然后这块呢,没有insert,只有update是吧,然后另外呢,就是这个地方我也给它改成。Update,为什么呢?因为刚才我们的那个业务一会我再说啊,我先把这个给他先删掉。
31:00
好先删掉,删掉之后呢,这个地方是update,然后这个地方呢,我先删掉,然后呢我再做测试,否则的话它容易对它进行干扰,什么样的干扰呢,一会我再给大家解释,咱们先来这样去测。啊,所以呢,这块呢是insert注意啊,然后这块呢是update注意,然后接下来呢,我们还是在这个地方设断点,然后接下来呢,我在这个位置右键。Debug。好,大家看,还是按照我们之前的分析,它来到了这个里面,然后我们点击这个sum program进去,进去之后呢,还是来到了这,来到了这之后呢,我们再来对这个进行分析的话,这个insert一定是处,因为这个地方我们写的是出这个insert对不对,好,然后再接下来呢,我们再来判断这个结果啊。
32:20
A with insult field。他为啥还给我返回出,他应该返回false呀,我再往后走一下啊,这面是什么?这面是update了是吧。这没有insert了呀,上面是不是啊,这还有一个我把它也删掉啊,所以说你会发现他这个。里面通过我们这回来来回回反反复复的这几轮测试,你会发现他判断的是什么,他是不是判断的是当前的整个的这个U类里面。他有没有。任意的一个属性,它有insert这样的一个注解。明白吧,它是针对当前整个user类里面的所有的属性进行判断的,所以它实际上这个里面的这一个层次的判断,相当于是一个粗略的判断,判断什么呢?判断当前这个操作首先是不是insert,第二判断当前的这个table info里面的所有的列里面是不是有。
33:22
一个或者是一个以上的insert费明白吧,嗯,好,所以通过刚才我们反反复复这样的一个测试,我们可以发现这样的一个逻辑啊,所以那如果它也是返回处的话,那就说明这个地方返回处了,实际上那我呢,再把它给屏蔽掉,是这意思吧,啊把它也屏蔽掉啊,然后呢,我先来还是先来运行一下,运行一下现在我们再来检查一下所有的应用程序的代码当中。就没有insert了,现在只有这一个update了哈,然后还还得测试一下。嗯。这种测试实际上。就看你的那个分析的这样的一个思路了。
34:04
右键啊,然后第八个。好,还得进来。进来之后呢,还得。下一步大家看这一回是不是没有走入到if语句当中,然后我们再来看它的结果。是不是false,所以你看我刚才反反复复测哈。大家就能够发现了。当我单纯的把这个地方的insert。给他删掉的时候,他并没有达到我们的预期的效果,那这个时候我们就要分析,诶,究竟是为什么,根据我们的猜测应该是没有问题的啊,那但是呢,我们会发现在我们进一步的一个猜测当中呢,发现只要我们当前整个的这个实体类当中,它是包含insert的,那么这个方法。
35:08
就会返回处啊,所以呢,我们就必须得把所有的其他的这个属性当中的这个insert呢,先暂时给他屏蔽掉,屏蔽掉之后呢,在这个里面我们的一个倒推的一个结论啊,就是猜测的一个结论就成立了,就成立了,就说明整个table里面如果没有任何一个被insert注解啊这个。标识的这样的一个属性的话,那么我们这个地方呢,就会返回什么呀,就会返回一个false,如果返回false的话,那么整个这个地方呢,我们就不执行自动填充了,如果不执行自动填充了,那么我们就会从这个地方直接退出,明白吧?啊,如果直接退出了,我们让这个方法继续给他执行完毕啊。好,那么如果自自动退出了,我们整个这个地方就没有办法进行自动填充了。
36:00
是不是啊,就没有办法进行自动填充了,所以呢,这块就是我们的一个业务逻辑了,那也就意味着。就是昨天我们所说的,实际上在当前我们的这个场景下,尤其是针对于update time来说啊,它既有。Insert又有update所标识的情况下,那在这个地方。我们呢,其实写insert和写update是一样的,结果明白吧啊,所以结论和刚才和昨天是一样的啊,但是因为涉及到这个源代码,所以昨天我怕大家都迷糊了是不是啊,就没给大家去详细的讲啊,但是其实是一样的啊,但是我不知道今天大家对这个的理解怎么样是不是。清晰呢?
我来说两句