开源数据库连接池
l
现在很多
WEB
服务器
(
Weblogic
,
WebSphere
, Tomcat)
都提供了
DataSoruce
的实现,即连接池的实现。通常我们把
DataSource
的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
l
也有一些开源组织提供了数据源的独立实现:
•
DBCP
数据库连接池
•
C3P0
数据库连接池
l
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。
程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。
DBCP数据源
l
DBCP
是
Apache
软件基金组织下的开源连接池实现,使用
DBCP
数据源,应用程序应在系统中增加如下两个
jar
文件:
•
Commons-dbcp.jar
:连接池的实现
•
Commons-pool.jar
:连接池实现的依赖库
l
Tomcat
的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
DBCP数据源
static{
InputStream in =JdbcUtil.class.getClassLoader().
getResourceAsStream("dbcpconfig.properties");
Properties prop = newProperties();
prop.load(in);
BasicDataSourceFactoryfactory =newBasicDataSourceFactory();
dataSource =factory.createDataSource(prop);
}
C3P0数据源
JNDI技术简介
l
JNDI(Java Naming and DirectoryInterface)
,
Java
命名和目录接口,它对应于
J2SE
中的
javax.naming
包,
l
这套
API
的主要作用在于:它可以把
Java
对象放在一个容器中(
JNDI
容器),并为容器中的
java
对象取一个名称,以后程序想获得
Java
对象,只需通过名称检索即可。
l
其核心
API
为
Context
,它代表
JNDI
容器,其
lookup
方法为检索容器中对应名称的对象。
编写自己的JDBC框架
元数据-DataBaseMetaData
l
元数据:数据库、表、列的定义信息。
l
Connection.getDatabaseMetaData
()
l
DataBaseMetaData
对象
•
getURL
()
:返回一个
String
类对象,代表数据库的
URL
。
•
getUserName
()
:返回连接当前数据库管理系统的用户名。
•
getDatabaseProductName
()
:返回数据库的产品名称。
•
getDatabaseProductVersion
()
:返回数据库的版本号。
•
getDriverName
()
:返回驱动驱动程序的名称。
•
getDriverVersion
()
:返回驱动程序的版本号。
•
isReadOnly
()
:返回一个
boolean
值,指示数据库是否只允许读操作。
元数据-ParameterMetaData
l
PreparedStatement
.
getParameterMetaData
()
•
获得代表
PreparedStatement
元数据的
ParameterMetaData
对象。
•
Select* from user where name=? And password=?
l
ParameterMetaData
对象
•
getParameterCount
()
•
获得指定参数的个数
•
getParameterType
(
int
param
)
•
获得指定参数的
sql
类型
元数据-ResultSetMetaData
l
ResultSet
.
getMetaData
()
•
获得代表
ResultSet
对象元数据的
ResultSetMetaData
对象。
l
ResultSetMetaData
对象
•
getColumnCount
()
•
返回
resultset
对象的列数
•
getColumnName
(
int
column)
•
获得指定列的名称
•
getColumnTypeName
(
int
column)
•
获得指定列的类型
使用元数据简化JDBC代码
l
业务背景:系统中所有实体对象都涉及到基本的
CRUD
操作:
•
所有实体的
CUD
操作代码基本相同,仅仅发送给数据库的
SQL
语句不同而已,因此可以把
CUD
操作的所有相同代码抽取到工具类的一个
update
方法中,并定义参数接收变化的
SQL
语句。
•
实体的
R
操作,除
SQL
语句不同之外,根据操作的实体不同,对
ResultSet
的映射也各不相同,因此可义一个
query
方法,除以参数形式接收变化的
SQL
语句外,可以使用策略模式由
qurey
方法的调用者决定如何把
ResultSet
中的数据映射到实体对象中。
O-RMapping简介
l
什么是
O-R Mapping
l
常用
O-R Mapping
映射工具
•
Hibernate
•
Ibatis
•
Commons
DbUtils
(
只是对
JDBC
简单封装
)
Apache—DBUtils框架
l
commons-
dbutils
是
Apache
组织提供的一个开源
JDBC
工具类库,它是对
JDBC
的简单封装,学习成本极低,并且使用
dbutils
能极大简化
jdbc
编码的工作量,同时也不会影响程序的性能。因此
dbutils
成为很多不喜欢
hibernate
的公司的首选。
l
API
介绍:
•
org.apache.commons.dbutils.QueryRunner
•
org.apache.commons.dbutils.ResultSetHandler
•
工具类
•
org.apache.commons.dbutils.DbUtils
、。
DbUtils类
l
DbUtils
:提供如关闭连接、装载
JDBC
驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
•
public static void close(…) throws
java.sql.SQLException
:
DbUtils
类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是
NULL
,如果不是的话,它们就关闭
Connection
、
Statement
和
ResultSet
。
•
public static void
closeQuietly
(…):
这一类方法不仅能在
Connection
、
Statement
和
ResultSet
为
NULL
情况下避免关闭,还能隐藏一些在程序中抛出的
SQLEeception
。
•
public static void
commitAndCloseQuietly
(Connection conn)
: 用来提交连接,然后关闭连接,并且在关闭连接时不抛出
SQL
异常。
•
public static
boolean
loadDriver
(
java.lang.String
driverClassName
)
:这一方装载并注册
JDBC
驱动程序,如果成功就返回
true
。使用该方法,你不需要捕捉这个异常
ClassNotFoundException
。
QueryRunner类
l
该类简单化了
SQL
查询,它与
ResultSetHandler
组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
l
QueryRunner
类提供了两个构造方法:
•
默认的构造方法
•
需要一个
javax.sql.DataSource
来作参数的构造方法。
QueryRunner类的主要方法
l
publicObject query(Connection conn, String
sql
, Object[]
params
,
ResultSetHandler
rsh
) throws
SQLException
:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。
该方法会自行处理
PreparedStatement
和
ResultSet
的创建和关闭
。
l
publicObject query(String
sql
, Object[]
params
,
ResultSetHandler
rsh
) throws
SQLException
:
几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源
(
DataSource
)
或使用的
setDataSource
方法中重新获得
Connection
。
l
l
publicObject query(Connection conn, String
sql
,
ResultSetHandler
rsh
) throws
SQLException
:
执行一个不需要置换参数的查询操作。
l
l
public
int
update(Connection conn, String
sql
, Object[]
params
) throws
SQLException
:
用来执行一个更新(插入、更新或删除)操作。
l
l
public
int
update(Connection conn, String
sql
) throws
SQLException
:用来执行一个不需要置换参数的更新操作。
ResultSetHandler接口
l
该接口用于处理
java.sql.ResultSet
,将数据按要求转换为另一种形式。
l
ResultSetHandler
接口提供了一个单独的方法:
Object handle (
java.sql.ResultSet
.
rs
)
。
ResultSetHandler接口的实现类
l
ArrayHandler
:把结果集中的第一行数据转成对象数组。
l
ArrayListHandler
:把结果集中的每一行数据都转成一个数组,再存放到
List
中。
l
BeanHandler
:将结果集中的
第一行
数据封装到一个对应的
JavaBean
实例中。
l
BeanListHandler
:将结果集中的每一行数据都封装到一个对应的
JavaBean
实例中,存放到
List
里。
l
ColumnListHandler
:将结果集中某一列的数据存放到
List
中。
l
KeyedHandler
(name)
:将结果集中的每一行数据都封装到一个
Map<
列名
,
列值
>
里,再把这些
map
再存到一个
map
里,其
key
为指定的
key
。
l
MapHandler
:将结果集中的第一行数据封装到一个
Map
里,
key
是列名,
value
就是对应的值。
l
MapListHandler
:将结果集中的每一行数据都封装到一个
Map
里,然后再存放到
List
注意事项
l
不管
java
的对象存在何种关系,反映到关系型数据库中,都是使用外键表示纪录(即对象)的关联关系。
l
设计
java
对象如涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系
(
或使用延迟加载的方式
)
。