00:00
啊,那么接下来呢,我们就把我们刚刚讲的这个方法呢,给他通过一下是吧,你要这么写这个东西看着很不爽啊,所以说我们希望呃,把这个最起码我要把这个连接的获取呢,给它封装成一个工具类来去获取。好,那么接下来我们就来封装一下啊,啊,怎么封装呢?那我们就去用一个class,我们把它放到这个UT下面,这是一个工具包啊,这里面的话就有一个connection us可以吧,啊你们以前是怎么封装的呀?啊怎么封装的呀?呃,用过配置文件吗?用过用过是吧?OK,那太简单了哈,来吧,那我们就写个配置文件呗,在src下面我们去用一个什么东西啊吧,哎,叫什么呀,就叫DB点好这里面我们就写一写啊,比如说JDBC.java就等于什么呀,com.MYSOq.JDBC.java JD bc.url就是JDBC冒号买circle,哎,然后呢,冒号双斜线local host3306,然后呢,Big date_0308对不对,JDBC.user name啊root j dbc.password等于1234,写好了吧,这个有疑问吗?没有吧,OK,很基本的哈,那么接下来我们在这个位置我们就可以怎么做了。
01:48
啊来注意我们封装工具类啊,那么首先呢,我们先把最基本的一些东西呢,都给它定义出来啊呃,因为将来呢,我会通过一个这个静态的代码换啊取什么呀,读取我们的这个DB.pro因此呢,将来我读到以后呢,我要给我的诶,比如说我们将来肯定得有四个,就是我们得有几个什么这个这个成员变量啊,比如说这个Java啊,这个URL啊,什么user name password啊,那么这些东西的话,你需要在这个静态代码块里面使用,因此他们必须得定义成一个静态的这个知道吧,OK,那么就定一下哈,就是private static的字符串类型的谁呀,叫做什么呀,Driver吧,好,等于一个空,先给它定义出来啊,字符串类型的URL等于一个空。
02:42
啊,Static的什么呀?字符串类型的username等于一个空,写错了是吧?啊,Static字符串类型的password等于一个空,OK,那这就写好了,好,写好以后呢,我们还得有一个东西啊,叫做什么呀,Private static的什么呀吧,是不是这个东西啊,OK,来,你有一个pro。
03:14
是不是OK好呃,大家有没有用过一个东西叫做local啊,没有用过吗?啊,那我用一下啊,你要不你写一次呢,你总得学点新的东西呗,是不是老写就着那意思啊来我们就加上它啊,啊这个东西干嘛的呢?注意它是来保证一个线程中只能有一个连接,就是我们可以避免这个连接的一个浪费,因为如果说诶你就直接使用的是这个工具链,那么其实大家之前写的这个工具的应该是你只要调用一个获取连接的方法,它就会给你一个新连接吧,是这么写的呀,这种方式的话,它其实有一个不好的地方是什么呀?就是假如说我在一个线程之内,我每次我要用连接了,我就去开一个新的,我每次要用了,我就去开一个新的,那么这个其实是很浪费这个资源的,那我就希望你一个线程内呢,我就给你保持有一个连接。
04:15
能明白吧,比如说你第一次开了一个链接了,OK,你就再用第二次,如果你又想用链接了,你去获取的时候,我就看一下,如果说你已经开过这个链接了,那我就把你之前打开的那个给你,我就不再给你打开新连接了。能明白这个意思吗?OK,我们就通过这个local来去做这个东西,怎么用呢?大家注意,我们也需要把它定义出来,Private就是我们的的local。好,那么你想让这个w local保证只有一个连接,那么它就是帮我们去管理线程中的连接的,那你就把connection写到这里面理解吧,OK,比如说我们的TL等于new一个local,好,大家注意这个东西很厉害的,明白吧,如果说将来人家问你,你如何来保证你的这个一个连接,就就是你的一个啊,线程中啊,只会存在一个连接,或者说呢,只会存在一个事物啊等等一些,那么你一定要提到我可以使用一个w local来去解决,而且我们框架里面好多东西呢,它也会用到这个w local,因此它呢,诶是问的比较多的一个点啊,但是可能对于大家来讲的话呢,不是啊那么重要了啊,但是呢,你知道有这么个东西存在,肯定对你是有帮助的,好,那我们暂时呢,我们先把代码写成这儿,一会儿我们再去用它啊,接下来我们先把这个。
05:41
文件读取一下怎么读取啊,在这个这里面怎么写的。大家以前怎么写的啊,叫什么漏谁呀?又一个stream fair stream是这么写的吧,OK,但是我注意啊,现在不能这么干了啊,为啥不能这么干了呢?听我说啊,因为你这个new,一个stream,大家来想那个fell input stream,它会指向你本地的一个路径,就是比如说我这个文件是在这个地方的啊,那么它的路径是什么呀?它的路径是这个路径大家注意了啊,就是在我的workpace下面0308,我找一下啊,在这在我的workpa web01下面,Src下面,这个才是它的路径,它会指向到这能理解吧,但是实际上我们将来在运行的时候,我们是运行的这个工程吗?
06:48
不是,我们运行的是部署到tomcat以后的那个。能理解吧,所以说呢,你在本地测试这个没有任何问题,但是只要你部署到tocad以后就出问题了,所以说我们就不能再这么去读取了,那么现在我们要怎么读取呢?大家注意,我们教给大家一种方式,我们使用类加载器来去读取,用过没有用过吧,应该怎么怎么读啊,那你就通过当前的类呗,有点class点啊,这什么东西啊。
07:33
啊,在干嘛呢?不能,还不能会被关是吧?啊,那你想干嘛呀,这是啊来啊怎么写的,有跳点class.get class load,它里面有一个get resource as stream,搞定。他会把一个资源文件给你读成一个stream,而这个stream反馈的就是一个input,你看到没有对吧?因此我们只需要把我们的诶DB.proper往这一放,诶,它就能给你返回一个input stream了。
08:14
能看懂了吧,哎,这样给它往里面读,那么当然啊,大家注意我们把它读进来以后呢,哎,再来往后写,那接下来就是什么practice点漏的是把L放进去就行了吧,但是它会有异常啊,那我们就完整的把这个都给它啊,这个拆开去一下啊。看到了吧,然后呢,呃,读进来以后呢,我们就可以把这几个值给它拿到了,比如说driver就等于啊property.get property我们怎么写的呀,是不是这个GDBC.driver啊对吧?然后呢,URL等于property.get property叫做GDBC.url好,呃,Username呢,等于pros get property叫做GDBC.username这个大家都会写吧,啊,很基本的东西啊,OK,把这个写好,那么写好的话呢,因为这个静态代码话只执行一次啊,所以说我顺带着我就完成一件事,就是class掉for name。
09:18
把这个Java放进去搞定啊,异常的给它搞成最大的,为什么我要把这个放到这来做呢?因为你类加载嘛,这个不就相当于去加载一个类吗?类加载一次是不是写好啊,对吧?诶我就放到静态代码化,因为它有一个特点就是只会执行一次理解了吧,OK,好,那把这个就写好了,写好以后呢,接下来我们就要给大家去提供一个获取连接的方法啊,获取连接的这个方法怎么获取呢?来public首先呢,它也是一个sta的,叫做获取一个连接,我们叫做get c就行了啊,那么以前大家怎么获取的呀,以前的话你就直接用了一个什么。人称什么呀,你是直接JA manager,第2CONNECT是直接这么写的呀,那么如果说每调一次这个方法你都这么来做的话,是不是每调一次就是一个新的连接啊,你再调一次是不又是一个新的连接啊,对吧?所以说我们就不要再去这么做了,我们怎么做呢?我们首先来判断好先尝试从什么呀?TL就是我们w local中获取,好就是先从这个w local中看看有没有,对吧?那么怎么获取呢?那就是注意了啊,就是啊connection Co就等于TL.get。
10:39
理解吧,哎,那么这个第一次的话,你肯定获取不到了,同是你来判断,如果说C等于等于空,那代表着什么意思啊,代表着没有,没有的话,你就必须要把con等于什么呀,JA man你就必须得给它又出来一个明白了吗?那么大家注意扭出来以后呢,一定要记得干什么事啊,把TL.site con把我们当前获取到这个连接绑定到这个s log中,下一次你再获取的时候,这个代码是不是就不不是空了,对吧,他就还还会执行这个吗?不执行了,最后你给他伪成一个什么东西啊,Con能看懂了吗?来这个有异常,有异常的话我们就给他。
11:31
声明一下吧,好吧,你将来你谁调用这个方法,你谁来处理这个异常就行了,好,那么再来给大家分析一下,就是如果你现在想获取一个连接,我先判断一下w local中有没有,假如说它是没有的,那我就给你创建一个新连接,并且呢,把新连接呢,一定要设置到local中,要不你用这个w local的意义就不在了,好,放到这个local以后呢,我就把这个链接给你返回过去了,假如说你第二次来获取了,那么这个时候我一判断这里面是不是有啊,有的话还会执行这个代码吗?不会,那我就直接把链接就给你返回回去了,是不是还是拿着我们上一次的那个链接啊,对吧?OK,这就是我们的外local的一个用法,那同样你还要提供一个关闭连接的方法,这个怎么提供啊。
12:19
Static,哎,直接提供一个什么东西啊,叫做呃,View ID叫做close connection好,这个应该的方我们怎么获取啊,注意你要关的话,你要时刻想着现在连接在哪呢?只要有有连接,它一定是在那个的local中的,你想想是不是啊,因为什么呀?因为我正常获取连接就是从SW local来拿的,就算没有的情况下,你会拗一个连接,但是你创建出来连接立马又放到了s service log中,那么我就敢确保只要有连接,那么它一定在s logo中。所以说呢,我们在关之前呢,我还是要尝试从什么呀TL中获取,大家能明白这个道理吗?嗯,可以的是吧?来,那我们就是connection connection等于TL.get好,那我们现在要注意了,如果说TL点什么呀啊,什么是T啊,这个connection不等于空。
13:19
对吧,那我就可以怎么做了呢?我就会connection掉close了,我把它关掉,理解吧,Close掉以后呢,一定要再去记着做一件事,什么事呢?就是TL.set一个,那相当于我要把T里面的那个连接值为空,明白吧,那么好多的同学想说你不必要了,你都关了,你上设这个闹干嘛呀?我告诉你哈,这是我的local里面有一个connection,对吧?你把对象关了以后呢,注意你只是把这个连接对象置为不可用了,但是对象还在。
14:00
你上面一判断对象等于空吗?不等于它就给了你一个连接,但是你拿到了这个连接呢,是已经关掉的连接,你用不了。那么你就一定要把它置为空,置为反正你注意连接我都关了,也就意味着这个东西我不用了,那我就要把所的local置为空,这样的话你下次再获取它就是空的,就能给你来一个新的连接了,听明白了吗?OK,好,来这个也有一场,那我就给你啊,扔一下就行。好,这就写好了,写好以后呢,我们来测试一下哈啊,那我在这里面的话,我就写个main方法来测试,太简单了啊,Connection等于什么呀?等于get connection,这不是获取了第一个了吗?对吧?来throw一个exception好,那么再来一个C2等于什么呀?Get connection是不是又获取了一次啊,你来对比一下这个connection的这个CONNECTION2。
15:03
相等吗?不等于啊,不等于啊啊那不等于,那你说我干了这半天图啥是不是是不是获取了两次它都是相同的呀,对吧,但是你注意了哈,我第一个我用完了以后呢,我立马调用什么呀,Close,我把它关了,关了以后呢,你再来获取这个这个东西相等吗?啊,绝对不相等,你要是这要是相等了,那就出问题了。是不是不相等了对吧?OK,那么这就是我们的local的一个用法,大家可以要学一学好,那把这个写好以后呢,我们就会重构我们刚刚写好的这个方法了,你看像这个代码,哎哟,太讨厌了是吧,注视掉不用了,我就直接怎么写啊,Connection。来connection connection等于什么呀?直接工具类加get connection搞定是不是啊,哎,直接去用就行了啊,那么最后用完以后呢,我们一定要注意哈,刚才我们都没关啊,注意connection有your close就行了。
16:17
明白了吗?OK,好,这就写好了,以前大家写这个close方法的时候,你是不是还得把那个连接传回去啊,现在还用传吗?不用,因为我就知道连接就在死亡的logo里面,对不对?OK,那么这个关的话有一个异常的,这个异常我们得给人家传开一下啊,好,那么这就把这个方法写好了,那么这种写好以后的话呢,我们再来测试一下,我们重构以后,我们这个整个的业务还能不能跑得通啊。好,重新来启动一下。好来刷新我们的浏览器啊,我们输入密,比如说123456正常现象登录成功了吧,来再来输个错的,789456呢,这就是一个错的,你看是不是登录失败了。
17:12
看明白了吗?OK,好,那么这个时候我们诶又重构了一个工具类啊。
我来说两句