java學習日記(day30--dbutils)
01DButils工具類的介紹個三個核心類
* A: DButils工具類的介紹個三個核心類
* a: 概述
* 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類,它就是一個工具類,定義了關閉資源與事務處理的方法
03QueryRunner類的update方法
* update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
* Object...param 可變參數,Object類型,SQL語句會出現?占位符
04QueryRunner類實現insert添加數據
05QueryRunner類實現update刪除數據
06QueryRunner類實現delete刪除數據
public static void update() throws SQLException{ Connection con = JDBCUtilConfig.getConnection(); QueryRunner qrView Code= new QueryRunner(); String sql = "update sort set sprice=? where sid=?"; Object[] params = {100,4}; qr.update(con, sql, params); DbUtils.closeQuietly(con); } public static void delete() throws SQLException{ Connection con = JDBCUtilConfig.getConnection(); QueryRunner qr= new QueryRunner(); String sql = "delete from sort where sid =?"; Object[] params = {4}; qr.update(con, sql, params); DbUtils.closeQuietly(con); } public static void insert() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "insert into sort(sid, sname,sprice, sdesc) values(?,?,?,?)"; //將三個?占位符的實際參數,寫在數組中 Object[] param = {4, "風扇", 50, "超強風力"}; qr.update(conn, sql, param); DbUtils.closeQuietly(conn); }
07JavaBean類
* A: JavaBean類,將數據庫中的數據用類對象表示,具有以下特性
1. 需要實現接口:java.io.Serializable ,通常實現接口這步驟省略了,不會影響程序。
2. 提供私有字段:private 類型 字段名;
3. 提供getter/setter方法:
4. 提供無參構造
08DBUtils工具類結果集處理的方式
* A: 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集合
09QueryRunner類的方法query
* A: QueryRunner類的方法query
* 調用QueryRunner類方法query(Connection con,String sql,ResultSetHandler r, Object..params)
* ResultSetHandler r 結果集的處理方式,傳遞ResultSetHandler接口實現類
* Object..params SQL語句中的?占位符
* 註意: query方法返回值,返回的是T 泛型, 具體返回值類型,跟隨結果集處理方式變化
10結果集處理ArrayHandler
11結果集處理ArrayListHandler
12結果集處理BeanHandler
13結果集處理BeanListHandler
14結果集處理ColumnListHandler
15結果集處理ScalarHandler
16結果集處理MapHandler
17結果集處理MapListHandler
public static void arraySelect() throws SQLException{ //建立連接 Connection conn = JDBCUtilConfig.getConnection(); //創建QueryRunner類對象 QueryRunner qr =new QueryRunner(); String sql = "SELECT * FROM sort"; Object[] objArr = qr.query(conn, sql, new ArrayHandler()); for(Object o : objArr){ System.out.println(o); } } public static void arrayListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; // 一定是List接口,不能為ArrayList List<Object[]> list = qr.query(conn, sql, new ArrayListHandler()); for(Object[] obj : list){ System.out.println(Arrays.toString(obj)); } } public static void beanSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; SqlObject bean = qr.query(conn, sql,new BeanHandler<SqlObject>(SqlObject.class)); System.out.println(bean); } public static void beanListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<SqlObject> beanList = qr.query(conn, sql,new BeanListHandler<SqlObject>(SqlObject.class)); for(SqlObject bean : beanList){ System.out.println(bean); } } public static void mapSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; Map<String, Object> map = qr.query(conn, sql, new MapHandler()); map.forEach((key, value)->{ System.out.println(key + "\t" + value); }); } public static void mapListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Map<String, Object>> mapList = qr.query(conn, sql, new MapListHandler()); mapList.forEach(m->{ m.forEach((key,value)->{ System.out.println(key + "\t" + value); }); }); } public static void colSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Object> list = qr.query(conn, sql, new ColumnListHandler<Object>("sname")); System.out.println(list); } public static void scalarSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT COUNT(*) FROM sort"; Long l = qr.query(conn, sql, new ScalarHandler<Long>()); System.out.println(l); }View Code
###18連接池介紹
* A: 連接池介紹
* a: 連接池介紹
* 實際上就是存放連接的池子(容器)
* 在開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程
* 為了解決此類性能問題,通常情況我們采用連接池技術,來共享連接Connection。
* 這樣我們就不需要每次都創建連接、釋放連接了,這些操作都交給了連接池
###19連接池概念規範和DataSource接口
* A: 連接池概念規範和DataSource接口
* a: 連接池概念規範
* 用池來管理Connection,這樣可以重復使用Connection。
* 不用自己來創建Connection,而是通過池來獲取Connection對象
* 使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池
* 連接池技術可以完成Connection對象的再次利用
* b: DataSource接口
* Java為數據庫連接池提供了公共的接口:javax.sql.DataSource
* 各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池
* 常見的連接池:DBCP、C3P0
###20DBCP連接池介紹
* A: DBCP連接池介紹
* a: DBCP連接池介紹
* DBCP也是一個開源的連接池,是Apache Common成員之一,在企業開發中也比較常見,tomcat內置的連接池
###21導入jar包
* A: 導入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
22BasicDataSource類的使用
/* * 連接池jar包中,定義好一個類 BasicDataSource 實現類數據源的規範接口 javax.sql.DataSource */ public class DataSoruceDemo { public static void main(String[] args) { // 創建DataSource接口的實現類對象 // 實現類, org.apache.commons.dbcp BasicDataSource dataSource = new BasicDataSource(); // 連接數據庫的4個最基本信息,通過對象方法setXXX設置進來 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybase"); dataSource.setUsername("root"); dataSource.setPassword("123"); try { // 調用對象方法getConnection獲取數據庫的連接 Connection con = dataSource.getConnection(); System.out.println(con); } catch (SQLException ex) { // System.out.println(ex); ex.printStackTrace(); throw new RuntimeException("數據庫連接失敗"); } } }View Code
###23BasicDataSource類的常見配置
* A: BasicDataSource類的常見配置
必須項
driverClassName 數據庫驅動名稱
url 數據庫的地址
username 用戶名
password 密碼
基本項(擴展)
maxActive 最大連接數量
minIdle 最小空閑連接
maxIdle 最大空閑連接
initialSize 初始化連接
24實現數據庫連接池工具類
public class MySqlUtils { private static String driverClass; private static String url; private static String user; private static String password; private static String initialSize; private static String maxActive; private static String maxIdle; private static String minIdle; private static BasicDataSource bs = new BasicDataSource(); static{ InputStream inStream = MySqlUtils.class.getClassLoader(). getResourceAsStream("database.properties"); Properties pro = new Properties(); try { pro.load(inStream); driverClass = pro.getProperty("driverClass"); url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); initialSize = pro.getProperty("initialSize"); maxActive = pro.getProperty("maxActive"); maxIdle = pro.getProperty("maxIdle"); minIdle = pro.getProperty("minIdle"); bs.setDriverClassName(driverClass); bs.setUrl(url); bs.setUsername(user); bs.setPassword(password); if(initialSize != null){ bs.setInitialSize(Integer.parseInt(initialSize)); } if(maxActive != null){ bs.setMaxActive(Integer.parseInt(maxActive)); } if(maxIdle != null){ bs.setMaxIdle(Integer.parseInt(maxIdle)); } if(minIdle != null){ bs.setMinIdle(Integer.parseInt(minIdle)); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(); } } public static BasicDataSource getBasicDataSource(){ return bs; }View Code
25工具類的測試
/* * 測試寫好的工具類, * 提供的是一個DataSource接口的數據源 * QueryRunner類構造方法,接收DataSource接口的實現類 * 後面,調用方法update,query,無需傳遞他們Connection連接對象 */ import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; import cn.itcast.jdbcutils.JDBCUtils; public class QueryRunnerDemo { public static void main(String[] args) { select(); } // 定義2個方法,實現數據表的添加,數據表查詢 // QueryRunner類對象,寫在類成員位置 private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); // 數據表查詢 public static void select() { String sql = "SELECT * FROM sort"; try { List<Object[]> list = qr.query(sql, new ArrayListHandler()); for (Object[] objs : list) { for (Object obj : objs) { System.out.print(obj + "\t"); } System.out.println(); } } catch (SQLException ex) { throw new RuntimeException("數據查詢失敗"); } } // 數據表添加數據 public static void insert() { String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)"; Object[] params = { "水果", 100.12, "剛剛上市的核桃" }; try { int row = qr.update(sql, params); System.out.println(row); } catch (SQLException ex) { throw new RuntimeException("數據添加失敗"); } }View Code
java學習日記(day30--dbutils)