00:00
那么prepared statement我们替换statement,这个呢,就是哎,额外能做的一个事,这个事呢,用statement是做不了的,因为statement你想象一下它呢,就是写一个SQ语句里边呢,是没有占位符的,那你这时候你要写个变量还行,你现在呢,写一个文件,写个流,这做不了,所以呢,我们用statement根本就做不了啊这个事啊,这个呢我们就过了,然后呢,再回到咱们当初测试这个S后注入问题的时候,在这写一下,说除此之外呢,我们preparement呢,还可以实现更高效的叫批量操作,那下边我们就来演示一下这个叫批量操作的问题。啊,那这块我就还写到这个lo这里边了啊,点右键去新建一个,诶class,那这呢,我们是设一下这个叫insert一个测试。我们呢,相当于想演示一下使用prepared statement来实现批量数据的一个操作。嗯,Prepared sment实现,哎批量数据的一个,哎操作,那么批量数据,那我们说操作呢,无外乎就是增删改查查询的话呢,你说批量查询好像也没啥,你就是查select就得了是吧,那那我们看这个增删改哈,那么在这个增删改当中,那其实呢,我们说这个update和我们的这个叫delete,它俩呢,其实天然是不是就具有批量操作的效果。
01:27
哎,本身就具有批量。哎,操作的这个效果啊,哎,你想我们做一个update,我想修改某一个字段,这个时候你要是没有写这个where过滤条件的话呢,这个表中的所有数据全都改了,这不就是批量了啊,Delete上我没有写这个过滤条件啊,那时候呢,表的数所有数据就全删了,哎这它本身呢,其实就是一个批量操作的,但是我们这个隐色呢,是不是就不是了,咱们指的隐色的,咱们讲的时候呢,说有两种方式,一种呢就是一条一条添加,一种呢是基于现有表导数据,咱这主要指的就是一条一条的添加的问题啊,这个ins呢,我们一条条添加这个呢,呃,显然比较慢了,那我们要是批量的去添加的时候呢,看看如何实现这个呃批量添加这个高效的情况啊,这个inser的时候呢,诶,我们说可以演示一个批量操作啊,说此时。
02:26
哎,咱们这时候讲的这个批量操作。哎主要哎指的哎是哎批量插入啊,那么我们需要看一下啊,说使用诶prepared statement如何实现更高效的批量插入,哎批量插入诶这呢就是我们要演示这个问题啊啊那么这个批量插入这个情况呢,其实本身也是会存在的,你像比如说像双11啊618呀等等,像这个电商啊,咱为什么经常拿电商举例呢?因为电商呢,属于我们大家毕业时候呢,各个项目体系里边呢,比较重的一种项目啊,因为呢,基本上各种各样的业务呢,我们都可以在电商当中去体现。
03:15
啊,你像电商里边它有这个数据的一个展示啊,甚至里边还有一些视频,视频的话呢,就类类似于大家比如说就专门做那些视频网站,那电商里边呢,它也有视频,然后他有这个信息的一个展示啊,你这个服装呀,产品呀,是吧,是什么样的,就有点像是一个呃新闻的一个链接一样,那同时呢,这个电商还具备其他的项目不具备的功能,那就是有支付,诶对这个支付的功能它就是诶这个相对于电商独有的,或者换句话说呢,凡是具有支付功能的,呃门类的项目其实都可以具有,都可以理解成是一个电商性质的。啊,属于这样的了啊,那么比如说在这个电商当中啊,尤其像一些这个活动日的时候,会涉及到高并发的一个场景啊,这是我们比较高级的一个内容了啊,那在高频发的时候呢,我们需要保证这个数据呢,都能正常的进行一个读写操作了,那么当用户比如在双11的时候呢,很多用户呢,就呃购买了数据了,购买数据以后呢,你需要批量的把这个数据呢,都添加到人家的这个订单当中啊,购物的数据当中,那么这时候呢,就提到了一个批量插入的问题,诶你需要插入到人家这个浏览记录里边,或者订单数据里边,那么插入的时候呢,怎么样效率会更高呢?诶我们下边呢,就通过一个不断的迭代的过程,让大家感受一下,说怎么样写,效率可以更高。
04:30
好,那这就是我们要说明的问题啊,那么这个写法的话呢,就是我们层层去迭代,哎,先考虑一下第一种方式,第一种方式呢,就不演示了啊,因为呢,这种方式我们没有具体讲,那就是statement,哎,咱们始终呢拿着这个statement去可是吧,但始终呢没有讲过它啊。也是比较惨的啊,哎,那我们说第一种方式呢,是可以考虑用statement来做的,那那咱们现在比如说做一个具体的场景吧,啊,这是一个题目啊,哎,我们在数据库当中造一张表,我们下这个表当中啊,插入比如说2万条数据,看看花多少时间。
05:09
好,这个表这块呢,我们去写一个具体的一个操作了。哎,这个我们来一个create,哎,Table,这个比如我们就是叫商品吧,故事好过来啊,然后呢,诶,商品的ID啊,In类型的来一个叫primary key,哎,这个呢,来一个auto啊,这叫ment,这个咱们都说过了啊,然后呢,产品的名字,这个我们就叫name吧,诶orar类型,这个咱们给它稍微的长一点,或者25吧。那这样子啊,行。好创建好了,创建好以后,哎,我们先select这后来一个count清,诶from,诶步子诶查看一下我们这个商品的这个数量啊,零没问题,那么创建表这个操作CTRLC这时候我们就放到这了啊。
06:12
哎,这时候呢,我们要求呢,就是像。像咱们这个叫哎,Whose字,哎这个表中,哎插入咱们先演示2万条数据,哎其实不算多啊,哎我们插入2万条数据来演示一下,看看这个第一种方式怎么去做,这个第一种方式呢,咱们说了就是使用statement,咱们就提一下它就行啊。那么STEM的实现的话呢,显然这个效率不高,我们简单说一下,你看它是怎么做的,前提呢是我们先获取这个连接,JDBCU点叫get一个connection,哎,我们就拿到了一个连接。OK,拿到链接以后,关于这个statement呢,它调的方法呢,叫create statement。
07:03
诶,这个方法的调用,我们就会返回一个诶statement的一个实例了,诶是这样子的,然后接下来呢,拿着这个statement呢,你需要让他去执行SQ语句,嗯,执行SQL语句,现在你不是有2万条吗?对吧,2万条的话呢,我们这个SQ呢,会呃,各自不一样,咱们就先写个for循环,这样啊,I等于两角数据,我就写个一吧,I小等于2万,I加加,哎这样,哎进来啊,进来以后呢,S点,哎,我们这个叫excute,哎,我们这是一个,哎,其实你用excute就行了哈,或者你用excute update啊也可以,这时候呢,我们需要传进来这个circle,那这个circleq的话呢,需要提前我们去创建一下,哎,我们这样写。Insert into,故ose这个我们只会去给大家传这个name ID呢,让它自动找values,那这个位置呢,我们就需要给它写出来了啊,因为这里边我们说添加这个商品的名字不太一样,哎,我们这个用一下这个I了啊,正常来讲我们是需要写的是一个单引号了,然后单引号呢,我们这块就给他左右的。
08:15
拆开还得是吧,嗯,单引号先这样吧,比如我们这块要传的叫name杠什么。哎,比如说内杠一,内杠二,一直到内杠2万,这就是你每个商品的一个名字,接下来呢,是不是得给它拆开了。这样一下呗,杠A是吧。能理解吧,那那这块我们就做了一个exq执行,哎,那么一个for循环,这就不断的去执行,这块呢,一共执行2万次,哎,这是我们的一种执行方式。那这个呢,我们就不具体去写这个方式啊,也不去给大家演示了,那这个方式呢,没有我们讲第二种方式要好,第二种方式呢,我们就使用prepare s来替换它,那大家通过代码呢,你对比分析一下,看看为什么这种方式要好一些。
09:07
嗯,批量插入的方式二,哎,上面这个是方式一啊,这个我们改一下名吧,叫insert,那这给我写成伊朗啊。那么第二种方式呢,我们就相当于是使用prepared statement啊,来去替换咱们这个statement吧。那那为什么使用它更好,这咱们写一写啊,那那咱们就开始来了啊,先JD bc us,第2GET一个connection啊先异常了,我们就直接抛一下了啊,然后接着CTRL1得到一个连接行,然后连接点,诶我们这时候呢叫prepare,诶,Statement,诶这时候需要我们传一个circle,提前把这个circle呢写出来。Insert into,这呢,还是一个name。
10:01
Y64这个位置呢,我们就要占一符了,我就写一个它。好,这个写完了啊,写完以后呢,这时候我们就要预编译搜Q语句,生成一个prepared statement,下面呢我们执行,但执行呢,你还有障略符呢,需要填一下啊,那每次呢,我们填的还都不一样,For循环啊in I等于零等于一啊,I小于等于2万。哎,加加好,在这里边我们通过这个点,我们叫一个object,这呢就是一个一了,那唯一呢,只有一个障碍符,我们给大家去填充一下,跟咱们上边这逻辑一样啊,内杠这个位置上写个I。没问题是吧,哎,那么这样的话呢,我们就把这个战略符呢,给它填充上了,填充上以后我就可以通过点去做一个exq的操作了。来去做这个excot操作,这时候呢,我们就可以去执行你这个对应的搜后语句啊,一共呢是两万四啊,执行过两万四的ECO啊,最后呢资源关闭。
11:01
第二,诶,我们做一个close resource连接和我们的。哎,就这样来处理,哎,同样的啊,我们这里边呢,相应的你就按说不能这样写了,把这个呢给它包一下。哎,这样子。哎,上面这块呢,我们等于一个no。哎,把它呢扔进去诶保存一下,诶这呢是我们要说的这个叫方式二啊,那么方式二跟方式一比。咱们就是看了啊,大家能不能感觉出来这个方式2:1要好一些呢?能谁说能了,说一说好到哪了,哎,主要就是这个蛇是吧。
12:01
嗯,大家看啊,这个SQ呢,我放到里边了,我们每执行一次,每插入一次数据,这个SQ呢,是不是都得是现生成一个内存当中,你是不是得加载一个磁人性的一个字符串,哎,然后这时候呢,我们做一个执行,然后再来一次的时候呢,再得加载一个新的circleq,因为你每次SQ呢都不一样。啊,而我们这个呢,我们for循环外边写的circle这个呢,大家统一用的都是一个模板,只是呢,这个占位符不同而已。呃,从这个内存角度来讲,我这个string是不是就内存中就这一份。这是一个点,另外呢,你毕竟还是个SQ语句,这个SQL语句在数据库服务器当中去执行的时候呢,还要进行一系列的校验,哎,我们在这里边有写,咱们写到他俩的一个对比这块了。看这块啊,这也是咱们讲说prepare STEM,它的最大的一个特点就是我们当时看API的时候提到的叫预编译S后L语句啊,通过我们这个批量插入,大家有一个更深刻的理解,哎,咱我们看这啊说呢,数据库服务器对于编译的语句呢,进行了优化啊,这个语句呢,被这个数据库服务器编译器编译以后呢,就会被它就会把它缓存下来,然后呢,诶你下次再调用相同的预编译语句的时候呢,就不用再去重新编译了,诶只要将参数直接传入到编译过的语句执行代码就可以了,这个说的就是咱们叫预编译。
13:25
啊,也就是说我们刚才写的这个程序当中的这个SQL语句,诶,我们就会给它缓存下来,然后当你下次呢,再去调用的时候,我只需要给你去填这个张元符就可以了,而我们上边这个呢,就不一样了。你看这块呢,其实也有说明,这个statement呢,说即使是相同的操作,但是因为数据内容不一样,整个语句呢,本身就不能匹配了,所以我们就没有缓存这个语句的一个意义了,因为咱每次你内杠一内杠二这个你的搜有语句都不一样,呃事实上呢,就是呃,没有数据库对普通的语句编译后进行缓存代码,也就是我们这个STEM呢,每次没有缓存,这是其一,然后呢,再者的话呢,就是每次我都需要对你这个似后语句进行语法的检查,语义的检查啊,二进制的一个指令翻译成二进制令等等,每次呢,Stemn都得做一个这个事,而我们prepare呢就做了一次,诶,所以显然它的效率呢要高一些。
14:17
啊,这呢就是我们从一替换成二的一个原因,哎,预编译词后语句啊,这样行,那这块咱们跑一下呗,还的话我们看看这个执行的效率到底怎么样是吧?嗯,那这块时间我们可以在。哎,这个TRY这块,比如在这块我们加一下啊system第二啊current time minutes啊CTRL1这个我们叫start,诶CTRLC诶执行完以后,哎,再记录一个结束时间,然后在这个位置我们来一个输出。花费的时间为。
15:00
诶摁减去一个start来保存这就可以了是吧?诶然后下边的话,我们就可以去执行这个操作了啊走一下。这个呢得有一会。那得有一会那个速度到底有多少呢?这个我们可以顺便呢在这块呢来查一查啊,现在已经添加了一会了,跑一下才2000多是吧,咱们家的是2万啊,看来一会半会完不了,估计喝口水可能得喝好几口水是吧,先跑着先让他先跑着,咱们接着往下讲啊,应该得一分钟以上了啊,这种方法呢,也不是特别快,我们呢,还想在这个基础上呢,再进行一个优化,诶那我们就引入了叫批量插入的方式三。
我来说两句