00:00
哎,我们继续回到我们刚才要测试的方法哈,我们刚才要测试的呢,是这个select one这个方法,哎,这是我们测试的通用map的第一个方法,首先呢,我们先要去呃兑现啊,通用map呢,给我们承诺的功能,什么功能呢?它最大的作用啊,就是给我们去生成我本该我们去写的搜QL语句,那么我们可以从这个控制台打印的日志里边能看到啊,你看在这个这个地方啊,Preparing这是准备好这个SQL语句,然后呢,这个就是我们呃给SQL语句呢传过来的参数,这个呢就是它的返回值啊,你看这个箭头哈,呃,这个往右的箭头是我们发送给数据库的,往左的箭头呢是数据库反馈给我们的,那么这个呀,就是通用map给我们生成的这个搜索语句。哎,果然的,如同我们说的那样啊,这个通用map确实啊,他替我们去生成了SQ语句。
01:06
哎,这个我们注解啊,这个需要去总结我们方法呢,也需要去总总结,我们在这儿呢,看一下one方法。哎,首先呢,我们去看一下啊数据库啊,通用map哈,替我们自动生成的这个S语句这个情况。确确实实,人家把SQL语句呢给我们生成出来了,生成出来以后呢,我们下边还有一个关注点,我们在这儿说过了,我们创建了一个employee对象,这个employee对象是用来封装查询条件的,而select这个搜Q语句里边呢,它的查询条件哈,集中的表现在他的where词句这。
02:01
啊,威尔子句你看在这儿,那么也就是说呢,现在搜Q语句里边威尔子句这一部分呀,它就是使用我们传过来的这个查询条件十几类,呃,由他们来生成的,那么这个封装查询条件的十体类生成sol语句里边的word词句,哎,它是基于一种什么样的规则呢?啊,它肯定是有规则的,嗯,实体类封装查询条件去生成where此句的规则在这儿呢?咱们来总结一下啊。首先第一点啊,使用非空的值。来这个生成SQL语句。生成ver这个这一点呢,大家也能够看到哈,你看我们在这儿就是名字和工资呢,设置的值了,这个ID和年龄都设置的是闹值,诶然后呢,这个时候你看呢,我们这儿这个威尔威尔子句里边也就是有这个名字和工资啊,诶所以说它就是非空的值啊,会被作为我们的,诶这个SQ语句里边where尔子句啊,只有非空的会会被放进来,这是一个,然后第二个呢。
03:23
在条件表达式中,它都是使用等号进行比较,也就是说呢,它在这儿只是去比较这个相等的条件,诶看到了吧,E MP name比较的是相等,这个salary呢,它比较的也是相等,所以说呢,我们这种情况哈,大家要记住哎,这个使用实体类去封装查询条件的时候啊,它就是只有非空的值会被加到V尔子句里边,然后呢,一律都是使用等号来进行比较的。呃,说到这儿的话,我想大家可能会有这感觉哈,你这种方法的话,呃,第一条倒觉得我们也觉得正常哈,非空的值去运用来生成查询条件,第二个呢,你固定就是等号,我有的时候还不一定是等号,我可能是比特暗的,我可能是大于,可能是大于等于是吧,小于小于等于这个搜狗语句里边查询条件比较的方法可多可多了啊,那你在这儿的话就单纯就用等号,这个太局限了,诶确实是这样啊,这个确实是有一定的局限性,那呃,但是这个不用担心,后边还有这个by example的方式啊,我们使用QBC查询可以实现非常丰富的查询条件啊,那个那个就是后话了啊,一会儿再说。
04:41
呃,除了这个的话,我们还需要去关注一点哈,呃,这个方法的名字叫select one,那你很明显就是说它只能返回一个,假如说我们偏偏要让他返回多个的话,会怎么样呢?哎,那问题是怎么样能够我们去修改这个测试数据哈,怎么样能够让他返回多个在在这大家看是这样的哈,如果我们这个employee哈,这个封装常用条件的这个十十几类里面所有的字段都是闹的话。
05:13
根据我们刚才这个规则,是不是相当于就没有为二子句了呀,哎,咱们来试一试啊,咱们把这些呢,都给它设置成了。所有资料都是到了,哎,那么这个时候你传了这个尸体类哈,相当于跟没传呢,其实也是一样的啊,我们再执行一下哈。哎,你看这时候其实它会抛一常哈,我们看看呢,先看看它生成的SQL语句的情况,你看这就是我们生成的S狗L语句,有select的子句,有from子驱,但是呢,再往后你看是不是就没有where尔子句了,对,因为它这个封装常用条件的试几类里边哈,没有非空的字段了,全是no,然后呢,你看呃,Permeters也没有是吧,也没有什么参数了,然后呢,这个total哈,这个数据库返回的这个数据是五,数据库返回了五条这个结果,也就是说呢,数据库其实是真的会把数据给返回回来的,这个搜Q语句呢,对于数据库执行来说呢,是没问题的,SQL语句本身呢,没有语法问题,数据库也能够成功的给我们返回记录,但问题是呢,Select one这个方法本身的限制哈,要求它只能返回一个结果,这个地方呢,我们就会抛出这个异常,我们放大一点看哈,这个异常的这个也非常容易懂,它在这儿呢,告诉我们哈,To many。
06:39
S exception啊,这个结果呀,太多了,Expected or no tobe returned by selected one,就是说呢,我本来呢希望呢是一个啊,但是呢,你现在呢,给我返回了这个好多啊,But found five,但是呢,我找到了五个。啊,就像有同学说的,我就找一个女朋友就就行了,这么多人都追我,真烦是吧?所以说现在呢,这个selectone哈,你不能够给他更多个结果,他必须呢,要求就只能返回一个,如果返回的结果是多个的话呢,它会抛异常。
07:16
要求必须返回一个。实体类这个结果如果有多个,则会这个抛出异常。我们也可以呢,把这个异常的信息哈,我们给截个图呢,放在这儿啊,便于大家呢去进行一些参照。好嘞,还有一点就是说呢,我们现在哈,呃,如果说我们这个查询条件哈,是刚才这个它是能够正常的给我们把数据返回的,我们再执行他一下。
08:07
返回来以后呢,我们发现哈,他在这儿这个,呃,查询得到的就是这个查询结果的这个employee对象哈,他的ID呀,Name呀,Salary呀,Employee这个呀,都能够正确的给设置进来值。这哎,这个时候呢,我们也没有做什么特殊的设置,它就这个设置值呢,都正确啊,这个正确无误的给我们设置进来了,但是我们如果仔细看一看的话呢,我们会发现哈,这个我们实体类的字段,字段的这个名字啊,或者说属性的名字和我们数据库表里边呢,其实是不一样的。数据库表呢,是用下游线来区分的,而我们实体类呢,是使用这个驼峰式命名是吧?是使用驼峰式命名,这个它是,哎我们也,嗯就字符串本身而言呢,它是不一致的是吧?但是它能够很好的把值呢给我们注入进来,这个事儿,哎这个就比较神奇哈,当然了,其实呢,我们如果把这个字段名和呃数呃十几类的字段名和表的字段名给列到一块儿的话,大家就会发现哈,我们这个十几类的字段名和数据库表的字段名哈,都是写的很规范的啊,那么呃通用map呢,很明显哈,它默认是支持这种规范的,既然他支持这种规范哈,那么它自然而然能够映射进来呢,就不足为奇了,现在呀,我们使个坏,咱们呀把这个其中的一个呢给它改一下。
09:46
啊,那当然实际开发的时候肯定不会这么起名字哈,在这儿咱们就是为了去测试这个效果,诶,如果我们数据库表里边这个字段的名字和我们十几类的字段的名字呢,它不一致了啊,不符合这个默认的规则了,它会怎么样?哎,想必大家能够预测得到哈,他无论如何呀,这回呢,没有办法正常的执行了。
10:13
果然他抛出了异常,这个时候抛了一个什么异常呢?大家看啊,我们还是看这个cos这个部分,他说呀,Unknown column emp salary in field list,他说呢,Emp salary啊,现在呢,在我们这个表里边是一个未知的点。也就是说呢,他会去我们的数据库表里边哈,去找emp_salary这样一个字段,那很明显我们确实没有这个字段,因为我们把这个段的名字给改了啊,那就是说啊,我们我们意料之中的哈,他确确实实没有办法去完成这个对应的关系了。这个时候可能大家会想哈,诶,我们刚才啊,表名和类名也不一致的时候,有一个注解,可以去建立这样一个对应关系,那现在我们这个字段名啊,实体类的字段名和表的字段名不一致的,它有没有这样的这个对应的关系呢?
11:08
哎,有没有这么一个,呃,是注解或者是什么东西哈,能够去明确的指定这样一个对应关系,哎,其实是有的,确实是有啊,有这样一个column注解,一样也是使用这个内幕尺寸,哎,你你这个实体类的字段名跟我们表的这个字段名不是不符合默认规则吗?行没事儿,我用column注解命属性里边给你明确的标记上啊,你这这样的话,你不就能够这个找到了吗?所以说呢,我们再重新跑一下。哎,大家看这回就没问题了,那么他在生成这个搜QL语句的时候呢,他就知道我们这个字段啊,诶,他到数据库表里边呢,该按照我们指定的这个字段的去找,就不会出现这个不会出现刚才的问题了,这也就是我们要跟大家说的第二个注解,这个column注解。
12:05
我们把它呢,也是需要截个图哈。那我们在笔记里边给大家写上,诶这个时候呢,就是我们column解还是这个套路啊,它的这个作用呢,是建立我们实体类和数据表,哎,实体类字段和数据库表字段之间的对应关系。它的这个默认规则哈,是这样的,呃,我们实体类呢,使用驼峰式命名,呃,数据库表,当然我们写清楚都是字段啊,说的都是这个字段,数据库表呢,使用下划线去区分各个单词,这是默认规则,那然后这个用法就是我们截图的这个啊,哎,是在我们这个column注解的这个内幕属性中去指定目标字段的。
13:20
知道没,当然了,你说我其他的这些呢,符合默认规则的,你都给它加上column注解呢,肯定也没问题啊,那这个时候的话,呃,就是说会比较麻烦啊,但是也有一个好处呢,就是特别的明确,诶就是这个时候我们顺便给大家去说了这个column注解。
我来说两句