Java 為數(shù)據(jù)庫連接池提供了公共的接口:javax.sql.DataSource迷帜,各個(gè)廠商需要讓自
己的連接池實(shí)現(xiàn)這個(gè)接口音诫。這樣應(yīng)用程序可以方便的切換不同廠商的連接池!
常見的連接池:DBCP、 C3P0麸折。
接下來钠糊,我們就詳細(xì)的學(xué)習(xí)連接池挟秤。
C3P0 開源免費(fèi)的連接池!目前使用它的開源項(xiàng)目有:Spring抄伍、 Hibernate 等艘刚。使用第
三方工具需要導(dǎo)入 jar 包,c3p0 使用時(shí)還需要添加配置文件 c3p0-config.xml
c3p0-0.9.2-pre5.jar
mchange-commons-java-0.2.3.jar
下面是通過手動(dòng)來設(shè)置數(shù)據(jù)源:(后面講解如何從配置文件 c3p0-config.xml文件中來設(shè)置數(shù)據(jù)源)
package com.igeek_01_c3p0;
import java.sql.Connection;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
*
* @ClassName: C3P0Demo_01
* @Description: TODO(C3P0 的基本配置)
* @date 2018 年 1 月 30 日 下午 1:44:42
* Company www.igeekhome.com
*
*/
public class C3P0Demo_01 {
@Test
public void demo01() throws Exception{
//1 獲得連接池(數(shù)據(jù)源)
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//1.1 設(shè)置基本項(xiàng)
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/igeek");
dataSource.setUser("root");
dataSource.setPassword("root");
//1.2 其他項(xiàng)
// * 初始化連接池中連接的個(gè)數(shù)
dataSource.setInitialPoolSize(5);
// * 最小|最大 連接池中連接的個(gè)數(shù)
dataSource.setMinPoolSize(2);
dataSource.setMaxPoolSize(10);
// * 最大空閑數(shù)
dataSource.setMaxIdleTime(60);
// * 每次增長個(gè)數(shù)
dataSource.setAcquireIncrement(2);
//2 獲得連接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
配置文件名稱:c3p0-config.xml (格式固定)
配置文件位置:src (類路徑)
配置文件內(nèi)容:默認(rèn)配置
<c3p0-config>
<!-- 默認(rèn)配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/igeek</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</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>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
</c3p0-config>
屬于自定義截珍,可以根據(jù)情況修改相應(yīng)屬性攀甚;基本項(xiàng)必須要與自己的相應(yīng)屬性一致
<c3p0-config>
<named-config name="igeekhome">
<!-- 連接數(shù)據(jù)庫的4項(xiàng)基本參數(shù) -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/igeek</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 如果池中數(shù)據(jù)連接不夠時(shí)一次增長多少個(gè) -->
<property name="acquireIncrement">5</property>
<!-- 初始化連接數(shù) -->
<property name="initialPoolSize">20</property>
<!-- 最小連接受 -->
<property name="minPoolSize">10</property>
<!-- 最大連接數(shù) -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量 -->
<property name="maxStatements">0</property>
<!-- 連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù) -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
代碼展示如何從配置文件中設(shè)置數(shù)據(jù)源:
package com.igeek_01_c3p0;
import java.sql.Connection;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
*
* @ClassName: C3P0Demo_02
* @Description: TODO(使用 c3p0-config.xml 進(jìn)行 c3p0 的配置)
* @date 2018 年 1 月 30 日 下午 1:45:20
* Company www.igeekhome.com
*
*/
public class C3P0Demo_02 {
@Test
public void demo01() throws Exception {
// 1 獲得連接池(數(shù)據(jù)源)
// * c3p0 jar 包將自動(dòng)加載“ c3p0-config.xml”文件岗喉,并獲得具體的配置信息
// ** 在配置文件中 <named-config name="名稱"> 秋度,可以通過核心類 new
//ComboPooledDataSource("名稱")***注意這里named-config name="名稱"***
ComboPooledDataSource dataSource = new
ComboPooledDataSource("igeekhome");
// 2 獲得連接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
c3p0Utils.java代碼如下;
package com.igeek_01_c3p0;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* @ClassName: C3P0Utils
* @Description: 等效 JdbcUtils,用于提供獲得連接工具類
* @date 2018年1月30日 下午1:56:50 Company www.igeekhome.com
*
*/
public class C3P0Utils {
// 連接池
private static ComboPooledDataSource dataSource = new
ComboPooledDataSource("igeekhome");
/**
* 獲得數(shù)據(jù)源(連接池)
*
* @return
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 獲得連接
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
// 將從連接池中獲得連接
return dataSource.getConnection();
}
}
DBCP 也是一個(gè)開源的連接池诞丽,是 Apache Common 成員之一鲸拥,在企業(yè)開發(fā)中也比較常見, tomcat 內(nèi)置的連接池
相關(guān)jar包
c3p0-0.9.2-pre5.jar
mchange-commons-java-0.2.3.jar
參考文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html
下面是通過手動(dòng)來設(shè)置數(shù)據(jù)源:(后面講解如何從配置文件*.properties 文件中來設(shè)置數(shù)據(jù)源)
package com.igeek_02_dbcp;
import java.sql.Connection;
import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;
/**
* @ClassName: DBCPDemo_01
* @Description: DBCP的基本配置
* @date 2018年1月30日 下午2:01:42
* Company www.igeekhome.com
*
*/
public class DBCPDemo_01 {
@Test
public void demo01() throws Exception{
//1 獲得連接池
BasicDataSource dataSource = new BasicDataSource();
//1.1 基本項(xiàng)
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/igeek");
dataSource.setUsername("root");
dataSource.setPassword("root");
//1.2 其他項(xiàng)
// * 初始化連接池中連個(gè)的個(gè)數(shù)
dataSource.setInitialSize(5);
// * 最大活勱數(shù)
dataSource.setMaxActive(10);
//2獲得連接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
配置文件位置:任意僧免,建議 src(classpath/類路徑)
#連接設(shè)置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/webdb
username=root
password=root
#<!-- 初始化連接 -->
initialSize=10
#最大連接數(shù)量
maxActive=50
#<!-- 最大空閑連接 -->
maxIdle=20
#<!-- 最小空閑連接 -->
minIdle=5
#<!-- 超時(shí)等待時(shí)間以毫秒為單位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驅(qū)勱建立連接時(shí)附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;]
#注意:"user" 不 "password" 兩個(gè)屬性會(huì)被明確地傳遞,因此這里丌需要包含他們浊洞。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由連接池所創(chuàng)建的連接的自勱提交(auto-commit)狀態(tài)牵敷。
defaultAutoCommit=true
#driver default 指定由連接池所創(chuàng)建的連接的叧讀(read-only)狀態(tài)。
#如果沒有設(shè)置該值法希,則“ setReadOnly”方法將丌被調(diào)用枷餐。(某些驅(qū)勱幵丌支持叧讀模式,如: Informix)
defaultReadOnly=
#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)苫亦。
#可用值為下列之一:(詳情可見javadoc毛肋。)NONE,READ_UNCOMMITTED, READ_COMMITTED,
REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
案例:
package com.igeek_02_dbcp;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
/**
* @ClassName: DBCPDemo_02
* @Description: 使用配置文件配置dbcp
* @date 2018年1月30日 下午2:11:33
* Company www.igeekhome.com
*
*/
public class DBCPDemo_02 {
@Test
public void demo01() throws Exception{
//1 獲得連接池
//1.1 加載properties文件怨咪,獲得Properties對(duì)象
InputStream is =
DBCPDemo_02.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
Properties props = new Properties();
props.load(is);
//1.2獲得連接池
DataSource dataSource = BasicDataSourceFactory.createDataSource(props);
//2獲得連接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
#基本配置內(nèi)容
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/igeek
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=UTF-8
defaultAutoCommit=true
defaultReadOnly=NONE
defaultTransactionIsolation=READ_UNCOMMITTED
工具類提供兩個(gè)功能,分別是提供連接池對(duì)象润匙,提供連接對(duì)象
案例:
package com.igeek_02_dbcp;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
* @ClassName: DBCPUtils
* @Description: DBCP工具類
* @date 2018年1月30日 下午2:13:55
* Company www.igeekhome.com
*
*/
public class DBCPUtils {
//1 創(chuàng)建連接池
private static DataSource dataSource;
// * 編寫固定代碼
static{
try {
//1) 加載properties文件诗眨,獲得Properties對(duì)象
InputStream is =
DBCPUtils.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
Properties prop = new Properties();
prop.load(is);
//2) 通過工廠,創(chuàng)建連接池
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 獲得數(shù)據(jù)庫(連接池)
* @return
*/
public static DataSource getDataSource(){
return dataSource;
}
/**
* 獲得連接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}
DBUtils 是 java 編程中的數(shù)據(jù)庫操作實(shí)用工具孕讳,小巧簡(jiǎn)單實(shí)用匠楚。 DBUtils 封裝了對(duì) JDBC 的操作,簡(jiǎn)化了 JDBC 操作厂财,可以少寫代碼芋簿。 Dbutils 三個(gè)核心功能介紹
QueryRunner 中提供對(duì) sql 詫句操作的 API.
ResultSetHandler 接口,用于定義 select 操作后蟀苛,怎樣封裝結(jié)果集.
DbUtils 類益咬,它就是一個(gè)工具類,定義了兲閉資源不事務(wù)處理的方法
要引入jar包c(diǎn)ommons-dbutils-1.6.jar
創(chuàng)建表:
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
插入數(shù)據(jù)
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'IBM',5500,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'長城',3200,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'惠普',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'華為',3800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'小米',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'OPPO',3400,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'NOKIA',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'佰草集',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'玉蘭油',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'大寶',5,'c003');
構(gòu)造方法指定數(shù)據(jù)源逮诲,提供數(shù)據(jù)源DataSource
構(gòu)造方法
QueryRunner(DataSource) 創(chuàng)建核心類帜平, 并提供數(shù)據(jù)源, 內(nèi)部自己維護(hù)Connection
普通方法
update(String sql , Object ... params) 執(zhí)行 DML 語句
query(String sql , ResultSetHandler , Object ... params) 執(zhí)行 DQL 語句梅鹦,并將
查詢結(jié)果封裝到對(duì)象中裆甩。
構(gòu)造方法未指定數(shù)據(jù)源,在方法中提供連接
構(gòu)造方法
QueryRunner() 創(chuàng)建核心類齐唆,沒有提供數(shù)據(jù)源嗤栓,在進(jìn)行具體操作時(shí),需要手勱提
供 Connection
普通方法
update(Connection conn , String sql , Object ... params) 使用 提供的
Connection箍邮,完成 DML 語句
query(Connection conn , String sql , ResultSetHandler , Object ... params)
使用提供的 Connection茉帅,執(zhí)行 DQL 詫句,幵將查詢結(jié)果封裝到對(duì)象中锭弊。
ArrayHandler 將結(jié)果集中的第一條記彔封裝到一個(gè) Object[]數(shù)組中堪澎,數(shù)組中的每一個(gè)元素
就是這條記彔中的每一個(gè)字段的值
BeanHandler 將結(jié)果集中第一條記彔封裝到一個(gè)指定的 javaBean 中。
BeanListHandler 將結(jié)果集中每一條記彔封裝到指定的 javaBean 中味滞,將這些 javaBean 在封裝
到 List 集合中
ColumnListHandler 將結(jié)果集中指定的列的字段值樱蛤,封裝到一個(gè) List 集合中
KeyedHandler 將結(jié)果集中每一條記彔封裝到 Map<String,Object>,在將這個(gè) map 集合做
為另一個(gè) Map 的 value,另一個(gè) Map 集合的 key 是指定的字段的值。
MapHandler 將結(jié)果集中第一條記彔封裝到了 Map<String,Object>集合中剑鞍,key 就是字
段名稱昨凡,value 就是字段值
MapListHandler 將結(jié)果集中每一條記彔封裝到了 Map<String,Object>集合中,key 就是字
段名稱蚁署,value 就是字段值便脊,在將這些 Map 封裝到 List 集合中。
ScalarHandler 它是用于單數(shù)據(jù)光戈。例如 select count(*) from 表操作
注意:JavaBean
JavaBean 就是一個(gè)類就轧,在開發(fā)中常用詫封裝數(shù)據(jù)证杭。具有如下特性
1.需要實(shí)現(xiàn)接口:java.io.Serializable ,通常實(shí)現(xiàn)接口這步驟省略了妒御,不會(huì)影響程序解愤。
2. 提供私有字段:private 類型 字段名;
3. 提供 getter/setter 方法:
4. 提供無參構(gòu)造 ?
public class Product {
//字段名要與數(shù)據(jù)庫的字段名一致,不然有可能會(huì)取不到數(shù)據(jù)
private String pid;
private String pname;
private Double price;
private String category_id;
// 省略getter/setter方法
}
基本了解即可乎莉;