00:00
好,那我们刚才呢,咱们是讲了三个比较特殊的circle,模糊查询,批量删除,还有动态设置表明,其中呢,这个批量删除和动态设置表明啊,咱们是只能用这个dota大括号,而咱们的模糊查询的话是给大家了三种解决方案,对吧,你可以用Dollar大括号来处理,咱们也可以用井号大括号。所以说当大家遇到这些问题的时候啊,大家一定要想想,咱们到底该如何去获取参数值。好,然后下面呢,我们再来看咱们的第四个功能啊。这个功能是什么呢?叫做添加功能来获取自增的主键,这个大家不知道在之前咱们的GDBC里面大家有没有听说过啊,然后这个东西它是干嘛的呢?它是在我们当前咱们设置为主键,设置了自动递增之后啊,我们去添加一条数据的时候,它的主键会自动递增,而有的时候呢,我们是需要来获取咱们自增的这个主件,然后继续的去实现其他功能的,好然后这个时候我们就需要干嘛呀,我们就需要来在添加功能执行之后来获取自中的主件了,这个功能咱们以后用的那也是相当的多,就比如说我在这给大家写了一个场景模拟。
01:14
比如说我们现在有个啥呀,班级有一个学生表,有一个班级表,然后我们现在要做的功能是来添级,其实来添加班级信息,添加班级信息的同时,然后来为我们当前班级来分配学生。大家注意这个功能,大家可以想象一下咱们的这个页面,这个页面的话其实也简单对吧,比如说咱们现在有一个这样的页面,然后这儿呢,有一个表单,表单里面呢,有一个文本框,让我们输入班级的名称,然后下面呢,是不是就是我们当前的这些学生信息,因为我们当前是一对多,班级对学生肯定是一对多嘛,所以说咱们下面的学生信息是不是应该是每一个学生前边会有个复选框,比如说这是张三对吧,然后比如说这是李四,然后比如说这是王五。
02:05
对不对,好,OK,大家看你像这些,然后这个时候我们要做的就是在添加班级信息的同时,来为班级分配学生。那这个时候大家想想该怎么实现呢?大家想我们输入的班级信息,然后下面比如说我们选了这两个,一个是张三,一个是李四,那这个时候怎么办?当我们来点击提交按钮的时候,大家说我们要干什么,我们第一步是不是需要来添加班级信息,咱们第二步要为班级分配学生,那怎么为班级分配学生啊?因为咱们之前讲的这个表关系,咱们是这个讲表关系的时候,大家都知道这个表关系多对一和一对多的表关系设置的是一样的,不管是多对一还是一对多。我们都需要在多的这一方来设置一的主见,也就是说我们需要在学生里面来设置班级的ID,对吧?那为班级分配学生,那其实换句话来说,因为他们两个之间的关系是在学生里面,那所以说其实说白了就是要为学生来设置它所对应的班级的ID的,大家说是不是?
03:09
为班级分配学生,但是咱们当前这两张表的关系在班级表里面嘛,不在,那所以我们就要为当前的学生来设置我们当前我们刚才所创建的这个班级的ID,那所以说大家想想,那我们在添加完班级之后,咱们是不是要来获得这个班级的ID啊,然后获取完之后,咱们才能实现咱们的第三个操作,为班级分配学生,其实也就是将某个学生的班级的ID修改为咱们新添加的班级的IDOK吧,这样的啊,所以说这操作是两个步骤吗?不是三个步骤对吧?中间咱们还得需要干嘛获取新添加的班级的ID,那这个时候有同学老师,那这个获取还不简单嘛,对不对,那班级ID是自动递增的呀,是不是,那我现在,那我是不是就可以干嘛直接来获取我们当前这个表里面最大的ID,大家说行不行。
04:04
可不可以,可以,但是有的时候咱们获取的是不准确的呀,大家想一下,这个表它不是你自己在访问呀,对吧,然后咱们是不是也有可能是其他的人也在访问,那这个时候怎么办?这个时候大家说是不是很有可能你获取的最大的ID,他就不是你刚才所添加的班级的ID,而是别人在这个时间之内,然后添加的新的班级的ID,对不对,这样的好,那有同学老师,我能不能根据我的班级的名称,然后来查询这个新的班级的ID行不行,可以,但是你查询出来的数据也有可能不准确,因为班级的,因为班级的名称,它可能是干嘛的,他可能是重复的,所以说这个时候咱们怎么办最好啊,大家是来使用我们当前这个GDBC里面自带的一个功能,当我们实现添加功能之后,咱们可以直接来获取他所自增的ID,然后这个方法咱们获取的ID一定是最准确的,OK吧,这样的啊。
05:01
啊,然后当然这个功能呢,并不是咱们的买BT中所特有的,这个功能在哪呢?在GDBC里面就有,就像是我刚才跟大家说的,我说这功能啊,是GDBC中的功能,而不是咱们的买be中所特有的,在这给大家来写一下吧。咱们把上面这一疙瘩啊,然后我给它注释掉。好,咱们把这两个注释掉,然后下面呢。哦。啊。好,然后下面大家再来看一下啊,咱们这样,哎,然后咱们接着往下写,怎么写呢?比如说我在这再来写个string circle,等于双引号,这是一个什么语句,叫做添加语句insert into,表明T_user,然后values我就不写了啊,然后下面咱们再继续往下,是prepared statement的,然后然后等于另一个啊,等于connection点。
06:03
等于connection.prepared statement,咱们把circle尾句放进来,然后写完之后呢,咱们就要来执行这个circle,怎么执行,看好update,执行增删改,然后执行完之后咱们再往下看,然后我们现在呢,在里面还有一个方法,什么方法叫做get generated case。叫做get generated case,大家注意,这个方法就是来获取我们当前自动递增的主键的,大家可以看到它的返回值是一个结果集,这个结果集里面很简单,只有单行单列的数据,因为它获取的这个结果集里面只有我们自增的主键这一个数据。所以说怎么来获取result set.next。能看懂吧,干啥的?先将我们当前结果集中的指针指向我们当前的这条数据,再往下RS点,然后get ink1ok,大家注意,然后这个就是我们当前咱们的什么呀,自动递增的主键,能看懂吧,一定要看好啊,这就是我们当前自动递增的主键,这是我们GDBC里面的功能,一定要看好,这不是买杯体中所特有的。
07:16
它其实买杯体中的功能封装的也是它OK吧,但是呢,大家注意这个地方有一个比较重要的问题,就这为什么要GETT1,这个大家都知道吧,因为你当前只有单行单列,所以说我们现在点next来获取的就是我们当前咱们的这个这一条数据,然后因为里面只有一列,所以说咱们直接get int1就可以将这一列的数据来获取到啊。好,然后当然你这样去写,它能获取到不,它获取不到,为什么?因为JDBC默认情况下是不允许我们来获取自动的主件的,然后这个时候我们应该怎么办?大家注意,当我们在创建预编译对象的时候,你会发现呢,这个方法里面其实是有俩参数的。
08:00
第一个参数是circleq尾序,然后第二个参数你看在这啊,有一个叫做all To Generated kids干啥的?是否允许获取自动递增的主键,如果说我们在这儿呢?大家注意,如果你不设置,那它默认是不允许的,如果说我们要想来获取的话,怎么办?你得在这啊,来写一个statement点,叫做return generated case,其实就是一。然后呢,它默认是no generated case,就是说默认不允许我们来获取自增的主件,然后大家把它在这再加上一个这样的参数就可以获取到了,或者说你直接写一也行,你在这写二是不允许,写一是允许,但是大家注意看好了啊,你写一,大家说你在这就写个一,你能看懂这是啥意思吗?不能,所以为什么有的时候咱们要用常量啊,对不对,你用一个字面量的话,那你看到的就是一个一,就是一个二,你知道这个参数是啥意思,不知道不知道,但是如果说我现在我用了statement.return generated kids,我从名字上就能看出来吗?它表示什么意思,允许我们获得自动递增的主见,能听懂吧?哎,大家注意是这个意思啊,行,所以说呢,在这给大家说这么多,就是想告诉大家,你的my be封装的是gd bc my be里面的功能从哪来的?GDBC有my be才会有啊,是不是啊?
09:28
这样的啊好,那我们下面咱们就把这个功能呢,咱们一块来写一下,来写一个添加功能。好,返回值咱们设置为VO,然后方法名咱们叫做insert user。在这咱们传过去一个U对象对吧?哎,U对象好,然后大家看,那在这咱们还需要设置a per吗?不需要,为啥,咱们说过如果是一个实体类类型的参数,咱们直接通过参数名就可以获取参数值嘛,对不对?所以在这咱们就不需要再设置at per了啊好,然后这是添加用户信息,然后并获取自增的组件,OK。
10:12
然后咱们把它复制放到咱们的映射文件中,把它所对应的circleq来写一下,然后它是一个添加操作,ID要跟方法名一致,然后按照我们原来的写法,咱们是不是直接在这写就行,错七_U然后Y6括号第一个是nine,然后第二个是username,然后第三个是passwor,然后第四个是age,然后第五个是gender。对吧,然后最后一个井号大括号e email email OK啊行,这个大家注意,这是我们当前的添加功能,但是我们现在咱们不但要实现添加,我还要干什么,我还要来获取我当前的这个自中的主键,这个时候怎么做呢?大家注意用到两个属性,第一个属性叫use generated key use generated key使用自中的主键是否使用自中的主键是。
11:12
然后第二个属性叫key property干啥的呢?Key是主见的意思,Property是属性的意思,也就是说我们现在咱们要把我们所获取的自增的主键,然后对应我们当前的哪一个属性,哎,童老师这是啥意思呀?那我问大家,你说我们现在咱们是不是不但要添加数据,我们是不是还要获得一个自增的ID啊,那这个ID咱们该如何获取呢?你怎么在执行完这个方法之后来获取这个ID呢?大家说。大家想想你都能够干什么?你看这个方法的返回值,有的老师可以作为方法的返回值,返回能不能,不能为啥增删改,方法的返回值是固定的,只能是int类型,只能表示受影响的行数,所以说不能作为方法的返回值,那我们只能干什么?那现在我们只能来操作我们传输过来的参数,User类型的参数,然后把我们当前咱们查询出来的自增的主键放在我们传输过来的参数的某个属性中,然后才能够实现这个功能。
12:22
所以大家一定要注意这是干嘛的?把获取的自增的主键然后干什么?存储到我们传输过来的实体类对象的某个属性中,那你存到哪个属性中,你想想你应该存哪?你查的不就是ID吗?你获取的不就是自动的主件吗?那所以在这咱们就把它放在ID里面就可以。一定要看好为啥不作为方法的返回值,因为增删改方法的返回值固定的。叫做受影响的行数,所以说我们现在咱们能怎么办?你只能来操作我们当前传输过来的参数,把我们当前查询出来的自增的组件放在这个实体类类型的参数的属性中就可以啊,换句话来说,然后我们当前没有执行添加操作的时候,这U里面没有ID,而你执行完添加操作时候,U的就有ID了,来测试一下,好,咱们来找到这个方法,大家看啊,然后我们来测试一下咱们的添加功能,这个叫做test insert user。
13:27
好,然后下面咱们要调用的方法是谁呀?叫做insert user,咱们在这把这个user给创建出来,User user等于谬一个user括号,OK,然后ID是nine,然后用户名,咱们给他写个小名对吧,然后密码123456,然后年龄23,性别男,然后再来给他一个邮箱,123艾特qq.com OK,好,获取完之后把这个U的呀给它放到这儿,大家注意这个时候这个userr啊,它里面还没有ID,但是当我们执行完添加操作之后,大家再把这个user输出,你会发现它就有ID了。
14:10
那它的ID是谁呀?咱们根据自动递增的主键,大家会发现咱们刚才测试的时候是不是测试到十了,那所以说现在是不是应该是几,应该是11,大家看一下啊,来ID等于11获取到了没有,大家看上面这个U的有ID吗?没有,但是我们执行完添加功能之后,有ID没有啊有ID啊好,所以说大家注意,这就是来获取自增的主键。再跟大家说一遍,以后用的很多,所以说大家一定要注意它该如何去实现啊,在这给大家写一下。首先use generated key对不对?然后来表示来表示当前添加功能,添加功能,然后使用自增的主见,使用了自增自增的主见,OK,然后下面呢,咱们的keep property这东西是干什么的?大家想想啊,会不会描述?
15:05
Keep property是不是应该是将咱们添加添加的数据的主件,添加的数据的自增主键,自增主键然后干什么啊,然后赋值啊,为什么来进行赋值,大家注意为咱们实体类类型的参数的属性,然后复制。你要知道为什么咱们不作为方法的返回值,因为增删改方法的返回值是固定的,知道吧,受影响的行数,所以说你只能把它放在哪,你只能把它放在我们当前传输过来的参数的某个属性中。所以说我们最终看到的效果就是什么呀,我们没有执行添加之前,这UR没有ID,但是我执行完添加之后,U里面是不是就有ID了呀,对不对,好大家注意啊。用的很多,一定要好好的去练习一下,一定要知道这个功能该如何去用,OK吧,好啊。
我来说两句