JDBC工具類的使用以及數據庫連接池詳解

JDBC工具類

commons-dbutils-1.6.jar  
可以操作JDBC連接數據庫並且執行sql語句,處理返回的結果集

三個核心類:
    1.DbUtils 關閉資源方法(安靜的關閉即不用異常處理)
    2.QueryRunner 執行sql語句並且返回你想要的結果集
    3.ResultSetHandler接口 參數(使用實現類 想要什麼結果集 就傳入什麼該接口的實現類)

QueryRunner

工具類

public class JDBCUtil {

    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;

    // 使用靜態代碼塊加載驅動 讀取配置文件
    static {
        // 使用系統類來讀取配置文件
        ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
        // 獲取文件中的數據
        driverClass = rb.getString("driverClass");
        url = rb.getString("url");
        user = rb.getString("user");
        password = rb.getString("password");
        // 讓驅動類只加載一次
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    // 獲取數據庫連接的方法
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("連接失敗");
        }
        return connection;
    }
    // 關閉數據庫的方法 如果沒有結果集需要關閉 直接傳null就行
    public static void closeAll(ResultSet resultSet, Statement statement, Connection connection) {
        // 關閉資源前進行非空判斷防止空指針出現
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            // 加快系統回收的速度
            resultSet = null;
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            statement = null;
        }
        if (connection != null) {
            try {
                connection.close(); 
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            connection = null;
        }   
    }
}

配置文件(dbinfo.properties)

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc
user=root
password=123456

插入

    private static void insert() throws SQLException {
        // 插入一條數據使用QueryRunner
        QueryRunner qr = new QueryRunner();
        // 獲取連接
        Connection conn = JDBCUtil.getConnection();
        String sql = "insert into sort values(null,'顯示器',5,'這是一臺高級顯示器')";
        // 插入數據
        int row = qr.update(conn, sql);
        if (row > 0) {
            System.out.println("插入成功");
        }
        // 安靜的關閉資源
        DbUtils.closeQuietly(conn);
    }

更新

    private static void update() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "update sort set sname=?,sprice=?,sdesc=? where sid=5";
        // 多參數參數 傳參方式1  利用數組傳
        // 方式2 直接傳遞參數 要和佔位符問號的順序對應
        Object[] params = {"咖啡",1000,"java裏的咖啡"};
        int row = qr.update(connection, sql, params);
        if (row > 0) {
            System.out.println("修改成功");
        }
        DbUtils.closeQuietly(connection);
    }

查詢操作(8個結果集)

ArrayHandler
把查詢出來的數據的第一行放進對象數組中並返回

    @Test
    public void select1() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        // 調用查詢方法 傳入什麼容器 該類就把數據放到什麼容器中給你返回
        Object[] rel = qr.query(connection, sql, new ArrayHandler());
        for (Object object : rel) {
            System.out.println(object);
        }
        DbUtils.closeQuietly(connection);
    }

ArrayListHandler
查詢每一條記錄放到list集合中(每一條記錄是一個對象數組)

    @Test
    public void select2() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        List<Object[]> list = qr.query(connection, sql, new ArrayListHandler());
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
            System.out.println();
        }
        DbUtils.closeQuietly(connection);
    }

BeanHandler
把結果的第一行封裝成一個JavaBean對象

JavaBean對象規則:
    1.成員變量私有化
    2.提供空參的構造方法
    3.提供set/get方法
符合以上規則的實體類創建出來的對象就是JavaBean對象

    @Test
    public void select3() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        // 要把使用哪個JavaBean實體類傳進去
        // 類名.class
        Sort sort = qr.query(connection, sql, new BeanHandler<>(Sort.class));
        if (sort == null) {
            System.out.println("沒有該條數據");
        }
        System.out.println(sort);
        DbUtils.closeQuietly(connection);
    }

BeanListHandler
把結果集封裝成一個JavaBean對象再放入list集合中返回

    @Test
    public void  select4() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        List<Sort> list = qr.query(connection, sql, new BeanListHandler<>(Sort.class));
        for (Sort sort : list) {
            if (sort == null) {
                System.out.println("沒有該條數據");
            }
            System.out.println(sort);
        }
        DbUtils.closeQuietly(connection);
    }

ColumnListHandler
返回指定列的數據放在list中返回

    @Test
    public void select5() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        List<Object> list = qr.query(connection, sql, new ColumnListHandler<>("sdesc"));
        for (Object object : list) {
            System.out.println(object);
        }
        DbUtils.closeQuietly(connection);
    }

ScalarHandler
查詢結果是一個的時候使用的

    @Test
    public void select6() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select avg(sprice) from sort";
        Double long1 = qr.query(connection, sql, new ScalarHandler<Double>());
        System.out.println(long1);
        DbUtils.closeQuietly(connection);
    }

MapHandler
將結果集存儲在map中返回第一條記錄

    @Test
    public void select7() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        Map<String, Object> map = qr.query(connection, sql, new MapHandler());
        Set<String> set = map.keySet();
        for (String string : set) {
            Object object = map.get(string);
            System.out.println(string + "" + object);
        }
        DbUtils.closeQuietly(connection);
    }

MapListHandler
將結果集每一條記錄都保存在map中再放入list中返回

    @Test
    public void select8() throws SQLException {
        QueryRunner qr = new QueryRunner();
        Connection connection = JDBCUtil.getConnection();
        String sql = "select * from sort";
        List<Map<String, Object>> list = qr.query(connection, sql, new MapListHandler());
        for (Map<String, Object> map : list) {
            for (String key : map.keySet()) {
                System.out.println(key + "  " + map.get(key));
            }
        }
        DbUtils.closeQuietly(connection);
    }

數據庫連接池

java爲了解決頻繁創建數據庫連接和釋放數據庫連接的問題
    使用了數據庫連接池來解決並且給出了一套規範 數據庫連接池規範(一套接口)
javax.sql.DataSource java擴展包
由數據庫廠商提供的
常用數據庫連接池 DBCP C3P0

需要導入的jar包(docp中依賴了pool中的類)
    commons-dbcp-1.4.jar
    commons-pool-1.5.6.jar

BasicDataSource 是DataSource(規範類) 的實體類
基礎設置(要使用數據庫連接池 必須設置的內容)

DataSourceUtil工具類

    public class DataSourceUtil {
        private static BasicDataSource dataSource = new BasicDataSource();
        static {
            // 基礎設置dataSource
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/myjdbc");
            dataSource.setUsername("root");
            dataSource.setPassword("123456");
            // 擴展設置
            // 初始化連接數
            dataSource.setInitialSize(10);
            // 最大活動數
            dataSource.setMaxActive(8);
            // 最大空閒連接數
            dataSource.setMaxIdle(5);
            // 最小空閒連接數
            dataSource.setMinIdle(2);
        }
        // 獲取數據庫連接池
        public static DataSource getDataSource() {
            return dataSource;
        }
    }

測試DataSourceUtil類

    public class Test {
        public static void main(String[] args) throws SQLException {
            // 數據庫連接池和QueryRunner結合使用
            QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSource());
            // 插入一條數據
            String sql = "insert into sort values(null,?,?,?)";
            Object[] params = {"試卷",10,"一份萬分試卷"};
            int row = qr.update(sql, params);
            if (row > 0) {
                System.out.println("插入成功");
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章