00:00
好,那我们刚才呢,是给大家讲了这个my be里面的各种查询功能。然后下面呢,咱们来讲几个比较特殊的circle。那什么是比较特殊的circle呢?就比如说我们之前呢,咱们讲过获取参数值的两种方式,一种是井号大括号,一种是Dollar大括号,而井号大括号对应的是占位符负值,Do大括号对应的是字符串拼接。井号大括号它是会自动加单引号的,所以说咱们以后啊,这个尽量来使用井号大括号,然后但是呢,对于一些比较特殊的色口,像模糊查询呀,批量删除呀,动态设置表明啊,像这些功能我们在实现的时候,大家是不能直接使用井号大括号的。然后否则的话它会出现各种问题,那下面咱们就针对于这些问题啊,然后咱们来看一下该如何去解决,首先咱们先来看一下第一个问题叫模糊查询啊,模糊查询该如何实现,这个circle语句该怎么写,大家应该都知道吧,咱们用的关键字是like。
01:01
然后我们当前呢,咱们可以用下划线来表示任意个数,任任意的单个字符,然后咱们可以通过百分号,然后来表示任意个数的任意字符,就比如说我们现在咱们要来查询用户名中包含有A的用户信息,那这个时候circle句咱们应该怎么写呢?Select星,然后from t_user,然后while user name。然后like单引号百分号,百分号里面写个A就可以啊好,然后这个时候大家看,因为百分号表示的是任意个数的任意字符,那所以说这个A是不是可以表示咱们当前用户名的开始,也可以来表示用户名的结束,也可以来表示中间包含有A。所以说大家注意我们以后的模糊查询呢,然后基本上都是这样来设置的啊好,下面我们把它选中,然后来执行这个circle,大家看咱们就可以把用户名中包含有A的用户信息查询出来。
02:03
好,然后呢,我们下面通过my be来实现一下啊,那咱们怎么写呢?咱们先把这些东西啊都给它关掉,然后我们在这咱们再来创建一个map接口。比如说这个map接口啊。叫什么叫special啊?叫special circle map,叫做特殊的circle map。然后咱们把名字复制过来之后,再来创建它所对应的映射文件。好,然后咱们要来保证我们当前咱们的命名空间呀,然后跟我们的map接口的全类名一致。好,比如说我们先来测试咱们的第一个功能,然后叫做什么功能,叫做模糊查询,然后模糊查询,咱们查询的是用户名,根据用户名进行模糊查询,那大家想想模糊查询查询出来的结果。条数固定吗?不固定,有可能你一条你也查不出来,也有可能咱们查询出来的只有一条,也有可能我们查询出来的有多条,那这个时候这个方法的返回值我们该如何来设置呢?
03:10
咱们刚才才讲过咱们的各种查询功能对吧?咱们说过如果你不确定你查询出来的数据有几条的话,那咱们最好是用list的集合来获取。OK吧,因为如果你现在用一个实体类类型来获取的话,那我如果我们查询出来的数据有多强,那大家说他是不是会报错,报什么错叫too many results exception对吧?好,OK,所以说咱们把方法的返回值设置为list的集合,然后泛型为user,咱们叫做get user by user啊,Get user by like吧,好,然后通过咱们的模糊查询来查询用户信息,OK,然后这里面咱们来。输入一个就叫做模糊,随便写一下啊,就叫做模糊,然后在这咱们给它加上一个a per,这个是我们在讲获取参数值的两种方式的时候,给大家总结的一个结果,对吧?咱们说的除了有实体类类型的参数之外,其他的大家都可以把它加上a per。
04:11
因为如果你不加。有可能咱们不知道你该如何获取这个参数,但是如果你加上之后,我们一定要我们一定知道,就是通过T注解的Y流属性值来获取,来获取当前的参数的,对吧?好OK,好,这个咱们也叫做模糊。好,然后杠清晰,然后咱们在这是通过用户名啊,对吧,然后模糊查询咱们的用户信息,OK,好,然后咱们把它复制,然后放在我们当前咱们的映射文件中,把这个SQL语句来写一下,非常简单,Select,对吧?然后ID要跟方法名一致,然后result type的话,咱们设置的还是user,然后再往下select的星,然后from t_user,然后while use nameme,然后like,单引号,怎么写单引号。
05:08
百分号,百分号,然后里面是不是要把我们传输过来的模糊查询的数据,然后放进来,那大家说这个时候我们应该怎么写呢?那咱们是不是需要来获取模糊,要来获取这个参数值,然后放在两个百分号中间,那咱们能用井号大括号吗?咱们先试一下呗,对吧?然后如果按照我们学完获取参数值的两种方式之后,我们在这第一个想到的应该就是井号大括号,对吧?然后把模糊给放进来,OK,下面呢,我们在这咱们来写一个测试类,然后来把它测试一下。然后咱们就叫做special。好,然后咱们来写一个方法来进行测试,Public void叫test,咱们这个叫get user by like,对吧?好括号,然后第一步先来获取circle session对象。
06:03
好,获取完成之后,咱们再来获取我们当前咱们的map接口的代理实现类对象。叫做special special啊,然后circle map,然后点class.class OK,好,然后获取咱们的map对象,之后再来调用其中的方法,Get user by,比如说我就传过去一个A。OK吧,然后这个时候咱们是不是就可以获取一个list集合啊list集合。List,好,然后咱们下面对这个list集合来进行一个循环,system.out。Print LN OK,好,然后我们现在咱们来一个执行,那我们再来看一下吧,大家说这个circle句它到底有没有问题呢?我不知道大家有没有在JDBC里面学过这个模糊查询的这个circle啊,然后在这大家注意我们是不能这样去用的,为什么啊,因为井号大括号相当于什么,相当于占位符赋值,那占位符赋值的话,那所以说这个时候它解析完之后,大家还记不记得它解析成什么样了,它是不是会把咱们的井号大括号用一个占位符问号来表示,对不对?
07:18
对吧,好,然后但是这个时候咱们要给问号张位符来扶持,那你就要用预编译对象中的set方法来扶持了,但是大家注意,你看这个问号是在哪的,是在单引号里面的,所以说这个时候这个问号啊,它属于字符串的一部分。那所以这个时候这个问号会被当成占位符来解析吗?不会啊,大家来看他报的这个错,我们现在咱们来一个执行,大家来看一下。嗯嗯。好,大家来看这个效果啊。好,然后他在这直接给我们报了一个错啊,首先大家看跟我们说的一样不一样,我们用井号大括号,然后来拼接到S口尾句的时候,然后它是会被作为一个占位符,然后进行代替的,对吧,然后为什么它会报错呢?其实很简单,然后咱们往下找啊来。
08:15
当我们有很多个错的时候,我们怎么去看,大家从下往上看就可以,比如说我们来找到最下面这个错,他报的错是一个什么叫做circle exception circle异常,然后他说我们当前这个参数的索引呢?Out of run,什么意思叫做超出范围?怎么就超出范围了,我们当前咱们在这有个一,然后大于number of parameters,然后一大于了我们当前参数的一个个数,我们当前找到的参数的个数是几零,但是我们现在怎么的,我们是不是要操作的参数的索引应该是一,好,然后这是啥意思啊,很简单,就是我刚才跟大家说的,如果这个地方被解析之后,用一个问号来代替的时候,这个时候这个问号它是属于咱们字符串中的一部分的。
09:08
是属于字符串中的一部分,这东西会被当成占位符来解析吗?不会啊,所以说对于这个S口语句来说,里面没有任何一个占位符,但是我们现在写了一个井号大括号,那说明我们当前的S区中需要通过占位符赋持。然后所以说它就调用了预编译对象中的set方法为占位符赋值了,但是结果咱们当前的so语句中有占位符吗?没有占位符,再说一遍,这个现在是在单引号里面的,它不是占位符。它是字符串中的一部分,好,或者说。在这呢,我可以给大家来写一个方法,Public void叫做test TD bc,大家来看一眼啊,好,然后咱们的第一个步骤叫做class.for name,然后来干什么呢?这叫做注册驱动,然后咱们给它加上一个check catch啊好,然后咱们随便来写一下啊,然后第二个步骤来获取连接connection connection等于driver manager.get connection里面是三个参数,然后咱们也是模拟一下就行啊好,在这咱们把这个异常呢,给它改成是最大的异常,然后下面呢,我们再来看下面咱们需要来获取的是一个预编译对象,然后等于connection.prepare statement,这咱们要写circle了,比如说咱们把这个circle语句啊给它拿出来,然后咱们在这在这来写啊。
10:37
String circle等于双引号,然后select的星把咱们刚才的模糊查询给拿过来,User,然后well,或者说大家直接把这个复制过来就行啊,这不就是我们刚才解析之后的circle吗?对不对?你可以直接把这个东西啊给它拿过来,然后拿过来之后啊,把咱们当前的so尾去,然后放在这儿,那下面大家还记不记得要干啥了,咱们是不是要来使用其中的set方法来为当前的占位符扶持?
11:07
然后你看我们现在一个set string之后一,然后比如说我在这里面写个A,也就是说我要把这个A赋值给咱们当前的这个张位符,但是你会发现直接编译都不通过,为什么呢?那是因为我们当前咱们的问号是在字符串里面的,所以说它是字符串的一部分,它会被当成是占位符来解析嘛,并不会,你看咱们的鼠标放上去,大家来看一下,它说我们不能去解析到咱们当前的这个参数一,也就是说当前咱们执行的so语句里面有占位符吗?没有啊,这个大家一定要注意。好OK,咱们把这个呢给它干掉,咱们这段代码咱们就写到这儿,或者说我在这儿给大家写出来。啊,大家注意啊,然后这里面是一在这咱们写个A,然后我把这一句话注释掉啊,因为它不对,知道吧,那我们再继续往下看来。
12:03
啊,哪还抱着错呢,咱们这里面应该是没有错误了,对吧,没有错误咱们就不管它了啊好,然后下面呢,我们再接着往下看,那这个时候大家想想,咱们问题咱们已经发现了,那我们现在该如何来解决这个问题呢?对吧,也就是说我们现在咱们用号大括号为什么会出现这个问题,就是因为我们当前咱们的井号大括号对应的是占位符赋值,然后它在解析的时候会被解析为一个问号,那所以说我们当前呢,然后咱们的这个问号是在单单引号里面,它是字符串的一部分,所以说会被占位符当做占位符来解析吗?不会啊,好,那这个问题咱们该如何解决呢?大家可以想一下啊。
我来说两句