1. 程式人生 > >JavaWeb_day10_資料庫連線池_c3p0_DBUtils

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