1. 程式人生 > >java學習日記(day30--dbutils)

java學習日記(day30--dbutils)

類對象 類的方法 span spl user .sql rop ice 代碼

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 qr 
= 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); }
View Code

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)