00:00
行,咱们在讲完这个statement这个弊端以后啊,那下边呢,我们就正式来引入这个prepare的statement啊,这个statement呢,关于它实现数据的一个增删改查,咱们实际上是没有讲的啊,这个咱们就略掉了啊,因为呢,咱们马上呢,哎要看一下prepared stemman怎么去用,那么下边我们来看这样一个图了哈,在讲完这个诶STEM这个弊端以后,诶我们这块呢,就正式的引入这个叫诶prepared stemment,那我们现在回顾一下,咱们呢,之前先要获取数据库连接,获取数库连接的话呢,咱们讲了五种方式,但是呢,实际上大家需要掌握的就是我们自己要是手动写一个连接的话啊,你就掌握第一种方式,第五种方式就可以了,那么第五种方式呢,我们使用的叫driver manager驱动的一个管理器来做的,但实际上呢,我们肯定驱动管理器也需要呢,帮我们去创建driver的对象,咱们昨天也看这个源码了,在MYS的那个driver时现类当中还有一个静态代码框,对照样呢,帮我们把这个driver的实现类的对象给创建了啊所。
01:00
这个driver的对象肯定要有,然后拿着这个driver对象我们去获取一个连接啊,获取连接呢,这个如果在笔试当中提到说如何获取一个连接,我们需要有哪些操作,里边呢,你要提到有几个基本信息啊,四个对吧?那第一个呢,就是你这个驱动具体的在你具体的这个数据库当中那个,呃,Sun公司定义的那套标准里边的接driver接口,你得看你在这个具体数据库厂商提供的这个driver的时间类是什么,对吧?还有什么呀,Ul对,你得告诉我,你想连接的是基于哪一个,基于什么样的协议,基于哪个IP下的哪个端口号的哪一个数据库。对吧?嗯,然后接着呢,诶,对用户名密码,对这个都是必须的,这个呢属于我们说的叫四个基本信息,就是说你这四个是必须的,除了这四个之外呢,你还可以再有其他的,那其他的那些信息,比如我设置一下,呃,初始化的连接的数啊,当然这些信息呢,只有在我们常量池当中才会出现,哎,这个数据库连接池当中才会出现,因为你这块呢,涉及不到说初始的连接信息了,就一个啊,就你自己连接的这一个,哎,我们到后边讲数据库连接池的时候呢,我们说除了这四个之外呢,还会讲其他的一些参数信息,到时候咱们再说,那么在获取了连接以后,那我们接下来要做的事儿就是呢,在咱们Java代码当中去写相应的SQL语句,然后让他呢,放到数据库当中呢,去做执行,诶是这样一个情况,那拿谁来做呢,咱们呢,说用statement来做,咱们在API当中也简单看一下这个。
02:36
哎,先呢,从咱们这个叫connection这个入手,找到我们这样的一个接口,这个接口呢,我们如何根据接口去操作具体的增删改,查这个这个collection,那我们说呢,需要借助一个结构叫做statement,咱们昨天呢,呃,相当于讲的就是statement它的一个弊端了啊这里边呢,我们其实调的方法是这个,但是大家了解一下就行啊,不用去记住它,那调完这个方法以后,通过连接我们就得到了一个statement的这个实例了,这里边写了这个statement的一个主要作用,来我们看一下。
03:06
说呢,创建一个statement对象,用于发送circle的一个语句到数据库当中。说的很明确,Stemn的作用就你看成一个信使也行,或者看成我们说叫一个钦差大臣也行,就是皇上呢,这块有个什么指令是吧,现在呢,把这个指令就相当于我们的circleq,让他呢给带到具体的数据库这块呢去执行一下,他呢就相当于这样的一个信使,嗯,他是做这个事儿的,只不过我们说呢,这哥们儿不靠不靠谱啊,就不用它了,咱们昨天提到了一个叫拼串,一个叫SQL注入问题,拼串呢还能接受,只是稍微麻烦一点,但是呢,SQ注问题是我们一定要避免的,所以我们就不用它了,不用它用谁呢?我们发现在这个接口里边,它提供了它的叫sub interfaces。子接口,子接口里边呢,有一个叫prepare的statement,诶我们就用它,那关于这个prepared statement呢,首先大家要清楚,它是statement的一个子接口,STEM不靠谱了,找他的子接口。
04:05
嗯,然后呢,关于这个prepare里面的一个特点说明,第一句话说的很清楚,说这个对象呢,它代表着一个叫预编译的circle的statement。这句话呢,对我们prepare statement跟statement的个区别呢,高度概括就叫预编译SQL语句,这句话呢,大家刚看肯定看不明白,当我们把这个prepared cement诶写完以后,那回过来大家再看这句话呢,会非常的清晰,诶我们先留一个伏笔,好,那既然我们现在要用prepared cement了,我们得看一下怎么能够获取这哥们的一个实例,那我往下找,还是从咱们这个连接来找啊,咱们是拿着连接呢去操作的,所以呢,拿着连接我们往下找,你就看左边哪一个返回的叫prepare的statement,在这呢,有一波都是那相应的,就意味着我们调右边这块相应的方法,我们就能够返回一个prepared statement的实例了,OK,这就是我们想要用的,那咱们要用的话呢,就是第一个,哎,最基本的这个操作了。
05:06
啊,那下边呢,我们就开始用prepared statement来演示如何实现呃,数据库的增删改查操作啊,也就是说我们原来用statement的情况下,就完全都要替换为prepared statement。啊,使用它来做了,这呢,也是咱们今天要讲解的一个重点内容,好,那这块咱们就开始啊,这个咱们就关掉,还是呢,我们在这个GDBC杠一里边去写,那下边的话呢,我们来写是关于prepared statement,所以这块报名呢,我就改一下。哎,Prepared statement的CD操作啊,分别试一下这块,为了大家能看清楚,我们这个后边会造很多的包啊,这个我这样处理一下吧,这个我改成叫。三哎,就是大家呢,回头你自己写的时候呢,能看清楚到底这个先后顺序是什么样子啊,这个我F2一下,这就改成是个二。
06:01
哎,这个呢,我在F2一下,哎,这叫一啊,就咱们呢,相当于先讲连接再演示的这个statement,它这个弊端,然后我们现在来看prepared statement该怎么去实现啊,那么实现这个增删改查的操作,哎,我们先写具体的一个使用咱们的诶prepared。嗯,State问哎实现呢,我们叫一个查询操作的一个测试啊,这个稍微长一点啊。这个我们说叫使用pre statement来替换咱们的statement。嗯,实现对呃数据表的增删改查操作。行,那下边我们就要讲这个增删改查操作了,那么这里边呢,关于这个增删改查这个操作呢,我们还得需要再多说一句啊,增咱们在SQL讲解当中都已经学过了,增我们就insert,诶添加条的数据就行,删呢,Delete from对吧?诶删数据,然后改update,对查询select啊那么这四种操作呢,呃,肯定呢,你说我们要把这四种操作分四类,那毫无疑问呢,就是增删改查各自是一类,那如果说呢,把这四种呢分成两类,对这时候我们说呀,其实我们可以把增删改呢,看成是一类,查询呢,单独看成一类,那你说我这个分的标准是什么呢?对这个标准呢,昨天咱们也稍微提过一下,就是说我们增删改,其实你操作完以后呢,是不需要有什么返回的,我们从Java的角度来讲,如果说看成这个方法,这三个操作呢,是相当于word的情况,对查询呢。
07:54
这是一定要有返回的,诶我们呢,现在拿着一个呃SQ语句,我们去查询数据库了,查完以后呢,你是不是一定得告诉我长什么样子,查出来什么数据了,对吧?而这个增删改呢,我们增了一条,删了一条,改了一条,默默的结束就行。
08:10
其实是可以这样的,对吧?诶,所以说这块呢,我们要想写实践对数据库的增删改查,其实增删改呢要简单一些,查询呢要复杂一些,所以咱们先来看增删改的操作,也就是说我们下边这个操作呢,咱们只是来考虑增删改,增删改的话呢,其实我们都可以称作一个广义上的一个修改,所以这块呢,我们只是来测试增删改操作,查询呢,咱们暂时先不涉及到,先来看增删改,OK,那增删改那咱们首先呢,挑其中的一个操作,谁其实都行,那不妨呢,我们就叫添加一条记录吧,像咱们这块呢,是咱们的数据表,那咱们先以这个customermates这个表为例,像这个表当中添加一条数据。添加一条记录。
09:00
OK,那我们看一下该怎么去实现,那test这呢,我们是一个insert这样来写好,那么添加一条记录,那你得想了,我们添加一条记录呢,咱用的叫prepared statement了,那要用它的话呢,咱们得先去获取一个链接,获取连接的话呢,又得是我们昨天想的这一套的这个步骤,嗯,那这个呢,一步也不能少,这块呢,我就直接粘过来了啊,找到我们这个链接,找到我们这个方式五从这啊一直到这。CTRLC粘过来。Ctrl shift f一下ctrl shift o,然后呢,这块我们先先through一下,画个比较大的行,那这样的话呢,我们就先获取到了一个连接了,嗯,这个连接的话,这块用的是嗯,另外的这样的一个类了哈,这个咱们就不用它了,就是整个这一行代码的目的呢,是我们要获取一个类的加载器,这个类加载器呢,咱们知道是一个系统类加器了,其实这块我们还有一个比较简单的一个操作啊,就是class loader,它有一个呢,诶get叫诶system class loader,就这样的方式呢,也可以获得获取一个系统类加载器,诶也是OK的行,那这样的话呢,我们就先拿到了一个连接了,那为了证明咱们这是没问题的,先跑一下看这个链接靠不靠谱。
10:23
执行一下OK,没问题,行,那拿到这个连接以后,下边的话呢,我们说就要做后续的操作了啊第四步,那我们需要呢,获取一个prepared statement的一个实例了,咱们刚才看API也看到了,那就是拿这连接点掉了一个方法呢,就叫做prepare statement,我们这里边需要传个circle。那这个circle呢,就是我们到底要做的事是什么,这个我们是想insert啊,Insert into customers,通常呢,咱们讲circle的时候呢,添加数据都需要指定你添加这个字段啊,对,在咱们这个customer这列表当中,第一列呢叫ID,这个ID的话呢,咱们也是一个主键,让它自增长的,这边能看到主键自增长的,所以这个呢,我们复制的时候呢,就不用管它了,你只需要考虑我们后边这几个字段就行,后边这几个字段当中,这个photo呢,暂时咱们也先不考虑,因为这个呢是我们要说的一个blog类型。
11:13
Blog类型就是一个,诶一个图片了,咱们后边呢,专门说这个关于blog字段的一个操作,所以这里边我们要插入的话呢,这个字段就是name email和。好,这块我们来写。行这样的三个,然后Y6注意后边这个写法呢,跟我们想的呢,可能就有点儿区别了,咱们这个Y6里边呢,我是写了几个叫问号了,但其实这个问号呢,我们这个里边叫做占位符。咱们在基础里边讲问号呢,泛型时候提过叫通配符,对吧,它这个叫法不一样,这呢叫占位符,占了一个位置,占什么位置呢?就是你到底内幕呢叫什么,这叫占位符,OK,那为什么要写占位符这个呢?咱们到后边总结,因为正因为它是这样写占位符的,所以它才能够解决statement的弊端啊,你怎么看待这个事儿,咱们一会儿说来先这样来写,写完以后的话呢,我们这个把这个词后语句扔进去,然后CTRL1一下,我们就返回一个prepared statement的一个实例了。
12:20
就拿到他的一个实力。没问题,行,拿这个实例以后呢,这时候我能拿这个直接去执行这个SQ语句吗?还不行,你是不是有几个站位符啊,所以下一步我们要做的事呢,叫填充占位符,诶上一步这个我们叫,其实这个呢叫法我们这个官方一点呢,叫预编译SQL语句。返回prepared statement的实例。嗯,一会儿呢,咱们做一个总结,返回它的一个实例,然后填充占位符,这个呢,我们通过去调就行,咱这里边儿一共有三个,所以我就需要调三次,通过点set的方式,Set后边呢,就是看你的类型了。
13:05
这是不是字符串,这字符串对这个类型的话呢,你取决于我们这里边儿,咱们看一下改编表这个date类型,对这个date类型呢,在咱们Java这里边呢,对应的就是circle下的那个date了。嗯,对,是这样的,所以呢,我们这里边点set string是吧?String这里边你告诉我你是哪个index,然后呢,具体的值是多少,这里边需要重点关注,对正常来讲呢,我们说index这个呢,是不是索引零啊,这是以前现在呢,我们凡是跟数据库交互的话,对,因为咱们数据库这块呢,是不是都是从一开始的索引啊,啊对,那所以说我们这块呢,Java在跟数据库在交互的时候呢,这一波API它的索引呢,也是从一开始的,你可看到这set string,看这parameter index the first parameter is1,所以这写的非常清楚啊,所以这块我们这就写一,然后这个位置就写呢,你要添加的这个数据的名字啊,这个添加一个员工,添加一个人,比如最近比较火的。
14:12
吧,对这个哪托哪吒啊行,然后呢,这个哎,这个这个不能写这了啊,接着在点set一个string写他的这个邮箱。对,这个这个他的好像这个哪吒这个额,咱们还不太好写是吧?对昨天呢,这个这不分享说这个gma gma以前我们在实验室的时候呢,大家都已有一个gma,还是感觉很感觉很高大上的啊,现在就白扯了是吧,Set一个date,设置一个日期,日期呢这是我们第三个参数,那这块呢,你既然set date了,这块就一定得写一个date了,这date的话呢,你说我这就new一个date,这个new个date的话呢,这个我们是S加的date了,注意S加date的话呢,一定需要传一个long型的一个变量,那你这块呢,就相当于人家的生日是这一天,先把这个S口再找一下,那你这个呢,相当于是随机写了一个,你也不知道这个生日多少,这个不太合适,那假设呢,这个哪吒就是有一个具体的生日上,那你这块呢,怎么去处理这个问题呢。
15:33
对,咱们讲过那个格式化的问题,对吧?诶,我们这块呢,去用一个simple date formit这块呢,我们得指定具体的pattern的样子了,四个Y大写的MD,对这个M呢,其实是大写哈,为什么不是小写呢?对,小写成了那个minute时间了,对吧,这样。行,然后呢,他这块呢,我们要进行的应该是个pass解析了,需要呢,你告诉我你这个字符串到底长什么样子,这就是他的一个具体的生日,哎,生日呢。
16:08
这有可能是,这应该是公元后了是吧,就是公元,嗯1000年,嗯,这个1月1号,举个例子啊,这个这一天出生的,然后这块呢,我们CTRL一下,这我们就得到了一个U下的,诶这个data的话呢,是我们U下的一个data对吧?啊这个它。然后呢,这个date ctrl c,我们可以呢,给它转化成是一个SQL加的date,它们的共同点呢,就是毫秒数一样的,这是不是就行了,这个咱们在前面讲基础的时候说过这个问题,嗯,行,那么这时候呢,我们叫set data,我就把这个日期也给大家传上了,那至此的话呢,我们这个circle呢,就是一个完整的circle,那这个完整以后,我们下一步我们这个prepared statement,它也是一个信使,相当于statement一样,毕竟是个子接口嘛,然后它呢,就拿着你这个SQL语句呢,就去执行了,所以第六步叫执行SQL。
17:04
那执行circle口或者叫执行操作,我就别写这个circle了,下边呢,我们就这个点执行呢,就叫excute,所以这块呢,我们直接调用这个叫Q操作就可以了。哎,这就行行,那到这块呢,就相当于我们把这个事呢就做完了,做完以后呢,其实别忘了最后还有一步对资源的一个关闭,这个呢是一定要小心的,在咱们前面讲IO流的时候呢,说过IO流要关,讲网络编程的时候呢,说so要关,那讲到数据库连接这块呢,我们说连接需要关。连接不仅需要关这个prepared statement呢,它也需要关,所以这两个都需要关啊,这个关呢,当然谁先谁后呢,这都还好啊,所以这块呢,我们就先后呢,把它俩关闭就行点,做一个close。然后呢,这个诶连接点多一个close。行,这就可以了,主要只涉及到这两个资源,所以关一下就行,那既然呢,你涉及到资源的关闭了,这就别Rose了,对吧?对这块呢,我们需要拆开,把这个信息一直到这一直到这包起来,点右键surround位置,点一下这个挺多的,我们就给它按照一种方式来处理了啊就都删掉了,行,然后这呢来一个finally。
18:25
然后再分别呢,把它们再扔进去,这个咱们前面讲那关流的操作,其实类似这个呢,先给大家来一个默认值,对这个呢,连接咱们给它往上扔,往下扔。或警连接的操作行,然后这里边的话呢,我们在分别对他们进行一个拆开操作,因为他们本身还有异常,这个咱们前面讲流的时候呢,也提过,这个你光关的时候是不是也避免它出现一个控人啊,哎,这个呢大大不等于闹一下。
19:00
那不等于no,你看这就可以了,主要原因呢,是因为我们在获取连接的时候呢,它这个位置也报异常,那万一你要真要报异常了,这个连接相当于就对象没拿到,没拿到的时候呢,你finally还一定会执行避免呢,让他去掉这个close,所以我们有一个判断,避免了这个控制帧的一个问题,这个诶prepared statementment跟刚才说这个连接呢,是一样的道理,哎,刚才说的那个连接是避免它出现空帧啊,Prepared statement一样的道理,避免呢,它这块在对象没有创建啊,这个我们写的是这个啊,对象没有创建的情况下呢,Find有一定会执行避免这块出现一个控制人的调用,所以我们加一个这样的判断,好这就可以了,那写完以后呢,下边我们执行一下。走。诶可以了,这块因为咱们也没有写说叫插入成功啊,那直接回到我们数据库这块,我现在来一个F这个刷新啊点击诶这就进来了,诶所以这呢就实现了一条数据的添加操作,哎就这样来做的好把这个我们先停一下。
我来说两句