(java)數據庫(四)DBUtils

【DBUtils概述】

        爲了簡化JDBC開發,使用apache  commons  組件一個成員:DBUtils。

        DBUtils 是java編程中的數據庫操作實用工具,小巧簡單實用。

        Dbutils三個核心功能介紹:
                    (1) QueryRunner   中提供對sql語句操作的API

                    (2) ResultSetHandler接口    用於定義select操作後,怎樣封裝結果集

                    (3) DbUtils類   是一個工具類,定義了關閉資源與實務處理的方法

 

【QueryRunner 方法update】

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import usst.javacode.JDBCutils.JDBCutils;

/*
 *  使用QueryRunner類,實現對數據表的  增insert   刪 delete   改 update
 *  1.方法    update(Connection con, String sql, Object...params)
 *               Object...params  Object類型   可變參數,SQL語句出現?佔位符
 *               使用定義的工具類  創建數據庫連接對象  JDBCutils.getConnection()
 */
public class QueryRunnerDemo1 {
	private static Connection con = JDBCutils.getConnection();
	public static void main(String[] args) throws SQLException {
		
		//insert();
		//update();
		delete();
	}
	
	// 1. 使用QueryRunner類  向數據庫中添加數據
	public static void insert() throws SQLException{
		// 創建QueryRunner類對象
		QueryRunner qr = new QueryRunner();
		String sql = "INSERT INTO sort1 (sname,sprice,sdesc) VALUES (?,?,?)";
		// 調用qr對象的方法  update 執行SQL語句
		Object[] params = {"鼠標",99,"雷蛇"};   // 將三個實際佔位符的參數寫在數組中
		int row = qr.update(con, sql, params);
		System.out.println(row);
		DbUtils.closeQuietly(con);
	}
	
	// 2. 使用QueryRunner類   修改數據庫中的數據
	public static void update() throws SQLException{
		// 創建QueryRunner類對象
		QueryRunner qr = new QueryRunner();
		String sql = "UPDATE sort1 SET sname = ?,sprice = ?, sdesc = ? WHERE sid = ?";
		// 定義Object數組,存儲?中的參數
		Object[] params = {"記錄本",49,"精裝",13};
		int row = qr.update(con, sql, params);
		System.out.println(row);
		DbUtils.closeQuietly(con);
	}
	
	// 3. 使用QueryRunner類   刪除數據庫中的數據
	public static void delete() throws SQLException{
		// 創建QueryRunner類對象
		QueryRunner qr = new QueryRunner();
		String sql = "DELETE FROM sort1 WHERE sid = ?";
		int row = qr.update(con, sql, 12);
		System.out.println(row);
		DbUtils.closeQuietly(con);
	}

}

 

【javaBean】 

javaBean就是一個類,在開發中常用封裝數據。具有以下特性:
       (1) 需要實現接口:java.io.Serializable,通常實現接口這個步驟省略,不會影響程序

       (2) 提供私有字段:private  類型   字段名

       (3) 提供getter/setter方法

       (4) 提供無參構造方法

 

【QueryRunner方法query()】

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

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
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.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import usst.javacode.JDBCutils.JDBCutils;
import usst.javacode.JDBCutils.Sort;

/*
 *   QueryRunner類數據查詢操作:
          方法 query(Connection con,String sql,ResultSetHandler r,Object...params)
 *        ResultSetHandler r  結果集的處理方式          傳遞ResultSetHandler接口的實現類
 *        Object...params   SQL語句中?號佔位符的參數
 *   注意:query方法返回的是 T  泛型,具體返回值類型,跟隨結果集處理方式變化                     
 * 
 */
public class QueryRunnerDemo2 {
	private static Connection con = JDBCutils.getConnection();
	public static void main(String[] args) throws SQLException {
		//arrayHandler();
		//arrayListHandler();
		//beanHandler();
		//beanListHandler();
		//columnListHandler();
		//scalarHandler();
		//mapHandler();
		mapListHandler();
	}
	
