c3p0和DbUtils的小案例:
-
創建SQL語令
create table User1(
id int primary key not null auto_increment,
username varchar(20),
password varchar(20)
); -
eclipse中詳細步驟
-
導入jar包 分別有數據庫連接包、c3p0包、c3p0依賴包、DbUtils包
jar的網盤分享地址爲:https://pan.baidu.com/s/1PRFNCJfUUHDyNlpT-oxjVA
提取碼:u9rb -
編寫c3p0-config.xml文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-config name="pool"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///chu1</property> <property name="user">root</property> <property name="password">szxy</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config>
-
創建utils包、service包、bean包、test包
- utils包中創建名爲JdbcUtils類,在類中創建靜態獲取數據池中的資源,創建連接方法、關閉資源
public class JdbcUtils{ public static Datasource ds= null; static { ds= new ComboPooledDataSource("pool"); } public static DataSource getDataSource(){ return ds; } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void close(Connection conn ,Statement stmt,ResultSet set){ close(); } }
domain實體類
package com.h3.domain; public class User { private int id; private String username; private String password; public User() { } public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
service類
public class JdbcService { //DButils的QueryRunner去池中找數據 private QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); public int addUser(String username, String password) throws SQLException { String sql = "insert into user values (null,?,?)"; int row = qr.update(sql, username, password); return row; } public int deleteUser(int id) throws SQLException { String sql = "delete from user where id = ?"; int row = qr.update(sql, id); return row; } public int updateUser(int id, String password) throws SQLException { String sql="update user set password =? where id =?"; int row = qr.update(sql,password,id); return row; } //查看所有的信息 // BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List裏。 public void selectAll() throws SQLException { String sql = "select * from user"; // qr.ResultSetHandler<T> 這是接口 BeanListHander 是實現類 // BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List裏。 // 把結果集轉爲一個 Bean 的 List, 並返回.。Bean的類型在創建 // BeanListHanlder對象時以 Class對象的方式傳入,可以適應列的別名來映射 JavaBean 的屬性名 // query(String sql, Object[] params, ResultSetHandler rsh): // 方法本身不提供數據庫連接,執行選擇查詢,在查詢中,對象陣列的值被用來作爲查詢的置換參數。 List<User> user = qr.query(sql, new BeanListHandler<User>(User.class)); for (User u : user) { System.out.println(u.getId() + "--" + u.getUsername() + "--" + u.getPassword()); } } //把結果集轉爲一個 Bean,並返回 //Bean的類型在創建BeanHandler 對象時以 Class 對象的方式傳入 BeanHandler(Class<T> type)。 //BeanHandler:將結果集中的第一行數據封裝到一個對應的JavaBean實例中。 public User selectOneUser(int id) throws SQLException { String sql = "select * from user where id = ?"; User u = qr.query(sql, new BeanHandler<User>(User.class), id); return u; } // ScalarHandler:將結果集中某一條記錄的其中某一列的數據存成Object。 // 可以返回指定列的一個值或返回一個統計函數的值,比如count(1) public void select(String xing) throws SQLException { String sql = "select count(*) from user where username like ? "; long count = qr.query(sql, new ScalarHandler<>(), xing + "%"); System.out.println(count); } }
測試類
public class JdbcTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); JdbcService service = new JdbcService(); try { for (; ; ) { System.out.println("請輸入 1.添加 2.刪除 3.修改 4.查所有 5.查單人 6.查姓X的人 7.退出"); switch (sc.next()) { case "1": System.out.println("請輸入用戶名"); String username = sc.next(); System.out.println("請輸入密碼"); String password = sc.next(); int addRow = service.addUser(username, password); if (addRow > 0) { System.out.println("添加成功"); } else { System.out.println("添加失敗"); } break; case "2": System.out.println("請輸入id"); int delId = sc.nextInt(); int delRow = service.deleteUser(delId); if (delRow > 0) { System.out.println("刪除成功"); } else { System.out.println("刪除失敗"); } break; case "3": System.out.println("請輸入id"); int updateId = sc.nextInt(); System.out.println("請輸入新密碼"); String newPwd = sc.next(); int updateRow = service.updateUser(updateId, newPwd); if (updateRow > 0) { System.out.println("修改成功"); } else { System.out.println("修改失敗"); } break; case "4": service.selectAll(); break; case "5": System.out.println("請輸入id"); int selectId = sc.nextInt(); User u = service.selectOneUser(selectId); if (u == null) { System.out.println("查無此人"); } else { System.out.println(u.getId() + "--" + u.getUsername() + "--" + u.getPassword()); } break; case "6": System.out.println("請輸入姓"); String xing = sc.next(); service.select(xing); break; case "7": System.out.println("再見"); return; } } } catch (Exception e) { e.printStackTrace(); } }
#相關的知識點:
爲了簡化Jdbc技術的操作-----DBUtils
Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫
作用:DBUtils主要負責轉載驅動、關閉連接的工作
dbutil的作用 不用自己關閉資源
DBUtils就是爲了簡化JDBC的快發而產生的開發工具包.對JDBC的一種封裝
用池來管理Connection,這樣可以重複使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。
在開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程,所以通常用連接池結束,來共享連接Connection.這樣就不用每次都創建連接,釋放鏈接了,這些操作都交給連接池.
QreryRunner類(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心類之一,它顯著的簡化了SQL查詢,並與ResultSetHandler協同工作將使編碼量大爲減少。它包含以下幾個方法:
-
query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):執行選擇查詢,在查詢中,對象陣列的值被用來作爲查詢的置換參數。
-
query (String sql, Object[] params, ResultSetHandler rsh):方法本身不提供數據庫連接,執行選擇查詢,在查詢中,對象陣列的值被用來作爲查詢的置換參數。
-
query(Connection conn, String sql, ResultSetHandler rsh):執行無需參數的選擇查詢。
-
update(Connection conn, String sql, Object[] params):被用來執行插入、更新或刪除(DML)操作。
-
ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最終取決於 query 方法的 ResultHandler 參數的 hanlde 方法的返回值。
-
BeanListHandler: 把結果集轉爲一個 Bean 的 List, 並返回.。Bean的類型在創建 BeanListHanlder對象時以 Class對象的方式傳入,可以適應列的別名來映射 JavaBean 的屬性 名: String sql = "SELECT id, name customerName, email, birth " + “FROM customers WHERE id = ?”; BeanListHandler(Class type)。
-
BeanHandler: 把結果集轉爲一個 Bean,並返回.。Bean的類型在創建BeanHandler 對象時以 Class 對象的方式傳入 BeanHandler(Class type)。
-
MapHandler: 把結果集轉爲一個 Map 對象, 並返回。若結果集中有多條記錄, 僅返回 第一條記錄對應的Map對象.。Map的鍵: 列名(而非列的別名), 值: 列的值。
-
MapListHandler: 把結果集轉爲一個 Map 對象的集合, 並返回.。Map的鍵: 列名(而非列的別名), 值: 列的值。
-
ScalarHandler: 可以返回指定列的一個值或返回一個統計函數的值,比如count(1)。