JDBC的C3P0連接池和DBUtils工具類

一、C3P0連接池

1、導入jar包

mysql-connector-java-5.0.4-bin.jar

c3p0-0.9.1.2.jar

2、創建C3P0配置文件

C3P0配置文件命名必須是c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcdb</property>
	<property name="user">root</property>
	<property name="password">123456</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  
  <named-config name="MyConfig"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcdb</property>
	<property name="user">root</property>
	<property name="password">123456</property>
  </named-config>
  

</c3p0-config>

3、編寫C3P0工具類

package com.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Util {

	//方法一、不需要傳參,會找c3p0配置文件中<default-config>默認配置
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//方法二、需要傳參,會找c3p0配置文件中<named-config>中名稱對應的配置
	//private static ComboPooledDataSource dataSource = new ComboPooledDataSource("MyConfig");
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException();
		}
	}
	
	public static void release(Connection conn, PreparedStatement ps, ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

4、測試類

@Test
public void dbOpt(){
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	try {
		conn = C3P0Util.getConnection();
		String sql = "select * from tbl_user";
		ps = conn.prepareStatement(sql);
		rs = ps.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString(2)+":"+rs.getString(3));
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}finally{
		C3P0Util.release(conn, ps, rs);
	}
}

注意:連接池對數據庫操作完成後必須 con.close() 掉,執行 con.close() 並不會關閉與數據庫的連接,而是將連接還回到連接池中,如果不 close 掉的話,這個連接將會一直被佔用,直到連接池中的連接耗盡爲止。


二、DBUtils工具類

1、導入jar包

commons-dbutils-1.4.jar

2、編寫DBUtils工具類的增刪改方法

package com.utils;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

/**
 * 測試DBUtils工具類的增刪改操作
 */
public class TestDBUtils1 {

	/**
	 * 添加所有用戶方法
	 */
	@Test
	public void testAddUser() {
		try {
			// 1.創建核心類QueryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫SQL語句
			String sql = "insert into tbl_user values(null,?,?)";
			// 3.爲站位符設置值
			Object[] params = { "餘淮", "耿耿" };
			// 4.執行添加操作
			int rows = qr.update(sql, params);
			if (rows > 0) {
				System.out.println("添加成功!");
			} else {
				System.out.println("添加失敗!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 根據id修改用戶方法
	 * 
	 */
	@Test
	public void testUpdateUserById() {
		try {
			// 1.創建核心類QueryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫SQL語句
			String sql = "update tbl_user set upassword=? where id=?";
			// 3.爲站位符設置值
			Object[] params = { "xxx", 2 };
			// 4.執行添加操作
			int rows = qr.update(sql, params);
			if (rows > 0) {
				System.out.println("修改成功!");
			} else {
				System.out.println("修改失敗!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 根據id刪除用戶方法
	 */
	@Test
	public void testDeleteUserById() {
		try {
			// 1.創建核心類QueryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫SQL語句
			String sql = "delete from tbl_user where id=?";
			// 3.爲站位符設置值
			Object[] params = {2};
			// 4.執行添加操作
			int rows = qr.update(sql, params);
			if (rows > 0) {
				System.out.println("刪除成功!");
			} else {
				System.out.println("刪除失敗!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

3、創建javabean類,給查詢操作使用

package com.utils;

public class User {

	private int id;
	private String uName;
	private String uPassword;
	
	public User() {}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	
	
}

4、編寫DBUtils工具類的查詢操作

package com.utils;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

/**
 * 測試DBUtils查詢操作
 */
public class TestDBUtils2 {

	/*
	 * 查詢所有用戶方法
	 * JavaBean獲取
	 */
	@Test
	public void testQueryAll() {
		try {
			// 1.獲取核心類queryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫sql語句
			String sql = "select * from tbl_user";
			// 3.執行查詢操作
			List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
			// 4.對結果集集合進行遍歷
			for (User user : users) {
				System.out.println(user.getuName() + " : " + user.getuPassword());
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/*
	 * 根據id查詢用戶方法
	 * JavaBean獲取
	 */
	@Test
	public void testQueryUserById() {
		try {
			// 1.獲取核心類queryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫sql語句
			String sql = "select * from tbl_user where id=?";
			//3.爲佔位符設置值
			Object[] params = {1};
			// 4.執行查詢操作
			User user = qr.query(sql, new BeanHandler<User>(User.class), params);
			System.out.println(user.getuName() + " : " + user.getuPassword());
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/*
	 * 根據所有用戶的總個數
	 */
	@Test
	public void testQueryCount() {
		try {
			// 1.獲取核心類queryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫sql語句
			String sql = "select count(*) from tbl_user";
			// 4.執行查詢操作
			Long count = (Long) qr.query(sql, new ScalarHandler());
			System.out.println(count);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/*
	 * 查詢所有用戶方法
	 * Map獲取
	 */
	@Test
	public void testQueryAll1() {
		try {
			// 1.獲取核心類queryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫sql語句
			String sql = "select * from tbl_user";
			// 3.執行查詢操作
			List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
			// 4.對結果集集合進行遍歷
			for (Map<String, Object> map : list) {
				System.out.println(map);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/*
	 * 查詢所有用戶的uname字段的信息
	 */
	@Test
	public void testQueryAll2() {
		try {
			// 1.獲取核心類queryRunner
			QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
			// 2.編寫sql語句
			String sql = "select * from tbl_user";
			// 3.執行查詢操作
			List<Object> list = qr.query(sql, new ColumnListHandler("uname"));
			// 4.對結果集集合進行遍歷
			for (Object object : list) {
				System.out.println(object);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

注意:使用DBUtils對數據庫操作完成後不需要手動 close()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章