Java基础知识-06-C-2020-08-10

日志编号说明
C-2020-08-11第一次创建。这里的内容并没有写完。因为在Druid和hikariCP的实际使用中,都是结合spring框架使用。但是这部分内容并没有进行介绍。因此第一版先写到这里就发布,Druid和hikariCP会在讲解完spring之后进行补充。

ODBC和JDBC

ODBC

开放数据库连接(Open Database Connectivity,ODBC)是操作系统提供给我们去访问数据源的一个工具。以Windows为例,在控制面板–管理工具–数据源(ODBC)。
Windows系统下ODBC的位置

JDBC

Java数据库连接,(Java Database Connectivity,简称JDBC),是Java对外提供的一套访问数据库的标准接口。各个数据库厂商如果想要Java实现访问数据库的功能,就需要实现这套接口。各个数据库的实现类中有自己对Java的Jar包,在使用时,引入相应Jar包即可。

JDBC开发步骤

在使用不同厂商提供的Jar包时,由于他们都实现了统一的接口,所以在编程的过程里步骤都一样。JDBC编程遵照如下步骤。

  1. 注册Driver
Class.forName("");

使用不同数据库Jar包的时候,需要先这样注册驱动。class.forName()方法使用了反射和SPI机制。

反射机制是因为ForName过程会生成一个CLass< T >对象。
SPI机制,SPI全称为Service Provider Interface,是JDK内置的一种服务提供发现机制。简单来说,是一种动态替换发现机制。这种机制简单来说就是在使用某个接口的过程里,程序运行起来之后这个接口才发现自己要用的是某个具体的实现类。之后基于SPI机制将实现类绑定到接口上(个人理解,文字描述可能存在误差)。SPI机制允许这种绑定可以发生在
体现在,代码运行起来之后,加载Driver类的时候,类中的静态代码快会被首先调用。在静态代码块中new一个Driver对象,并且将这个对象通过DriverManager.RegisterDriver()方法注册到DriverManager中。这一步就是通过SPI机制完成。

  1. 创建连接
DriverManager.getConnection("url","username","password");

通过上一步把驱动注册到了DriverManager中,这一步才能正常去getConnection。
其中url针对不同的数据库厂商的写法会有不同,各个厂商里都有自己的固定写法。

  1. 拼写SQL
    为了防止SQL注入,在拼写SQL的时候对于参数使用?进行占位。
  2. 创建PreparedStatement
    同样为了避免SQL注入,因此采用PreparedStatement。
connection.PreparedStatement(sql);
  1. 给PreparedStatement设置参数
    给PreparedStatement里面设置参数值。PreparedStatement里面针对不同数据类型的参数,提供了不同的set方法。在设置值的时候,第一个参数对应sql中?的序数,从1开始。

  2. 执行SQL
    PreparedStatement有三种单次执行方法,分别如下:

方法名返回值
execute()返回boolean。这里的boolean并不表示执行是否成功,而是执行之后如果至少包含一个结果集,则返回true,反之返回false
executeQuery()返回ResultSet对象,结果集
executeUpdate()返回Int值,表示档次操作影响的行数

上述涉及的三个方法里,execute()方法可以用来执行任意SQL语句,包括建表语句。
第二个方法executeQuery(),只能执行查询。
第三个方法用于创建,修改,删除操作。

加入在执行查询之后,返回一个ResultSet(结果集)。可以用next方法进行循环取值

while(resultSet.next()){
	//不推荐
	resultSet.getInt(1);
	//推荐
	resultSet.getString("ename");
	.....
}

,上述代码示例中有这几个点需要注意。
首先,==next()==方法。这个方法与Iterator中的hasNext不同。它虽然也返回boolean值,但是当有下一个对象的时候,同时会将指针移动到下一个元素。
另外,取值的时候是用getInt还是getString或者其他类型,是因为ResultSet中对应的列会返回什么类型的数据。
最后,在示例中有两种从ResultSet中取值的方法。一种是根据返回字段的下标(从1开始,数字表示结果集中的第几列)。但是这个写法不推荐因为一旦SQL查询语句变化,就需要重新编写这个过程。
推荐采用第二种写法,根据结果集中的列名进行取值。

上述一致用执行单个SQL为例,这里简要提一下批处理。
唯一需要注意的就是,在给SQL设置参数之后,执行**addBatch()方法。并在执行SQL的时候用executeBatch()**方法即可。

  1. 关闭连接
    关闭连接的时候需要遵照如下顺序。
resultSet.close();
preparedStatement.close();
connection.close();

数据库连接池

拓展阅读,也就在这里顺嘴提一下,现在工作中99%的时候都用不上它,剩余的1%就是因为项目太老了。这个就是DBUtil。
DBUtil是Apache基金会下的一个子项目,提供了更加便利地去访问数据库的操作,这里只会提一下这个工具,详情见DBUtil官网

数据库连接池关注点

在数据库连接池或者线程池中,都需要考虑如下四个核心问题。

  1. 初始值
  2. 最大容量
  3. 在最大容量内,每次扩容大小
  4. 连接的存活时间

不论在使用何种数据库时,往往除了连接池本身的特点外,这四个也是会影响我们最终选择时的核心考量因素。常见的数据库连接池包括DBCP,C3P0,Druid,hikariCP。

DBCP

DBCP是Apache基金会下的一个子项目,是一个早期存在的数据库连接池,现在在工作中基本不用,除非项目太旧。这里提到就是扩充一下知识面。顺嘴一提,在实际使用和学习时,可以使用傻瓜式DataSource:BasicDataSource。

在使用DBCP时,需要引入common-dbcp2,common-pool2和common-logging这三个jar包。 这三个都是Apache Common下面的子项目,下载和使用都很方便。详细示例参见官网:DBCP连接池

C3P0

C3P0也是个相对较早的数据库连接池。C3P0官网,官网的知识很全面,并且有一个非常棒的QuickStart例子以供学习,大家完全可以按照官网的步骤,一步一步实现整个过程。

C3P0与DBCP相比,除了性能上的部分细微优势之外,最主要的提升是C3P0在实现的时候提供了自己的config形式。它对properties和xml有很好的支持。

在使用C3P0时,需要引入c3p0-0.9.5.5.jar 和mchange-commons-java-0.2.19.jar这两个jar到工程里。
按QuickStart来看,日常使用和学习是推荐使用ComboPooledDataSource。
注意,C3P0提供按照properties和xml的配置文件。配置文件命名必须是c3p0.properties或者c3p0-config.xml。并且,根据C3P0自己的config类中定义,在c3p0.properties中的配置信息必须以c3p0开头,即**c3p0.**这种形式。

Druid

Druid是阿里推出的数据库连接池。所有的官方资料都在GitHub上:Druid连接池官方资料,Druid中文wiki:druid常见问题,中文版。推荐大家都去wiki上看看,里面的内容很详细,除过上面这个wiki,还有wiki的主页:wiki主页

hikariCP

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值