1. DButils工具類的介紹個三個核心類
A: DButils工具類的介紹個三個核心類
a: 概述
DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
DBUtils就是JDBC的簡化開發工具包。需要項目導入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。
b: Dbutils三個核心功能介紹
QueryRunner中提供對sql語句操作的API.
update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
ResultSetHandler接口,用於定義select操作后,怎樣封裝結果集.
DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法
2. QueryRunner類的update方法介紹
a: 方法介紹
update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
使用QueryRunner類,實現對數據表的insert delete update
調用QueryRunner類的方法 update (Connection con,String sql,Object...param)
Object...param 可變參數,Object類型,SQL語句會出現?占位符
數據庫連接對象,自定義的工具類傳遞
b. 代碼實現
1 /** 2 * QueryRunner類 3 * update(Connection conn, String sql, Object... params) 4 * 實現表中數據的增、刪、改 5 * @author vanguard 6 * 7 */ 8 public class QueryRunnerDemo { 9 //獲取數據庫連接 10 private static Connection conn = JDBCUtils.getConnection(); 11 12 public static void main(String[] args) throws SQLException { 13 //insert(); 14 //delete(); 15 //update(); 16 } 17 /** 18 * 使用QueryRunner類中的update方法,實現更新數據 19 * @throws SQLException 20 */ 21 private static void update() throws SQLException { 22 //創建QueryRunner類對象 23 QueryRunner qr = new QueryRunner(); 24 //定義更新的sql語句 25 String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?"; 26 ////將四個?占位符的實際參數寫在數組中 27 Object[] params = {"家居產品", 9000, "漲價了", 2}; 28 ////調用QueryRunner類的方法update執行SQL語句 29 int row = qr.update(conn, sql, params); 30 System.out.println(row); 31 DbUtils.closeQuietly(conn); 32 } 33 /** 34 * 使用QueryRunner類中的update方法,實現添加數據 35 * @throws SQLException 36 */ 37 private static void delete() throws SQLException { 38 //創建QueryRunner類對象 39 QueryRunner qr = new QueryRunner(); 40 String sql = "DELETE FROM sort WHERE sid=?"; 41 //調用QueryRunner類的方法update執行SQL語句 42 int row = qr.update(conn, sql, 7); 43 System.out.println(row); 44 DbUtils.closeQuietly(conn); 45 } 46 47 /** 48 * 使用Q ueryRunner類中的update方法,實現添加數據 49 * @throws SQLException 50 */ 51 private static void insert() throws SQLException { 52 //創建QueryRunner類對象 53 QueryRunner qr = new QueryRunner(); 54 String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)"; 55 //將三個?占位符的實際參數寫在數組中 56 Object[] params = {"體育用品", 200.98, "購買體育用品"}; 57 //調用QueryRunner類的方法update執行SQL語句 58 int row = qr.update(conn, sql, params); 59 System.out.println(row); 60 DbUtils.closeQuietly(conn); 61 } 62 }
3. DBUtils工具類結果集處理的方式
a: QueryRunner實現查詢操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
b: ResultSetHandler結果集處理類
ArrayHandler 將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個字段的值
ArrayListHandler 將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。
BeanHandler 將結果集中第一條記錄封裝到一個指定的javaBean中。
BeanListHandler 將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
ColumnListHandler 將結果集中指定的列的字段值,封裝到一個List集合中
ScalarHandler 它是用於單數據。例如select count(*) from 表操作。
MapHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據
MapListHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合
4. QueryRunner類的方法query
a: QueryRunner類的方法query數據查詢操作
調用QueryRunner類方法query(Connection con,String sql,ResultSetHandler r, Object..params)
ResultSetHandler r 結果集的處理方式,傳遞ResultSetHandler接口實現類
Object..params SQL語句中的?占位符
注意: query方法返回值,返回的是T 泛型, 具體返回值類型,跟隨結果集處理方式變化
b:代碼實現:
1 /** 2 * 使用QueryRunner類中的 3 * query(Connection conn, String sql, ResultSetHandler<T> rsh, 4 * Object... params) 5 * 完成對數據的查詢操作 6 * ResultSetHandler結果集處理類 8中處理結果集的方式 7 * ArrayHandler 將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個字段的值 8 * ArrayListHandler 將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。 9 * BeanHandler 將結果集中第一條記錄封裝到一個指定的javaBean中。 10 * BeanListHandler 將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 11 * ColumnListHandler 將結果集中指定的列的字段值,封裝到一個List集合中 12 * ScalarHandler 它是用於單數據。例如select count(*) from 表操作。 13 * MapHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據 14 * MapListHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 15 * @author vanguard 16 * 17 */ 18 public class QueryRunnerDmoe01 { 19 private static Connection conn = JDBCUtils.getConnection(); 20 21 public static void main(String[] args) throws SQLException { 22 //arrayHandler(); 23 //arrayListHandler(); 24 //beanHandler(); 25 //beanListHandler(); 26 //columnListHandler(); 27 //scalarHandler(); 28 //mapHandler(); 29 mapListHandler(); 30 } 31 32 /** 33 * 結果集處理的第八種方式MapListHandler 34 * 將結果集的每一行結果封裝到Map集合中,Key 列名,Value 該列的數據 35 * 將Map集合放到List集合中 36 * @throws SQLException 37 */ 38 private static void mapListHandler() throws SQLException { 39 //創建QueryRunner類對象 40 QueryRunner qr = new QueryRunner(); 41 //定義查詢的sql語句 42 String sql = "SELECT * FROM sort"; 43 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 44 List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler()); 45 //遍歷List集合 46 for(Map<String, Object> map : list) { 47 for(String row : map.keySet()) { 48 System.out.print(row + ":" + map.get(row) + "\t"); 49 } 50 System.out.println(); 51 } 52 } 53 54 /** 55 * 結果集處理的第七種方式MapHandler 56 * 將結果集的第一行數據封裝到Map集合中 Key 列名 Value 該列數據 57 * @throws SQLException 58 */ 59 private static void mapHandler() throws SQLException { 60 //創建QueryRunner類對象 61 QueryRunner qr = new QueryRunner(); 62 //定義查詢的sql語句 63 String sql = "SELECT * FROM sort"; 64 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 65 Map<String, Object> map = qr.query(conn, sql, new MapHandler()); 66 for(String row : map.keySet()) { 67 System.out.print(row + ":" + map.get(row) + " "); 68 } 69 } 70 71 /** 72 * 結果集處理的第六種方式ScalarHandler 73 * 它用於單數據,對於查詢后只有一個結果 74 * @throws SQLException 75 */ 76 private static void scalarHandler() throws SQLException { 77 //創建QueryRunner類對象 78 QueryRunner qr = new QueryRunner(); 79 //定義查詢的sql語句 80 String sql = "SELECT COUNT(*) FROM sort"; 81 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 82 long count = qr.query(conn, sql, new ScalarHandler<Long>()); 83 System.out.println(count); 84 } 85 86 /** 87 * 結果集處理的第五種方式ColumnListHandler 88 * 將結果集中指定列的字段值封裝到list集合中 89 * @throws SQLException 90 */ 91 private static void columnListHandler() throws SQLException { 92 //創建QueryRunner類對象 93 QueryRunner qr = new QueryRunner(); 94 //定義查詢的sql語句 95 String sql = "SELECT * FROM sort"; 96 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 97 List<String> list = qr.query(conn, sql, new ColumnListHandler<String>("sname")); 98 for(String name : list) { 99 System.out.println(name); 100 } 101 } 102 103 /** 104 * 結果集處理的第四種方式BeanListHandler 105 * 將結果集中每一條數據封裝到JavaBean對象中 106 * 將這些JavaBean對象放到list集合中 107 * @throws SQLException 108 */ 109 private static void beanListHandler() throws SQLException { 110 //創建QueryRunner類對象 111 QueryRunner qr = new QueryRunner(); 112 //定義查詢的sql語句 113 String sql = "SELECT * FROM sort"; 114 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 115 List<Sort> list = qr.query(conn, sql, new BeanListHandler<Sort>(Sort.class)); 116 //遍歷list集合 117 for(Sort s : list) { 118 System.out.println(s); 119 } 120 } 121 122 /** 123 * 結果集處理的第三種方式BeanHandler 124 * 將結果集中的第一條數據封裝到JavaBean對象中 125 * 注意:被封裝成數據到JavaBean對象,Sort類中必須有空參構造 126 * @throws SQLException 127 */ 128 private static void beanHandler() throws SQLException { 129 //創建QueryRunner類對象 130 QueryRunner qr = new QueryRunner(); 131 //定義查詢的sql語句 132 String sql = "SELECT * FROM sort"; 133 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 134 Sort s = qr.query(conn, sql, new BeanHandler<Sort>(Sort.class)); 135 System.out.println(s); 136 } 137 138 /** 139 * 結果集處理的第二種方式ArrayListHandler 140 * 將結果集的每一行封裝到Object[]數組中 141 * 將這些數組放到list集合中 142 * @throws SQLException 143 */ 144 private static void arrayListHandler() throws SQLException { 145 //創建QueryRunner類對象 146 QueryRunner qr = new QueryRunner(); 147 //定義查詢的sql語句 148 String sql = "SELECT * FROM sort"; 149 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 150 List<Object[]> list = qr.query(conn, sql, new ArrayListHandler()); 151 for(Object[] objs : list) { 152 for(Object obj : objs) { 153 System.out.print(obj + "\t\t"); 154 } 155 System.out.println(); 156 } 157 } 158 159 /** 160 * 結果集處理的第一種方式ArrayHandler 161 * 將結果集的第一行封裝到Object[]數組中 162 * @throws SQLException 163 */ 164 private static void arrayHandler() throws SQLException { 165 //創建QueryRunner類對象 166 QueryRunner qr = new QueryRunner(); 167 //定義查詢的sql語句 168 String sql = "SELECT * FROM sort"; 169 //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類 170 Object[] objects = qr.query(conn, sql, new ArrayHandler()); 171 //遍歷數組 172 for(Object obj : objects) { 173 System.out.print(obj + " "); 174 } 175 } 176 }
1 public class Sort { 2 private int sid; 3 private String sname; 4 private int sprice; 5 private String sdesc; 6 7 public Sort() {} 8 9 public Sort(int sid, String sname, int sprice, String sdesc) { 10 super(); 11 this.sid = sid; 12 this.sname = sname; 13 this.sprice = sprice; 14 this.sdesc = sdesc; 15 } 16 17 public int getSid() { 18 return sid; 19 } 20 21 public void setSid(int sid) { 22 this.sid = sid; 23 } 24 25 public String getSname() { 26 return sname; 27 } 28 29 public void setSname(String sname) { 30 this.sname = sname; 31 } 32 33 public int getSprice() { 34 return sprice; 35 } 36 37 public void setSprice(int sprice) { 38 this.sprice = sprice; 39 } 40 41 public String getSdesc() { 42 return sdesc; 43 } 44 45 public void setSdesc(String sdesc) { 46 this.sdesc = sdesc; 47 } 48 49 @Override 50 public String toString() { 51 return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice 52 + ", sdesc=" + sdesc + "]"; 53 } 54 55 56 }
5. 連接池介紹
1): 連接池介紹
a: 連接池介紹
實際上就是存放連接的池子(容器)
在開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程
為了解決此類性能問題,通常情況我們采用連接池技術,來共享連接Connection。
這樣我們就不需要每次都創建連接、釋放連接了,這些操作都交給了連接池
2): 連接池概念規范和DataSource接口
a: 連接池概念規范
用池來管理Connection,這樣可以重復使用Connection。
不用自己來創建Connection,而是通過池來獲取Connection對象
使用完Connection后,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池
連接池技術可以完成Connection對象的再次利用
b: DataSource接口
Java為數據庫連接池提供了公共的接口:javax.sql.DataSource
各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池
常見的連接池:DBCP、C3P0
3): DBCP連接池介紹
a: DBCP連接池介紹
DBCP也是一個開源的連接池,是Apache Common成員之一,在企業開發中也比較常見,tomcat內置的連接池
4): 導入jar包
a: jar包介紹
mysql-connector-java-5.1.37-bin.jar:數據庫驅動
commons-dbutils-1.6.jar:提供QueryRunner類方便進行增刪改查操作
commons-dbcp-1.4.jar:
commons-pool-1.5.6.jar:提供高效的數據庫連接池技術
b: 導入jar包
在項目根路徑下建立文件夾lib
拷貝以上jar包,選定拷貝的jar包/右鍵/Build Path/Add to Build Path
5): BasicDataSource類的使用
a: 案例代碼
1 /** 2 * 連接池 3 * 連接池jar包中定義好了一個類DataSource 4 * 實現該類數據源的規范接口 javax.sql.DataSource 5 * @author vanguard 6 * 7 */ 8 public class DataSourceDemo { 9 public static void main(String[] args) { 10 //創建DataSource類接口的實現類對象 11 BasicDataSource datasource = new BasicDataSource(); 12 //連接數據庫的四個基本信息可以通過setXXX方法設置 13 datasource.setDriverClassName("com.mysql.jdbc.Driver"); 14 datasource.setUrl("jdbc:mysql://localhost:3306/mybase"); 15 datasource.setUsername("root"); 16 datasource.setPassword("root"); 17 18 //調用對象的方法獲取數據庫連接 19 try { 20 Connection conn = datasource.getConnection(); 21 System.out.println(conn); 22 } catch (SQLException e) { 23 e.printStackTrace(); 24 throw new RuntimeException("數據庫連接失敗"); 25 } 26 } 27 }
6): BasicDataSource類的常見配置
a: 常見配置
分類 屬性 描述
必須項
driverClassName 數據庫驅動名稱
url 數據庫的地址
username 用戶名
password 密碼
基本項(擴展)
maxActive 最大連接數量
minIdle 最小空閑連接
maxIdle 最大空閑連接
initialSize 初始化連接
7): 實現數據庫連接池工具類
a: 案例代碼
1 /** 2 * 使用DBCP實現數據庫的連接池 3 * 連接池配置,自定義類, 4 * 最基本四項完整 5 * 對於數據庫連接池其他配置,自定義 6 * @author vanguard 7 * 8 */ 9 public class JDBCPoolUtils { 10 //創建出BasicDataSource類對象 11 private static BasicDataSource datasource = new BasicDataSource(); 12 13 //靜態代碼塊,對BasicDataSource類進行配置 14 static { 15 //數據庫連接信息,必須的 16 datasource.setDriverClassName("com.mysql.jdbc.Driver"); 17 datasource.setUrl("jdbc:mysql://localhost:3306/stdb"); 18 datasource.setUsername("root"); 19 datasource.setPassword("root"); 20 //對象連接池中的連接數量配置,可選 21 datasource.setInitialSize(10);//初始化的連接數 22 datasource.setMaxActive(8);//最大的連接數 23 datasource.setMaxIdle(5);//最大空閑數 24 datasource.setMinIdle(2);//最小空閑數 25 } 26 /** 27 * 返回BasicDataSource類對象 28 * @return 29 */ 30 public static DataSource getDataSource() { 31 return datasource; 32 } 33 }
8): 工具類的測試
a: 案例代碼
1 /** 2 * 測試寫好的工具類 3 * 提供的是一個DataSource接口的數據源 4 * QueryRunner類構造方法,接收DataSource接口的實現類 5 * 后面,調用方法update,query,無需傳遞他們Connection連接對象 6 * @author vanguard 7 * 8 */ 9 public class QueryRunnerDemo { 10 private static QueryRunner qr = new QueryRunner(JDBCPoolUtils.getDataSource()); 11 12 public static void main(String[] args) { 13 //insert(); 14 select(); 15 } 16 /** 17 * 定義查詢數據的方法 18 */ 19 private static void select() { 20 String sql = "SELECT * FROM sort"; 21 try { 22 List<Object[]> list = qr.query(sql, new ArrayListHandler()); 23 for(Object[] objs : list) { 24 for(Object obj : objs) { 25 System.out.print(obj + "\t"); 26 } 27 System.out.println(); 28 } 29 } catch (SQLException e) { 30 31 e.printStackTrace(); 32 throw new RuntimeException("數據庫查詢失敗"); 33 } 34 } 35 36 /** 37 * 定義添加數據的方法 38 */ 39 private static void insert() { 40 String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)"; 41 Object[] params = {"水果", 20.5, "桃子便宜了"}; 42 try { 43 int row = qr.update(sql, params); 44 System.out.println(row); 45 } catch (SQLException e) { 46 47 e.printStackTrace(); 48 throw new RuntimeException("數據添加失敗"); 49 } 50 } 51 }