DBUtils就是JDBC的簡化開發工具包。須要項目導入commons-dbutils-1.6.jar纔可以正常使用DBUtils工具。若是隻使用JDBC進行開發,咱們會發現冗餘代碼過多,爲了簡化JDBC開發,本案例咱們講採用apache commons組件一個成員:DBUtils。html
DBUtils是java編程中的數據庫操做實用工具,小巧簡單實用。DBUtils封裝了對JDBC的操做,簡化了JDBC操做,能夠少寫代碼。java
Dbutils三個核心功能介紹:mysql
1.QueryRunner中提供對sql語句操做的API.sql
2.ResultSetHandler接口,用於定義select操做後,怎樣封裝結果集.數據庫
3. DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法apache
1.update(Connection conn, String sql, Object... params) ,用來完成表數據的增長、刪除、更新操做編程
2.query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操做數組
//添加 public void addProduct() throws SQLException{ Connection conn=JDBCUtils.getConn(); QueryRunner qr=new QueryRunner(); String sql="insert into product(pid,pname) values(?,?)"; Object[] obj={"1234567","iphoneXS"}; qr.update(conn, sql,obj); DbUtils.closeQuietly(conn); } //刪除 public void deleteProduct() throws SQLException{ Connection conn=JDBCUtils.getConn(); QueryRunner qr=new QueryRunner(); String sql="delete from product where pname=? "; Object[] obj={"qwdqw"}; qr.update(conn,sql, obj); DbUtils.closeQuietly(conn); } //更新 public void editProduct() throws SQLException{ Connection conn=JDBCUtils.getConn(); QueryRunner qr=new QueryRunner(); String sql="update product set pname=? where pid=?"; Object[] obj={"vivoX10","1234567"}; qr.update(conn, sql,obj); DbUtils.closeQuietly(conn); }
ResultSetHandler結果集處理類oracle
ArrayHandleriphone |
將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每個元素就是這條記錄中的每個字段的值 |
ArrayListHandler |
將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。 |
BeanHandler |
將結果集中第一條記錄封裝到一個指定的javaBean中。javabean就是類 |
BeanListHandler |
將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 |
ColumnListHandler |
將結果集中指定的列的字段值,封裝到一個List集合中 |
ScalarHandler |
它是用於單數據。例如select count(*) from 表操做。 |
MapHandler |
將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據 |
MapListHandler |
將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 |
注:JavaBean就是一個類,在開發中經常使用封裝數據。具備以下特性
代碼實現:
1 //ArrayHandler 2 //將結果集中的第一行數據封裝到Object[]中 3 public void select1() throws SQLException{ 4 Connection conn=JDBCUtils.getConn(); 5 QueryRunner qr=new QueryRunner(); 6 String sql="select * from product"; 7 Object[] obj=qr.query(conn,sql, new ArrayHandler()); 8 for(Object o:obj){ 9 System.out.println(o); 10 } 11 DbUtils.closeQuietly(conn); 12 } 13 //ArrayListHandler 14 //將結果集中的每一行都封裝到Object[]中,而後將每個Object數組封裝到一個List集合中 15 public void select2() throws SQLException{ 16 Connection conn=JDBCUtils.getConn(); 17 QueryRunner qr=new QueryRunner(); 18 String sql="select * from product"; 19 List<Object[]> list=qr.query(conn,sql, new ArrayListHandler()); 20 for(Object[] obj:list){ 21 for(Object o:obj){ 22 System.out.println(o+"\t"); 23 } 24 System.out.println(); 25 } 26 DbUtils.closeQuietly(conn); 27 } 28 //BeanHandler 29 //前提:JavaBean必須有空參構造和set方法 30 //將結果集中的第一條記錄封裝到指定的JavaBean中 31 public void select3() throws SQLException{ 32 QueryRunner qr=new QueryRunner(); 33 Connection conn=JDBCUtils.getConn(); 34 String sql="select * from product"; 35 Product product=qr.query(conn, sql,new BeanHandler<Product>(Product.class)); 36 System.out.println(product); 37 DbUtils.closeQuietly(conn); 38 } 39 //BeanListHandler 40 //將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 41 public void select4() throws SQLException{ 42 QueryRunner qr=new QueryRunner(); 43 Connection conn=JDBCUtils.getConn(); 44 String sql="select * from product"; 45 List<Product> list=qr.query(conn, sql,new BeanListHandler<Product>(Product.class)); 46 for(Product p:list){ 47 System.out.println(p); 48 } 49 DbUtils.closeQuietly(conn); 50 } 51 //ColumnListHandler 52 //將結果集中指定的列的字段值,封裝到一個List集合中 53 public void select5()throws SQLException{ 54 QueryRunner qr=new QueryRunner(); 55 Connection conn=JDBCUtils.getConn(); 56 String sql="select * from product"; 57 List<String> list=qr.query(conn, sql,new ColumnListHandler<String>("pname")); 58 for(String s:list){ 59 System.out.println(s); 60 } 61 DbUtils.closeQuietly(conn); 62 } 63 //ScalarHandler 64 //它是用於單數據。例如select count(*) from 表操做。 65 public void select6()throws SQLException{ 66 QueryRunner qr=new QueryRunner(); 67 Connection conn=JDBCUtils.getConn(); 68 String sql="select count(*) from product"; 69 Long count=qr.query(conn, sql,new ScalarHandler<Long>()); 70 System.out.println(count); 71 DbUtils.closeQuietly(conn); 72 } 73 //MapHandler 74 //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據 75 public void select7()throws SQLException{ 76 QueryRunner qr=new QueryRunner(); 77 Connection conn=JDBCUtils.getConn(); 78 String sql="select count(*) from product"; 79 Map<String,Object> map=qr.query(conn, sql,new MapHandler()); 80 Set<Map.Entry<String,Object>> set=map.entrySet(); 81 for(Map.Entry<String,Object> entry: set){ 82 System.out.println(entry.getKey()+"..."+entry.getValue()); 83 } 84 DbUtils.closeQuietly(conn); 85 } 86 //MapListHandler 87 //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 88 public void select8()throws SQLException{ 89 QueryRunner qr=new QueryRunner(DButils.getDataSource()); 90 //Connection conn=JDBCUtils.getConn(); 91 String sql="select count(*) from product"; 92 List<Map<String,Object>> list=qr.query(sql,new MapListHandler()); 93 for(Map<String,Object> map:list){ 94 Set<Map.Entry<String,Object>> set=map.entrySet(); 95 for(Map.Entry<String,Object> entry: set){ 96 System.out.println(entry.getKey()+"..."+entry.getValue()); 97 } 98 } 99 }
用池來管理Connection,這樣能夠重複使用Connection。有了池,因此咱們就不用本身來建立Connection,而是經過池來獲取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection「歸還」給池。池就能夠再利用這個Connection對象了。
規範:
Java爲數據庫鏈接池提供了公共的接口:javax.sql.DataSource,各個廠商須要讓本身的鏈接池實現這個接口。這樣應用程序能夠方便的切換不一樣廠商的鏈接池!
常見的鏈接池:DBCP、C3P0。
1.使用:導包
2.編寫工具類
1 package com.oracle.tools; 2 3 import java.sql.Connection; 4 import java.sql.SQLException; 5 6 import javax.sql.DataSource; 7 8 import org.apache.commons.dbcp.BasicDataSource; 9 10 11 public class DButils { 12 public static final String DRIVER = "com.mysql.jdbc.Driver"; 13 public static final String URL = "jdbc:mysql://localhost:3306/bank"; 14 public static final String USERNAME = "root"; 15 public static final String PASSWORD = "123456"; 16 /* 17 * 建立鏈接池BasicDataSource 18 */ 19 public static BasicDataSource dataSource = new BasicDataSource(); 20 public static ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); 21 //靜態代碼塊 22 static { 23 //對鏈接池對象 進行基本的配置 24 dataSource.setDriverClassName(DRIVER); // 這是要鏈接的數據庫的驅動 25 dataSource.setUrl(URL); //指定要鏈接的數據庫地址 26 dataSource.setUsername(USERNAME); //指定要鏈接數據的用戶名 27 dataSource.setPassword(PASSWORD); //指定要鏈接數據的密碼 28 } 29 /* 30 * 返回鏈接池對象 31 */ 32 //獲取當前線程上的鏈接 33 public static Connection getCurrentConnection(){ 34 Connection conn=tl.get(); 35 if(conn==null){ 36 conn=getConn(); 37 tl.set(conn); 38 } 39 return conn; 40 } 41 //開啓事務的方法 42 public static void start(){ 43 try { 44 getCurrentConnection().setAutoCommit(false); 45 } catch (SQLException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 } 50 //提交事務的方法 51 public static void commit(){ 52 try { 53 getCurrentConnection().commit(); 54 } catch (SQLException e) { 55 // TODO Auto-generated catch block 56 e.printStackTrace(); 57 } 58 } 59 //回滾事務方法 60 public static void rollback(){ 61 try { 62 getCurrentConnection().rollback(); 63 } catch (SQLException e) { 64 // TODO Auto-generated catch block 65 e.printStackTrace(); 66 } 67 } 68 //從鏈接池裏獲取一個新鏈接 69 public static DataSource getDataSource(){ 70 return dataSource; 71 } 72 public static Connection getConn(){ 73 Connection conn=null; 74 try { 75 conn=dataSource.getConnection(); 76 } catch (SQLException e) { 77 // TODO Auto-generated catch block 78 e.printStackTrace(); 79 } 80 return conn; 81 } 82 }
3.測試:
1 //MapListHandler 2 //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 3 public void select8()throws SQLException{ 4 QueryRunner qr=new QueryRunner(DButils.getDataSource());//有參構造 5 //Connection conn=JDBCUtils.getConn(); 6 String sql="select count(*) from product"; 7 List<Map<String,Object>> list=qr.query(sql,new MapListHandler()); 8 for(Map<String,Object> map:list){ 9 Set<Map.Entry<String,Object>> set=map.entrySet(); 10 for(Map.Entry<String,Object> entry: set){ 11 System.out.println(entry.getKey()+"..."+entry.getValue()); 12 } 13 } 14 }
4.常見配置項(瞭解)
參考文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html
分類 |
屬性 |
描述 |
必須項 |
driverClassName |
數據庫驅動名稱 |
url |
數據庫的地址 |
|
username |
用戶名 |
|
password |
密碼 |
|
基本項(擴展) |
maxActive |
最大鏈接數量 |
minIdle |
最小空閒鏈接 |
|
maxIdle |
最大空閒鏈接 |
|
initialSize |
鏈接池中初始化多少個Connection鏈接對象
|
擴展項 |
maxWait |
超時等待時間以毫秒爲單位 1000等於1秒 |