一、开源的(数据库连接池)数据源使用
1、DBCP:DataBase Connection Pool
1.1、需要的jar:commons-dbcp.jar 和 commons-pool.jar
1.2、把DBCP的配置文件dbcpconfig.properties拷贝到构建路径src中
dbcpconfig.properties内容如下
----------------------------------------------------------------
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day16
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ
----------------------------------------------------------------
1.3、使用到的DBCP工具类
*****************************************************************************************************
public class DBCPUtil {
private static DataSource ds;
static{
try {
InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties props = new Properties();
props.load(in);
ds = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
*****************************************************************************************************
1.4、使用例子:
*****************************************************************************************************
public class DaoDemo {
@Test
public void add(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = DBCPUtil.getConnection();
System.out.println(conn.getClass().getName());
}catch(Exception e){
e.printStackTrace();
}finally{
DBCPUtil.release(rs, stmt, conn);
}
}
}
*****************************************************************************************************
2、C3P0:是一个机器人的代号
2.1、 需要的jar: c3p0-0.9.1.2.jar 和 c3p0-0.9.1.2-jdk1.3.jar
c3p0-oracle-thin-extras-0.9.1.2.jar(注: 该jar只在连接Oracle数据库时才使用)
2.2、 把C3P0的配置文件c3p0-config.xml拷贝到构建路径src中
c3p0-config.xml的配置内容如下:(注: 此处可以配置多个数据库,随时切换,而DBCP只可以配置一个)
-----------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<named-config name="intergalactoApp">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
<property name="user">root</property>
<property name="password">sorry</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
-----------------------------------------------------------------------------------------------
2.3、使用到的C3P0工具类
-----------------------------------------------------------------------------------------------
public class C3P0Util {
private static ComboPooledDataSource cpds = new ComboPooledDataSource();
public static Connection getConnection(){
try {
return cpds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
// 注: 此处close在开源数据源已经被改写了,返回连接到数据库连接池中,而非直接关闭连接
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
-----------------------------------------------------------------------------------------------
2.4、使用例子:
-----------------------------------------------------------------------------------------------
public class DaoDemo2 {
@Test
public void add(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = C3P0Util.getConnection();
System.out.println(conn.getClass().getName());
}catch(Exception e){
e.printStackTrace();
}finally{
C3P0Util.release(rs, stmt, conn);
}
}
}
-----------------------------------------------------------------------------------------------
二、数据库元信息的获取(编写框架时使用)
1、 元数据-DataBaseMetaData:数据库、表、列的定义信息。
获取数据库的元信息常用方法:
Connection.getMetaData()
DataBaseMetaData对象
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
2、 元数据-ParameterMetaData
获取SQL语句中的占位符信息常用方法:
PreparedStatement . getParameterMetaData() :
获得代表PreparedStatement元数据的ParameterMetaData对象。
获得指定参数占位符?的个数: getParameterCount()
获得指定参数的sql类型(驱动可能不支持): getParameterType(int param)
3、 元数据- ResultSetMetaData
获取结果集中的元数据信息常用方法:
ResultSet. getMetaData() :
获得代表ResultSet对象元数据的ResultSetMetaData对象。
返回resultset对象的列数: getColumnCount()
获得指定列的名称: getColumnName(int column)
获得指定列的类型 java.sql.Types: getColumnTypeName(int column)
注:
数据库的列数是从1开始的,所以遍历时角标要加1
获得指定列的类型时,显示的列类型为数字,在API中的Types中查询定义的常量
有: 4对应INTEGER 7对应REAL 12对应VARCHAR
例:
********************************************************************************************
public class MetaDataDemo {
// 获取数据库的元数据信息DataBaseMetaData
@Test
public void test1() throws Exception{
Connection conn = DBCPUtil.getConnection();
DatabaseMetaData dbmd = conn.getMetaData();
System.out.println(dbmd.getURL());
System.out.println(dbmd.getUserName());
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getDatabaseProductVersion());
System.out.println(dbmd.getDriverName());
System.out.println(dbmd.getDriverVersion());
System.out.println(dbmd.isReadOnly());
conn.close();
}
// 获取SQL语句中的占位符信息ParameterMetaData
// 获取SQL语句中占位符?的个数
@Test
public void test2() throws Exception{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("insert into t1 values(?,?,?,?,?)");
ParameterMetaData pmd = stmt.getParameterMetaData();
System.out.println(pmd.getParameterCount());
stmt.close();
conn.close();
}
// 获取结果集中的元数据信息: ResultSetMetaDate
@Test
public void test() throws Exception{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("select * from account");
ResultSet rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
// 显示结果集列数
int count = rsmd.getColumnCount();
System.out.println(count);
// 显示列名称和列类型 注:数据库是从1开始的,所以要加1
// 注: 此处显示的列类型为数字 4对应INTEGER 7对应REAL 12对应VARCHAR 在API中的Types中查询定义的常量
for(int i=0; i<count; i++){
System.out.println("列名:"+rsmd.getColumnName(i+1)+"\t类型:"+rsmd.getColumnType(i+1));
}
rs.close();
stmt.close();
conn.close();
}
}
********************************************************************************************