	// 1. 結果集第一種處理方法   ArrayHandler  將結果集的第一行存儲到對象數組中  Object[]
	public static void arrayHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用query方法執行查詢,(傳遞連接對象,SQL語句,結果集處理方式的實現類)
		// 返回對象數組
		Object[] result = qr.query(con,sql,new ArrayHandler());
		for(Object res:result){
			System.out.print(res+"\t");      // 打印sort1數據表中第一行
			//  1	家電	3000.0	廠家促銷	
		}
	}
	
	// 2. 結果集第二種處理方法   ArrayListHandler  將結果集的每一行,封裝到對象數組中Object[]  對象數組存儲到List集合
	public static void arrayListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用query方法 , 結果集處理的參數上,傳遞實現類ArrayListHandler
		// 返回值  每一行是一個對象數組,存儲到List中
		List<Object[]> result = qr.query(con, sql,new ArrayListHandler());
		// 集合遍歷
		for(Object[] objs:result){
			// 遍歷對象數組
			for(Object obj:objs){
				System.out.print(obj+"\t");  // 打印sort1表中的所有內容
				//  1	家電	3000.0	廠家促銷	......
			}
			System.out.println();
		}
	}
	
	// 3. 結果集第三種處理方法,BeanHandler   將結果集的第一行數據     封裝成javaBean對象
	//    注意: 被封裝成數據  到javaBean對象Sort類,必須有空參數的構造方法  
	public static void beanHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用方法query  傳遞結果集實現類BeanHandler
		// BeanHandler(Class<T> type)
		Sort s = qr.query(con, sql, new BeanHandler<Sort>(Sort.class));
		System.out.println(s);              // 打印sort1數據表中第一行
		//  Sort [sid=1, sname=家電, sprice=3000.0, sdesc=廠家促銷]
	}
	
	// 4. 結果集第四種處理方法BeanListHandler    將數據結果集的每一行,封裝成javaBean對象      多個javaBean對象封裝到List集合中
	public static void beanListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用方法query 傳遞結果集實現類beanListHandler
		// BeanListHandler(Class<T> type)
		List<Sort> result = qr.query(con,sql, new BeanListHandler<Sort>(Sort.class));
		// 遍歷
		for(Sort res:result){
			System.out.println(res);       // 打印sort1表中的所有內容  
			// Sort [sid=1, sname=家電, sprice=3000.0, sdesc=廠家促銷] ......
		}
	}
	
	// 5. 結果集第五種處理方法 ,ColumnListHandler  將結果集中指定列的數據,存儲到List集合   List<Object> 每個類數據類型不同
	public static void columnListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		//  調用方法query, 傳遞結果集實現ColumnListHandler   實現類構造方法中使用字符串的列名
		List<Object> result = qr.query(con, sql, new ColumnListHandler<Object>("sname"));
		System.out.println(result);
		// [家電, 傢俱, 兒童玩具, 生鮮, 服裝, 洗髮水, 新能源汽車, 羽絨服, 新能源汽車, 新能源汽車, 鼠標1, 記錄本]
		
		for(Object res:result){
			System.out.println(res);
			// 家電  傢俱 ......
		}
	}
	
	// 6. 結果集第六種處理方法,ScalarHandler    用於單數據   查詢後只有一個結果     
	public static void scalarHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT COUNT(*) FROM sort1";
		// 調用query方法,傳遞結果集實現類ScalarHandler
		long count = qr.query(con,sql,new ScalarHandler<Long>());
		System.out.println(count);     //  12
	}
	
	// 7. 結果集第七種處理方法,MapHandler,將結果集中的第一行封裝到Map集合中         Map<鍵,值>  鍵:列名     值:這列的數據
	public static void mapHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用query方法,傳遞結果集實現類MapHandler
		//    返回值:Map集合,Map接口實現類,泛型
		Map<String,Object> map = qr.query(con, sql,new MapHandler());
		// 遍歷Map集合
		for(String key:map.keySet()){
			System.out.println(key+"="+map.get(key));
		}
		/*
		 * 打印結果
		  sid=1
          sname=家電
          sprice=3000.0
          sdesc=廠家促銷
		 */
	}
	
	// 8. 結果集第八種處理方法,MapListHandler  獎結果集的每一行存儲到Map集合中,鍵:列名    值:這列的數據
	//       Map集合過多,存儲到List集合中去
	public static void mapListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM sort1";
		// 調用query方法,傳遞結果集實現類MapListHandler
		//    返回值是List集合,裏面存儲的是Map集合
		List<Map<String,Object>> list = qr.query(con,sql,new MapListHandler());
		// 遍歷集合List
		for(Map<String,Object> map:list){
			for(String key:map.keySet()){
				System.out.print(key+"="+map.get(key)+"\t");
			}
			System.out.println();
		}
		/*
		 * sid=1	sname=家電	  sprice=3000.0	  sdesc=廠家促銷	
           sid=2	sname=傢俱	  sprice=8900.0	  sdesc=傢俱價格上調	
           sid=3	sname=兒童玩具	  sprice=300.0	  sdesc=銷量火爆	
           ...         ....       ...              ...
		 */
	}

}

