+
1.1概念及访问
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。我们访问数据库可以通过数据库管理软件比如Navicat..,今天是通过Java代码.但是首先都需要连接上数据库(使用账号,密码,以及想连接哪个数据库..)
1.2数据库连接池的好处
- 节约资源
- 用户访问高效
1.3实现:
标准接口:DataSource javax.sql包下的。方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。
如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。
1.4实践
这篇文章我想从面向过程逐渐过渡到面向对象,通过代码一点一点的改变,感受一下从执行者变成指挥者的感觉。文章有点粗糙,如果你能手动敲完这几个版本,那么你的收获会很大!
先铺垫点前驱知识:
MySQL驱动(driver):对JDBC接口的实现,用来操作MySQL数据库!!
JDBC的操作步骤:
- 加载数据库驱动程序
- 连接数据库
- 操作数据库
- 关闭数据库
在Java中使用JDBC,需要按照以下的模型来编码:
- bean------数据模型
- Dao-----数据库操作功能封装层,定义接口以及接口实现类
- util-----数据库配置层,用来连接数据库
第一个版本
从第一个版本到第三个版本都需要使用到mysql-connector-java-5.1.45-bin.jar这个jar包,步骤是创建跟src同级目录lib。导入上述jar包,并添加到构建路径。如果不会添加构建路径,请移步查看:
滨少:JDBC原生
滨少:JDBC原生zhuanlan.zhihu.com
这里介绍1.0版本,首先是util配置层,注意一点!!!第10行的驱动路径,就是mysql.jdbc包下的Driver类,不是随便写的!配置过程是:
- 1定义连接数据库所需的数据值
- 2.加载驱动类
- 3.获取数据库连接对象。
中间需要导包,导入的是Connection.sql下的包,导入其他的包就会报错,让你强转类型。
接下来是dao层的接口,这里接口定义了增删改查四个方法。
接下来是dao层中的实现类,它是实现了接口并对方法重写,大家认真看实现类图中的红色框框,发现,这里的sql语句写死了,就是说我现在一个方法只能执行一条特定的代码,这代码显然不可用。而且此时查询方法查出来的数据是单一的,他们不是一个学生对象。这就是1.0版本,相信大家对连接池的运行过程有一定的了解。下面的2.0版本会对学生对象进行封装。
工具类
第10行的驱动路径,就是mysql.jdbc包下的Driver类,不是随便写的!
滨少:JDBC原生
第10行的驱动路径,就是mysql.jdbc包下的Driver类,不是随便写的!
用于增删改查的接口
上面接口的实现类
第二个版本
第二个版本的util层跟1.0版本的一样,看上面的即可(减少阅读负担)。
通过这个版本可以看出这个版本解决了sql命令固定的问题,这下执行的命令和条件就是由自己输入。这里的?占位符号,这里占位符号下面需要替换问号。还有封装了学生对象,查询时输出的就是一个个学生对象,对应数据库中的一条条记录。可能大家觉得这很nice了。但是2.0版本还是可以优化的,大家可以看一下几个方法重复的打码挺多的,例如ResultSet,Statement,Connection对象的关闭,这些close方法可以封装优化。还有获取connection(数据库连接对象),获取执行sql命令的statement,执行命令是否也是一样呢。看到这,又能封装了,干的漂亮,我们来看3.0版本。
接口
学生类(JavaBean)
这里bean层的学生类就截图成员变量,下面的构造方法,get,set方法,toString方法自己脑补哈哈哈。
接口实现类
第三个版本
第一个改变的地方就是在util中新定义了三个需要关闭的变量,这里框中设成私有为了安全,静态为了类名能直接调用,但是别加final,用了final成自定义常量了,下面就用不了刚开始置为空,在封装的close方法中只要不是null说明用过了就可以关闭。
第二个改变的是我们发现增删改的代码是差不多的可以封装成一个方法,差距就在于增删改根据条件的不同,问号的数量不同罢了。所以我们引入了可变参数,这里不知道可变参数的可以自行百度完,在回看文章,可变参数也叫可变数组,所以我们遍历数组查看是否有参数,有参数就进行替换。替换时需要注意的是遍历的是个数组,所以下标从0开始,在替换问号,替换的是第几个问号,没有第0个问号这一说吧。所以替换方法中第一个参数是i+1.这么一看是不是更猛了。不禁感叹前辈们的大脑装的是啥,Java之父牛逼!就这?还没有结束,接下来上我们的终极版本!
工具类
这里框中设成私有为了安全,静态为了类名能直接调用,但是别加final,用了final成自定义常量了,下面就用不了
终极版本
在使用第四个版本之前需要使用到一个第三方的工具包:commons-dbutils-1.7.jar这个可以去官网下载。我先自己传一个到网盘哈哈哈。找不到的可以评论留言找我拿。
第一个改变的地方就是在util中新定义了三个需要关闭的变量,这里框中设成私有为了安全,静态为了类名能直接调用,但是别加final,用了final成自定义常量了,下面就用不了刚开始置为空,在封装的close方法中只要不是null说明用过了就可以关闭。
第二个改变的是我们发现增删改的代码是差不多的可以封装成一个方法,差距就在于增删改根据条件的不同,问号的数量不同罢了。所以我们引入了可变参数,这里不知道可变参数的可以自行百度完,在回看文章,可变参数也叫可变数组,所以我们遍历数组查看是否有参数,有参数就进行替换。替换时需要注意的是遍历的是个数组,所以下标从0开始,在替换问号,替换的是第几个问号,没有第0个问号这一说吧。所以替换方法中第一个参数是i+1.这么一看是不是更猛了。不禁感叹前辈们的大脑多么猛,Java之父牛逼!就这?还没有结束,接下来上我们的终极版本!
工具类
接口
实现类
终极版的改变在于引入的第三方工具包的强大,这一次我们的util层特别的简单,不在定义变量而是直接传入。还新建了方法返回线程池,接下来重点在实现方法时,可以看到我反复在框一条代码。
QueryRunner queryRunner = new QueryRunner(DBCPUtil.getDataSource());
重点就在这了,这个类是jar包中的类,这个jar包来自阿帕奇。这个类创建时需要传入一个数据库连接池对象。这里我们在DBCPUtil类中已经有返回连接池对象了,为什么要单独一个方法返回数据库连接池对象,因为定义时,数据库连接池是静态私有的,只有本类才能使用,所以用方法返回出去,使得dao层的实现类可以使用。创建的这个对象他是用来执行sql命令的,通过调用方法update这个方法完成一系列操作,比如分配Connection对象都是由这来执行的。
前面放sql,后面的看需要来选方法
update和query,在该包中,增删改所用的方法都是update,与查询有关的都用query方法。
我猜测终极版本的代码底层应该也是类似于3.0版本的封装方法。
2020.4.20补充:mysql在于应用进行连接时需要使用mysql的驱动包mysql-connector-java-5.1.45-bin.jar。