Java Web __ JDBC
JDBC
什么是JDBC?
全称是Java数据库连接(Java Database Connectivity),应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。
具体实现
由java设计jdbc驱动器以及驱动器接口,
然后各个数据库厂商实现接口建立JDBC驱动器
操作:
-
JDBC的基本操作
-
JDBC批处理
在实际开发中,经常需要向数据库发送多条SQL语句,这时,如果逐条执行这些SQL语句,效率会很低。
为此,JDBC提供了批处理机制,即同时执行多条SQL语句。Statement和PreparedStatement都实现了批处理。 -
JDBC处理事务
数据库连接池
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
为了避免频繁的创建数据库连接,提出了数据库连接池技术。
什么是数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。
通过连接池连接数据库过程:
-
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,
-
当应用程序访问数据库时并不是直接创建Connection,而是向连接池“申请”一个Connection。
如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。 -
使用完毕后,连接池会将该Connection 回收,并交付其他的线程使用,
以减少创建和断开数据库连接的次数,提高数据库的访问效率。
DataSource接口
为了获取数据库连接对象(Connection),JDBC提供了javax.sql.DataSource接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法:
- Connection getConnection()
- Connection getConnection(String username,String password)
很明显第一个是无参,第二个需要传递登录信息
数据源
我们习惯性的把实现了javax.sql.DataSource接口的类称为数据源,
顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息。
数据源中包含数据库连接池。如果数据是水,数据库就是水库,数据源就是连接水库的管道,终端用户看到的数据集是管道里流出来的水。
常用数据源
- DBCP
- C3P0
DBCP数据源
DBCP是数据库连接池(DataBase Connection Pool)的简称,是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件。
单独使用DBCP数据源时,需要在应用程序中导入两个jar包:
-
commons-pool.jar包
DBCP数据库连接池实现包的依赖包,为commons-dbcp.jar包中的方法提供了支持。 -
commons-dbcp.jar包
是DBCP数据源的实现包,包含了所有操作数据库连接信息和数据库连接池初始化信息的方法,并实现了DataSource接口的getConnection()方法。
获取DBCP数据源对象
commons-dbcp.jar包中包含两个核心类,分别是BasicDataSourceFactory和BasicDataSource,它们都包含获取DBCP数据源对象的方法。
BasicDataSource
是DataSource接口的实现类,主要包括设置数据源对象的方法。
常用方法
BasicDataSourceFactory
是创建BasicDataSource对象的工厂类,它包含一个返回值为BasicDataSource对象的方法createDataSource(),该方法通过读取配置文件的信息生成数据源对象并返回给调用者。这种把数据库的连接信息和数据源的初始化信息提取出来写进配置文件的方式,让代码看起来更加简洁,思路也更加清晰了。
当使用DBCP数据源时,首先得创建数据源对象
创建数据源对象方式
-
通过BasicDataSource类直接创建数据源对象
使用BasicDataSource类创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象。 -
通过读取配置文件创建数据源对象
使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。
C3P0数据源
C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和 Spring使用的都是该数据源。
我们在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法。
C3P0和DBCP数据源所提供的方法大部分功能相同
都包含了设置数据库连接信息的方法和数据库连接池初始化的方法,以及DataSource接口中的getConnection()方法。
创建数据源对象
创建数据源对象可以使用ComboPooledDataSource类。
该类有两个构造方法
-
通过ComboPooledDataSource类直接创建数据源对象
使用ComboPooledDataSource类直接创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象 -
通过读取配置文件创建数据源对象
通过ComboPooledDataSource (String configName)构造方法读取c3p0-config.xml配置文件,创建数据源对象,然后获取数据库连接对象。
DBUtils工具
为什么要使用commons-dbutils组件?
- 为了更加简单地使用JDBC,Apache组织提供了一个工具类库commons-dbutils组件。
- 该组件实现了对JDBC的简单封装,可以在不影响性能的情况下极大简化JDBC的编码工作量。
commons-dbutils的核心是两个类和一个接口
DBUtils类
主要为如关闭连接、装载JDBC驱动程序之类的常规工作提供方法,
它提供的方法都是静态方法,如下所示。
close()
closeQuietly(Connection conn,Statement stmt,ResultSet rs)
commitAndCloseQuietly(Connection conn)
loadDriver(java.lang.String driverClassName)
QueryRunner类
简化了执行SQL语句的代码,它与ResultSetHandler组合在一起就能完成大部分的数据库操作,大大减少编码量。
针对不同的数据库操作,QueryRunner类提供的不同的方法。
- query(Connection conn, String sql, ResultSetHandler rsh, Object[] params)
- query(String sql, ResultSetHandler rsh, Object[] params)
- query(Connection conn, String sql, ResultSetHandler rsh)
- update(Connection conn, String sql, Object[] params)
- update(Connection conn, String sql)
ResultSetHandler接口
用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式,根据结果集中数据类型的不同,ResultSetHandler提供了不同的实现类。
-
ArrayHandler和ArrayListHandler类可以将把结果集中的第一行数据转成对象数组。
-
BeanHandler、BeanListHandler和BeanMapHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。
-
MapHandler和MapListHandler类是将结果集数据存成Map映射。
-
当我们需要查询结果集中的一列数据时,可以使用ColumnListHandler类。