01.JDBC連接池_連接池的概念:
1).什么是連接池:對于多用戶程序,為每個用戶單獨創(chuàng)建一個Connection,會使程序降低效率。這時我們可以創(chuàng)建一個"容器",
? ? ? ? ? ? ? ? 這個容器中,先緩存一些Connection對象,有用戶請求,就從池中取出一個Connection對象,當(dāng)用戶使用完畢,
再將這個Connection放回到容器中,這個容器就叫:連接池。
2).連接池的作用:先期緩存一些Connection對象,并對這些Connection進行反復(fù)的使用,回收,而不需要為每個用戶單獨創(chuàng)建Connection
? ? ? ? ? ? ? ? 對象,從而可以提高程序的運行效率。
3).很多的第三方廠商提供了連接池的實現(xiàn),Sun公司提出,所有廠商的連接池必須實現(xiàn):javax.sql.DataSource(接口)
1).DBCP連接池:Apache公司的,commons項目組的成員,免費開源的。Tomcat內(nèi)部使用的就是這個連接池。
2).C3P0連接池【重要掌握】:開源免費的。整體性能要好于DBCP連接池。Spring、Hibernate框架內(nèi)部使用這個連接池。
02.JDBC連接池_DBCP連接池的使用:
1).將DBCP的所需jar包復(fù)制到項目目錄下,并且添加構(gòu)建路徑:
commons-dbcp-1.4.jar
commons-pool-1.6.jar
2).復(fù)制DBCP的配置文件(dbcpcongif.properties)到項目的src目錄下;
? (注意:要會修改配置文件中的四個必須的配置項--driverClassName、url、username、password)
/* ?
dbcpcongif.properties(配置文件)
#連接設(shè)置--必須設(shè)置的
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hei66_day21
username=root
password=1233
#可選設(shè)置
#<!-- 初始化連接 -->
initialSize=10
#最大連接數(shù)量
maxActive=50
#<!-- 最大空閑連接 -->
maxIdle=20
#<!-- 最小空閑連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驅(qū)動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這里不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由連接池所創(chuàng)建的連接的自動提交(auto-commit)狀態(tài)。
defaultAutoCommit=true
#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級別(TransactionIsolation)。
#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
*/
/*
3).使用連接池:
1).讀取配置文件信息:
Properties pro = new Properties();
pro.load(當(dāng)前類名.class.getClassLoader().getResourceAsStream("配置文件的名"));//運行時會默認從bin目錄下查找資源文件
2).創(chuàng)建連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
3).從連接池中獲取Connection對象:
Connection conn = dataSource.getConnection();
4).發(fā)送SQL語句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();//不是關(guān)閉,是回收
注意:配置文件中的四項必須配置項中的"鍵名"不要更改,是固定的名字,由DBCP內(nèi)部讀取。
//DBCP連接池的使用
public class Demo {
public static void main(String[] args) throws Exception {
//1.讀取配置文件
Properties pro = new Properties();
pro.load(Demo.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//在src(bin)下找配置文件
//2.創(chuàng)建連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
//3.從連接池中獲取連接對象
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();
}
}
03.JDBC連接池_C3P0連接池的使用:
1).將第三方所需的jar包復(fù)制到項目目錄下:
c3p0-0.9.2-pre5.jar
mchange-commons-java-0.2.3.jar
2).將c3p0-cinfig.xml配置文件復(fù)制到src目錄下:文件名不要改,而且必須在src下,C3P0內(nèi)部會自動去找
? (大家要會修改c3p0-config.xml中的四個必須項的配置:driverClass、jdbcUrl、user、password)
*/
/*
c3p0-cinfig.xml配置文件
<c3p0-config>
<!-- 默認配置,如果沒有指定則使用這個配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day31</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>
<!-- 命名的配置 -->
<named-config name="baidu">
<!-- 連接數(shù)據(jù)庫的4項基本參數(shù) -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day30_db</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 如果池中數(shù)據(jù)連接不夠時一次增長多少個 -->
<property name="acquireIncrement">5</property>
<!-- 初始化連接數(shù) -->
<property name="initialPoolSize">20</property>
<!-- 最小連接數(shù) -->
<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)單個連接所擁有的最大緩存statements數(shù) -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
<!-- 命名的配置 -->
<named-config name="heima">
<!-- 連接數(shù)據(jù)庫的4項基本參數(shù) -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day25_db</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 如果池中數(shù)據(jù)連接不夠時一次增長多少個 -->
<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)單個連接所擁有的最大緩存statements數(shù) -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
*/
/*
3).使用連接池:
1).創(chuàng)建連接池對象:
ComboPooledDataSource dataSource = new ComboPooledDataSource();//尋找配置文件中的默認配置
或者
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//尋找配置文件中的命名配置
2).獲取連接對象:
Connection conn = dataSource.getConnection();
3).發(fā)送SQL語句:
....
conn.close();//不是關(guān)閉,是回收
大家要掌握:
1.jar包位置,添加構(gòu)建路徑;
2.c3p0-config.xml文件的位置,內(nèi)部的必須項的四項的修改:driverClass、jdbcUrl、user、password
3.ComboPooledDataSource的創(chuàng)建的兩種方式;
4.以及后面要講的DBUtils工具類;
//C3P0連接池的使用
public class Demo {
public static void main(String[] args) throws Exception {
//1.創(chuàng)建C3P0的連接池對象
// ComboPooledDataSource dataSource = new ComboPooledDataSource();//尋找配置文件中的默認配置
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//尋找配置文件中的命名配置
//2.獲取連接對象
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();
}
}
------------------------------------------------------------------------------------------------------------
04.DBUtils工具包_什么是DBUtils:
1.DBUtils工具包:它是數(shù)據(jù)庫相關(guān)操作的工具包,內(nèi)部封裝了一些對數(shù)據(jù)庫操作的一些相關(guān)方法,以及自動封裝結(jié)果集的相關(guān)方法。
? ? ? ? ? ? ? ? 使用它可以簡化我們的數(shù)據(jù)庫開發(fā)的代碼。
它是Apache的項目,免費開源的。
05.DBUtils工具包_自己使用JavaBean封裝結(jié)果集:
JavaBean就是一個類,在開發(fā)中常用于封裝數(shù)據(jù)。具有如下特性
1.需要實現(xiàn)接口:java.io.Serializable ,通常偷懶省略了。
2.提供私有字段:private 類型 字段名;
3.提供getter/setter方法:
4.提供無參構(gòu)造
......
//遍歷結(jié)果集
while(rs.next()){//遍歷,封裝的過程比較繁瑣,DBUtils工具包就可以很方便的封裝JavaBean
Products pro = new Products();
pro.setPid(rs.getInt("pid"));
pro.setPname(rs.getString("pname"));
pro.setPrice(rs.getInt("price"));
pro.setFlag(rs.getInt("flag"));
pro.setCategory_id(rs.getInt("category_id"));
//將對象添加到集合中
proList.add(pro);
}
.....
//使用JavaBean封裝結(jié)果集
public class Demo {
public static void main(String[] args) throws Exception {
//1.創(chuàng)建一個C3P0連接池對象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.獲取連接對象
Connection conn = dataSource.getConnection();
//3.執(zhí)行查詢
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
//定義集合
List<Products> proList = new ArrayList<>();
//遍歷結(jié)果集
while(rs.next()){
Products pro = new Products();
pro.setPid(rs.getInt("pid"));
pro.setPname(rs.getString("pname"));
pro.setPrice(rs.getInt("price"));
pro.setFlag(rs.getInt("flag"));
pro.setCategory_id(rs.getInt("category_id"));
//將對象添加到集合中
proList.add(pro);
}
//釋放資源
rs.close();
stmt.close();
conn.close();
//遍歷集合
for(Products p : proList){
System.out.println(p);
}
}
}
06.DBUtils工具包_DBUtils核心類
1).QueryRunner類:主要用于執(zhí)行SQL語句;
2).ResultSetHandler接口 :有很多的子類,每種子類都表示一種封裝結(jié)果集的方式。
3).DBUtils工具類:提供了一些跟事務(wù)處理相關(guān)的方法。
注意:DBUtils工具包,它內(nèi)部不提供數(shù)據(jù)庫的連接。它只負責(zé)發(fā)送SQL語句,執(zhí)行SQL語句,封裝結(jié)果集。
? ? ? 我們可以提供"連接池"對象,給QueryRunner使用。
07.DBUtils工具包_基本使用:
1).復(fù)制jar包到項目目錄下;
commons-dbutils-1.4.jar
2).由于它需要C3P0連接池,所以要將這個連接池配置好。
3).使用QueryRunner執(zhí)行SQL語句:
//1.添加
public void save() throws Exception{
//1.創(chuàng)建一個QueryRunner對象--使用連接池創(chuàng)建
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--添加
String sql = "insert into products values(?,?,?,?,?)";
int row = qr.update(sql, 12,"索尼電視",8000,1,1);
System.out.println("添加影響的行數(shù):" + row);
}
//2.修改
public void update() throws Exception{
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--修改
String sql = "update products set pname = ?,price = ?,flag = ?,category_id = ? where pid = ?";
int row = qr.update(sql,"索尼電視2",8002,0,3,12);
System.out.println("修改影響的行數(shù):" + row);
}
//3.刪除
@Test
public void delete() throws Exception{
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--刪除
String sql = "delete from products where pid = ?";
int row = qr.update(sql,12);
System.out.println("刪除影響的行數(shù):" + row);
}
08.DBUtils工具包_ResultSetHandler標(biāo)記各種結(jié)果集【重點掌握】:
1).Object[] ArrayHandler : 用于查詢一條記錄,如果有多條,將結(jié)果集中的第一條記錄封裝到一個Object[]數(shù)組中,數(shù)組中的每一個元素就是這條記錄中的每一個字段的值
? 如果沒有查詢結(jié)果,返回的是:空數(shù)組(0長度數(shù)組),不是空指針
String sql = "select * from products where category_id = 20";
Object[] objArray = qr.query(sql, new ArrayHandler());
for(Object o : objArray){
System.out.println(o);
}
2).List<Object[]> ArrayListHandler:用于查詢多條記錄。將結(jié)果集中的每一條記錄都封裝到一個Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
String sql = "select * from products";
List<Object[]> objList = qr.query(sql, new ArrayListHandler());
for(Object[] objArray? : objList){//遍歷行
for(Object o : objArray){//遍歷列
System.out.print(o + "\t");
}
System.out.println();
}
3).某個JavaBean BeanHandler:用于查詢一條記錄,將結(jié)果集中第一條記錄封裝到一個指定的javaBean中。
String sql = "select * from products where pid = 1";
Products pro = qr.query(sql, new BeanHandler<Products>(Products.class));
System.out.println(pro);
4).List<某個JavaBean> BeanListHandler:用于查詢多條記錄 將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
String sql = "select * from products";
List<Products> proList = qr.query(sql, new BeanListHandler<Products>(Products.class));
for(Products p : proList){
System.out.println(p);
}
5).List<Object> ColumnListHandler:查詢某個列的數(shù)據(jù),將結(jié)果集中指定的列的字段值,封裝到一個List集合中
String sql = "select pname from products";
List<Object> objList = qr.query(sql, new ColumnListHandler());
for(Object o : objList){
System.out.println(o);
}
6).Map<Object,Map<String,Object>> KeyedHandler:查詢多條記錄。將結(jié)果集中每一條記錄封裝到Map<String,Object>,在將這個map集合做為另一個Map的value,另一個Map集合的key是指定的字段的值。
String sql = "select * from products";
Map<Object, Map<String, Object>> map = qr.query(sql, new KeyedHandler());
Set<Object> keys = map.keySet();
for(Object k : keys){
System.out.println(k);
Map<String,Object> map2 = map.get(k);
Set<String> keys2 = map2.keySet();
for(String k2 : keys2){
System.out.println("\t" + k2 + " -- " + map2.get(k2));
}
}
7).Map<String,Object> MapHandler:用于查詢一條記錄。將結(jié)果集中第一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值
String sql = "select * from products where pid = 1";
Map<String, Object> map = qr.query(sql, new MapHandler());
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
8).List<Map<String,Object> MapListHandler:用于查詢多條記錄。將結(jié)果集中每一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值,在將這些Map封裝到List集合中。
String sql = "select * from products";
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
for(Map<String,Object> map : mapList){
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
System.out.println("--------------------------------");
}
9).Object ScalarHandler:它是用于單個數(shù)據(jù)。例如select count(*) from 表操作。
String sql = "select sum(price) from products";
Object result = qr.query(sql, new ScalarHandler());
System.out.println("結(jié)果:" + result);
//DBUtils的基本使用
public class Demo {
//1.添加
public void save() throws Exception{
//1.創(chuàng)建一個QueryRunner對象--使用連接池創(chuàng)建
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--添加
String sql = "insert into products values(?,?,?,?,?)";
int row = qr.update(sql, 12,"索尼電視",8000,1,1);
System.out.println("添加影響的行數(shù):" + row);
}
//2.修改
public void update() throws Exception{
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--修改
String sql = "update products set pname = ?,price = ?,flag = ?,category_id = ? where pid = ?";
int row = qr.update(sql,"索尼電視2",8002,0,3,12);
System.out.println("修改影響的行數(shù):" + row);
}
//3.刪除
public void delete() throws Exception{
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--刪除
String sql = "delete from products where pid = ?";
int row = qr.update(sql,12);
System.out.println("刪除影響的行數(shù):" + row);
}
//4.查詢
@Test
public void select() throws Exception{
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--查詢
//1).ArrayHandler:將結(jié)果集中的第一條記錄封裝到一個Object[]數(shù)組中,數(shù)組中的每一個元素就是這條記錄中的每一個字段的值
/*String sql = "select * from products where category_id = 20";
Object[] objArray = qr.query(sql, new ArrayHandler());
for(Object o : objArray){
System.out.println(o);
}*/
//2).List<Object[]> ArrayListHandler:用于查詢多條記錄。將結(jié)果集中的每一條記錄都封裝到一個Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
/*String sql = "select * from products";
List<Object[]> objList = qr.query(sql, new ArrayListHandler());
for(Object[] objArray? : objList){//遍歷行
for(Object o : objArray){//遍歷列
System.out.print(o + "\t");
}
System.out.println();
}
*/
//3).BeanHandler:將結(jié)果集中第一條記錄封裝到一個指定的javaBean中。
/*String sql = "select * from products where pid = 1";
Products pro = qr.query(sql, new BeanHandler<Products>(Products.class));
System.out.println(pro);*/
//4).BeanListHandler:將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
/*String sql = "select * from products";
List<Products> proList = qr.query(sql, new BeanListHandler<Products>(Products.class));
for(Products p : proList){
System.out.println(p);
}*/
//5).ColumnListHandler:查詢某個列的數(shù)據(jù),將結(jié)果集中指定的列的字段值,封裝到一個List集合中
/*String sql = "select pname from products";
List<Object> objList = qr.query(sql, new ColumnListHandler());
for(Object o : objList){
System.out.println(o);
}
*/
//6).KeyedHandler:將結(jié)果集中每一條記錄封裝到Map<String,Object>,在將這個map集合做為另一個Map的value,另一個Map集合的key是指定的字段的值。
/*String sql = "select * from products";
Map<Object, Map<String, Object>> map = qr.query(sql, new KeyedHandler());
Set<Object> keys = map.keySet();
for(Object k : keys){
System.out.println(k);
Map<String,Object> map2 = map.get(k);
Set<String> keys2 = map2.keySet();
for(String k2 : keys2){
System.out.println("\t" + k2 + " -- " + map2.get(k2));
}
}*/
//7).MapHandler 將結(jié)果集中第一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值
/*String sql = "select * from products where pid = 1";
Map<String, Object> map = qr.query(sql, new MapHandler());
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}*/
//8).MapListHandler 將結(jié)果集中每一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值,在將這些Map封裝到List集合中。
/*String sql = "select * from products";
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
for(Map<String,Object> map : mapList){
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
System.out.println("--------------------------------");
}
*/
//9).ScalarHandler 它是用于單個數(shù)據(jù)。例如select count(*) from 表操作。
String sql = "select sum(price) from products";
Object result = qr.query(sql, new ScalarHandler());
System.out.println("結(jié)果:" + result);
}
}
09.DBUtils工具包_QueryRunner的CRUD方法:
見demo05
//自定義工具類實現(xiàn)CRUD;
public class JDBCUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
public static DataSource getDataSource(){
return dataSource;
}
}
//自定義工具類實現(xiàn)CRUD (每個都有兩種方法)
public class Demo4 {
//1.添加
@Test
public void save() throws Exception {
//1.創(chuàng)建一個 QueryRunner對象--使用連接池創(chuàng)建
//核心類
//QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--添加
//String sql = "insert into car values(?,?,?,?,?)";
String sql = "insert into car (id,cname) values (?,?)";
//3.參數(shù)
Object[] params = {14,"捷達"};
//int update = qr.update(sql,11,"朗逸","大眾","德國",14);
int update = qr.update(sql,params);
System.out.println("添加影響的行數(shù):" + update);
}
//2.修改
@Test
public void update() throws Exception {
//1.創(chuàng)建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執(zhí)行SQL語句--修改
String sql = "update car set cname = ?,company = ?,grade = ?,price = ? where id = ?";
//3.參數(shù)
Object[] params = {"索納塔","大眾","德國",10,14};
int update = qr.update(sql, params);
//int update = qr.update(sql,"寶來","大眾","德國",13,11);
System.out.println("修改影響的行數(shù):" + update);
}
//3.刪除
@Test
public void delete() throws Exception {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//2.sql
String sql = "delete from car where id = ?";
//3.參數(shù)
Object[] parms = {10};
int update = qr.update(sql,parms);
//int update = qr.update(sql,14);
System.out.println("刪除影響的行數(shù):" + update);
}
//4.通過ID查詢
@Test
public void findById() throws Exception {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car where id = ?";
//3.參數(shù)
Object[] parms = {8};
Products update = qr.query(sql, new BeanHandler<Products>(Products.class),parms);
//Products query = qr.query(sql, new BeanHandler<Products>(Products.class),9);
System.out.println(update);
}
//5.查詢所有
@Test
public void findAll() throws Exception {
/*QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car";
List<Products> query = qr.query(sql, new BeanListHandler<Products>(Products.class));
for (Products products : query) {
System.out.println(products);
}*/
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car";
Object[] parms = {};
List<Products> query = qr.query(sql, new BeanListHandler<Products>(Products.class),parms);
for (Products products : query) {
System.out.println(products);
}
}
//6.查詢總記錄
@Test
public void count() throws Exception {
/*QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select avg(price) from car";
Object query = qr.query(sql, new ScalarHandler());
System.out.println(query);*/
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
String sql = "select count(*) from car";
Object[] parms = {};
Object query = qr.query(sql, new ScalarHandler(),parms);
System.out.println(query);
}
}
10.通過ResultSet獲取列頭信息:
ResultSet rs = stmt.executeQuery("select * from products");
ResultSetMetaData metaData = rs.getMetaData();//獲取列的信息對象
int count = metaData.getColumnCount();//獲取列的數(shù)量
System.out.println("列數(shù):" + count);
for(int i = 1 ; i <= count ; i++){
System.out.println("列名:" + metaData.getColumnName(i));//獲取指定索引的列名。索引值從1開始
}
//通過ResultSet獲取列頭信息
public class Demo {
public static void main(String[] args) throws Exception {
Connection conn = JDBCUtils.getDataSource().getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
System.out.println("列數(shù):" + count);
for(int i = 1 ; i <= count ; i++){
System.out.println("列名:" + metaData.getColumnName(i));
}
}
}
=============================================================================================================
學(xué)習(xí)目標(biāo)總結(jié):
目標(biāo):能夠理解連接池的原理
1.連接池就是一個存儲了一些Connection對象的容器。可以先期緩存一些Connection對象,當(dāng)用戶使用時取出,當(dāng)用戶使用完畢時回收。
? 可以對這些Connection對象進行反復(fù)的重用,達到提高程序運行效率的目的。
目標(biāo):能夠使用DBCP連接池
1.復(fù)制2個jar包;
2.復(fù)制配置文件到src目錄下。
3.創(chuàng)建連接池:
1).讀取配置文件:
Properties pro = new Properties();
pro.load(當(dāng)前類名.class.getClassLoader().getResourceAsStream("配置文件名"));
2).通過工廠類獲取連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
3).獲取Connection對象
Connection conn = dataSource.getConncetion();
...
conn.close();//不是關(guān)閉,是回收
目標(biāo):能夠使用C3P0連接池
1.復(fù)制2個jar包;
2.復(fù)制配置文件c3p0-config.xml到src目錄下;
3.創(chuàng)建連接池對象:
1).創(chuàng)建連接池對象
ComboPooledDataSource dataSource = new ComboPooledDataSource();//讀取默認配置
//或者
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//讀取命名配置
2).獲取連接:
Connection conn = dataSource.getConnection();
...
conn.close();//不是關(guān)閉,是回收
目標(biāo):能夠理解DBUtils工具類
1.對JDBC進行了封裝,用于執(zhí)行增刪改查等SQL語句(主要用于查詢--可以自動封裝結(jié)果集)
目標(biāo):能夠應(yīng)用QueryRunner類
1.創(chuàng)建對象:
QueryRunner qr = new QueryRunner(連接池對象);
2.發(fā)送SQL語句:
1).public int update(String sql,Object ... params):用于執(zhí)行添加、修改、刪除語句的。
2).public T query(String sql,ResultSetHandler<T> rsh,Object ... params):用于執(zhí)行查詢語句的。
目標(biāo):能夠應(yīng)用ResultSetHandler接口
1.Object[] ArrayHandler:用于查詢一條記錄;封裝第一條記錄
2.List<Object[]> ArrayListHandler:用于查詢多條記錄的。
3.某個Bean類型 BeanHandler : 查詢一條,并自動封裝JavaBean。
4.List<Bean類型> BeanListHandler:查詢多條。
5.List<Object> ColumnListHandler : 查詢某列的數(shù)據(jù)。
6.Map<Object , Map<String,Object>> KeyedHandler : 查詢多條記錄。
7.Map<String,Object> MapHandler : 查詢一條記錄;
8.List<Map<String,Object>> MapListHandler :查詢多條記錄
9.Object ScalarHandler : 查詢聚合結(jié)果。單個數(shù)據(jù)
//DBCPUtiles工具類:
public class Utils_DBCP {
private static DataSource ds;
static{
Properties p = new Properties();
try{
p.load(Utils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
try{
return ds.getConnection();
}catch(SQLException e){
throw new RuntimeException("創(chuàng)建連接連接失??!");
}
}
}
dbcpconfig.properties文件內(nèi)容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
password=root
username=root
上面的配置文件中的內(nèi)容編寫的依據(jù)是什么?源代碼!?。?!
測試代碼:
package DBCPUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
public class Test001 {
@Test
public void demo01(){
//添加:向分類表中添加數(shù)據(jù)
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
//1 獲得連接
conn = Utils_DBCP.getConnection();
//2 處理sql語句
String sql = "insert into category(cid,cname) values(?,?)";
//3獲得預(yù)處理對象
psmt = conn.prepareStatement(sql);
//4設(shè)置實際參數(shù)
psmt.setString(1,"c009");
psmt.setString(2,"預(yù)處理12");
//5執(zhí)行
int r = psmt.executeUpdate();
System.out.println(r);
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
//6釋放資源
//JdbcUtils.closeResource(conn, psmt, rs);
}
}
}
//示例代碼
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu";
Object[] params = {};
Connection conn = JDBCUtils.getConnection();
Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
//結(jié)果集的處理
System.out.println( Arrays.toString(objArray) );
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
示例代碼:
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
//結(jié)果集的處理
for (Object[] objArray : list) {
System.out.println(? Arrays.toString(objArray) );
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
ColumnListHandler什么意思?怎么使用?必須保留一份操作代碼!
示例代碼:
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT name FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params);
//結(jié)果集的處理
for (String str : list) {
System.out.println(str);
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}