【連接池】

實際開發中“獲得連接”和“釋放鏈接”是非常消耗系統資源的兩個過程,爲了解決此類問題我們採用連接池技術,來共享連接Connection。

import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

/*
 *   使用DBCP實現數據庫的連接池
 *   連接池配置:
 *       最基本四項配置  1. 數據庫驅動名稱:setDriverClassName   2. 數據庫地址:setUrl
 *                 3. 用戶名:setUsername               4. 密碼:setPassword
 *       基本項(擴展) 1. 初始化的連接數量:setInitialSize      2. 最大連接數量:setMaxActive
 *                 3. 最大空閒數:setMaxIdle             4. 最小空閒數:setMinIdle
 */
public class JDBCutils {
	// 創建出BasicDataSource類對象
	private static BasicDataSource dataSource = new BasicDataSource();
	
	// 靜態代碼塊,進行配置
	static{
		// 連接數據庫的4個基本信息,通過對象方法setXXX進行設置  (必須進行配置)
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/mybase1");
		dataSource.setUsername("root");
		dataSource.setPassword("123");
		
		// 對 dataSource連接池對象  的連接數量進行配置    (可選配置,有默認配置)
		dataSource.setInitialSize(10);   // 初始化的連接數量
		dataSource.setMaxActive(8);      // 最大連接數量
		dataSource.setMaxIdle(5);        // 最大空閒數
		dataSource.setMinIdle(1);        // 最小空閒數
	}
	// 定義靜態方法,返回BasicDataSource類對象
	public static DataSource getDataSource(){
		return dataSource;
	}

}
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

/*
 *   測試寫好的工具類:JDBCutils   靜態方法getDataSource()  返回值類型是DataSource
 * 
 */
public class QueryRunnerDemo {
	// 定義2個方法,實現數據表的添加  、數據表的查詢
	//    QueryRunner類對象寫在成員變量位置
	private static QueryRunner qr =new  QueryRunner(JDBCutils.getDataSource());
	public static void main(String[] args) {
		//insert();
		select();
	}
		
	// 數據表添加數據
	public static void insert(){
		String sql = "INSERT INTO sort1 (sname,sprice,sdesc) VALUES(?,?,?)";
		Object[] params = {"核桃",29.9,"新疆乾果"};
		try{
			int row  = qr.update(sql,params);
			System.out.println(row);
		}catch(SQLException ex){
			throw new RuntimeException(ex+"數據庫添加失敗");
		}
	}
	
	// 數據表查詢函數
	public static void select(){
		String sql = "SELECT * FROM sort1";
		try{
			List<Object[]> lists = qr.query(sql, new ArrayListHandler());
			for(Object[] list:lists){
				for(Object l:list){
					System.out.print(l+"\t");
				}
				System.out.println();
			}
		}catch(SQLException ex){
			throw new RuntimeException(ex+"數據庫查詢失敗");
		}
		/* 打印結果
		 * 1	家電	3000.0	廠家促銷	
           2	傢俱	8900.0	傢俱價格上調	
           3	兒童玩具	300.0	銷量火爆	
                 ...          ...
		 */
	}


}

 

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