java核心技術(shù)第四篇之JDBC第二篇

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();

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文包括:1、DBUtils簡介2、DbUtils類3、QueryRunner類4、ResultSetHandle...
    廖少少閱讀 20,991評論 1 24
  • 1.jdbc簡介(本文使用的數(shù)據(jù)庫為MySQL) 1.1)JDBC(Java DataBase Connect...
    無所事事的考拉閱讀 1,594評論 0 1
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,182評論 1 114
  • JDBC簡介 SUN公司為了簡化、統(tǒng)一對數(shù)據(jù)庫的操作,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC。JDBC...
    奮斗的老王閱讀 1,634評論 0 51
  • 六一快樂~講個笑話開心一下 吾日四省吾身:早餐吃啥?午餐吃啥?晚上吃啥?明天吃啥?
    晨曦iuiu閱讀 137評論 0 0

友情鏈接更多精彩內(nèi)容