JDBC:c3p0和DbUtils

c3p0和DbUtils的小案例:

  • 創建SQL語令
    create table User1(
    id int primary key not null auto_increment,
    username varchar(20),
    password varchar(20)
    );

  • eclipse中詳細步驟

  1. 導入jar包 分別有數據庫連接包、c3p0包、c3p0依賴包、DbUtils包
    jar的網盤分享地址爲:https://pan.baidu.com/s/1PRFNCJfUUHDyNlpT-oxjVA
    提取碼:u9rb

  2. 編寫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>
    
  3. 創建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協同工作將使編碼量大爲減少。它包含以下幾個方法:

  1. query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):執行選擇查詢,在查詢中,對象陣列的值被用來作爲查詢的置換參數。

  2. query (String sql, Object[] params, ResultSetHandler rsh):方法本身不提供數據庫連接,執行選擇查詢,在查詢中,對象陣列的值被用來作爲查詢的置換參數。

  3. query(Connection conn, String sql, ResultSetHandler rsh):執行無需參數的選擇查詢。

  4. update(Connection conn, String sql, Object[] params):被用來執行插入、更新或刪除(DML)操作。

  5. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最終取決於 query 方法的 ResultHandler 參數的 hanlde 方法的返回值。

  6. BeanListHandler: 把結果集轉爲一個 Bean 的 List, 並返回.。Bean的類型在創建 BeanListHanlder對象時以 Class對象的方式傳入,可以適應列的別名來映射 JavaBean 的屬性 名: String sql = "SELECT id, name customerName, email, birth " + “FROM customers WHERE id = ?”; BeanListHandler(Class type)。

  7. BeanHandler: 把結果集轉爲一個 Bean,並返回.。Bean的類型在創建BeanHandler 對象時以 Class 對象的方式傳入 BeanHandler(Class type)。

  8. MapHandler: 把結果集轉爲一個 Map 對象, 並返回。若結果集中有多條記錄, 僅返回 第一條記錄對應的Map對象.。Map的鍵: 列名(而非列的別名), 值: 列的值。

  9. MapListHandler: 把結果集轉爲一個 Map 對象的集合, 並返回.。Map的鍵: 列名(而非列的別名), 值: 列的值。

  10. ScalarHandler: 可以返回指定列的一個值或返回一個統計函數的值,比如count(1)。

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