JavaWeb_day10_資料庫連線池_c3p0_DBUtils
1.在實際開發中,“獲取連線”和“釋放資源”是很消耗系統資源的兩個過程,為了解決此問題,採用連線池技術,共享連線connection
2.連線池概念
3.Java的資料庫連線池的公共介面:javax.sql.DataSource
常見的連線池:DBCP C3P0
4.C3P0
第一步:匯入連個jar包 c3p0-0.9.1.2.jar mysql-connector-java-5.1.46.jar
第二步:配置檔案
配置檔名稱:c3p0-config.xml(固定)
配置檔案位置:src下
配置檔案內容:
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///web_07</property> <property name="user">root</property> <property name="password">123</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <named-config name="oracle"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///web_07</property> <property name="user">root</property> <property name="password">123</property> </named-config> </c3p0-config>
demo:
package com.c3p0.web10_c3p0; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import org.junit.Test; import com.mchange.v2.c3p0.ComboPooledDataSource; public class Testc3p0 { @Test public void testAddUser(){ Connection conn=null; PreparedStatement pst=null; //建立連線池物件 DataSource datesource=new ComboPooledDataSource();//載入預設配置 //DataSource datesource1=new ComboPooledDataSource("oracle");//載入有名稱的配置 //從池子中獲取連線 try { //從池子中獲取連線 conn = datesource.getConnection(); String sql="INSERT into user VALUES(?,?,NULL)"; //建立預處理物件 pst = conn.prepareStatement(sql); //給佔位符設定引數 pst.setString(1, "張飛"); pst.setString(2, "11100"); //執行 int rows = pst.executeUpdate(); if (rows>0) { System.out.println("新增成功"); } else { System.out.println("新增失敗"); } } catch (Exception e) { e.printStackTrace(); }finally{ } }
5.DBUtils
導包:commons-dbutils-1.4.jar
DBUtils就是JDBC的簡化開發工具包(就是一個工具類,定義了關閉資源和事物處理的方法)
思想:JDBC中有很多程式碼重複的出現冗餘,只有少部分是相同的地方,對於相同的地方使用傳參的方式來解決
DBUtils三個核心功能:
(1)QueryRunner中提供了對sql語句的操作的API
QueryRunner(DataSoruce ds)提供資料來源(連線池)DBUtils底層自動維護連線connection
update(String sql,Object[] params)執行更新資料 //進行增刪改操作
query(String sql,RusultSetHandler<T> rsh,Object[] params) 執行查詢
(2)RusultSetHandler介面,用於定義select操作後,怎樣封裝結果集
DBUtils提供了一個介面ResultSetHandler,它就是用來ResultSet轉換成目標型別的工具。你可以自己去實現這個接 口,把ResultSet轉換成你想要的型別。
DBUtils提供了很多個ResultSetHandler介面的實現,這些實現已經基本夠用了,我們通常不用自己去實現ResultSet介面了。
MapHandler:單行處理器!把結果集轉換成Map<String,Object>,其中列名為鍵!
MapListHandler:多行處理器!把結果集轉換成List<Map<String,Object>>;
BeanHandler:單行處理器!把結果集轉換成Bean,該處理器需要Class引數,即Bean的型別;
BeanListHandler:多行處理器!把結果集轉換成List<Bean>; //bean就是實體類相當於User類
ColumnListHandler:多行單列處理器!把結果集轉換成List<Object>,使用ColumnListHandler時需要指定某一列的名稱或編號,例如:new ColumListHandler(“name”)表示把name列的資料放到List中。
ScalarHandler:單行單列處理器!把結果集轉換成Object。一般用於聚集查詢,例如select count(*) from tab_student。
(3)DBUtils類就是一個工具類,定義了關閉資源和事物處理的方法
第一步:寫JavaBean類(通常都寫在domain包中) :提供私有欄位,set get方法,無參構造
user類
package com.sh.domain;
public class User {
private String uname;
private String upassword;
private int uid;
public User() {}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
@Override
public String toString() {
return "User [uname=" + uname + ", upassword=" + upassword + ", uid=" + uid + "]";
}
}
第二步:寫c3p0Utils類
package com.sh.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource datesource=new ComboPooledDataSource();
public static DataSource getDateSource(){
return datesource;
}
public static Connection getConnection(){
try {
return datesource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
第三步:DBUtils測試類
package com.sh.Test;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.sh.domain.User;
import com.sh.utils.C3P0Utils;
public class TestDBUtils {
/* 新增操作 */
@Test
public void testAddUser() {
// 建立核心類QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 編寫sql語句
String sql = "INSERT into user VALUES(?,?,NULL)";
// 為佔位符設定引數
Object[] params = { "曹操", "101" };
// 執行新增操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("新增成功");
} else {
System.out.println("新增失敗");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 修改操作 */
@Test
public void testUpdateUserById() {
// 建立核心類QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 編寫sql語句
String sql = "UPDATE user SET uname=? WHERE uid=?";
// 為佔位符設定引數
Object[] params = { "呂布1", 8 };
// 執行修改操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失敗");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 刪除操作 */
@Test
public void testDeleteUserById() {
// 建立核心類QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 編寫sql語句
String sql = "DELETE FROM user WHERE uid=?";
// 為佔位符設定引數
Object[] params = { 8 };
// 執行刪除操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("刪除成功");
} else {
System.out.println("刪除失敗");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 查詢所有資訊 */
@Test
public void testQueryUser() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "select * from user";
// 執行查詢操作
List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
// 遍歷集合
for (User user : users) {
System.out.println(user);// 在User類中已重寫toString方法
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/* 根據id查詢資訊 */
@Test
public void testQueryUserById() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "select * from user where uid=?";
// 為佔位符設定引數
Object[] params = { 1 };
// 執行查詢操作
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
System.out.println(user);// 在User類中已重寫toString方法
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/* 查詢所有使用者的總個數 */
@Test
public void testQueryCountAllUser() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "SELECT COUNT(*)FROM user";
// 執行查詢操作
Object query = qr.query(sql,new ScalarHandler());
System.out.println(query);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}