1. 程式人生 > >JDBC和DBUtils

JDBC和DBUtils

JDBC

JDBC:Java DataBase Connectivity Java資料庫的連線。是SUN公司統一提供的一套介面規範(JDBC).各個資料庫生產商提供實現。Java提供訪問資料庫規範稱為JDBC,而生產廠商提供規範的實現類稱為驅動。驅動:兩個硬體裝置之間通訊的橋樑。
JDBC是介面,驅動是介面的實現,沒有驅動將無法完成資料庫連線,從而不能操作資料庫!每個資料庫廠商都需要提供自己的驅動,用來連線自己公司的資料庫,也就是說驅動一般都由資料庫生成廠商提供。

JDBC操作資料庫的步驟

  1. 註冊驅動
    Class.forName(“com.mysql.jdbc.Driver”);
    告知JVM使用的是哪一個資料庫的驅動
  2. 獲得連線
    Connection con = DriverManager.getConnection(url, username, password);
    使用JDBC中的類,完成對MySQL資料庫的連線
  3. 獲得語句執行平臺
    普通的處理: Statement stat = con.createStatement();
    預處理物件
    String sql = “SELECT * FROM users WHERE username=? AND PASSWORD=?”;
    PreparedStatement pstat = conn.prepareStatement(sql)
    通過連線物件獲取對SQL語句的執行者物件
  4. 執行sql語句
    int row = stat.executeUpdate(sql);
    ResultSet rs = stat.executeQuery(sql);
    使用執行者物件,向資料庫執行SQL語句
    獲取到資料庫的執行後的結果
  5. 處理結果
  6. 釋放資源 一堆close()

JDBC操作資料庫的常用物件

Connection

建立執行SQL的物件
Statement createStatement()
PreparedStatement prepareStatement(String sql)
CallableStatement prepareCall(String sql) 建立一個CallableStatement物件來呼叫資料庫儲存過程
進行事務管理
void setAutoCommit(boolean bl)
void commit()
void rollback()

PreparedStatement

String sql = “SELECT * FROM users WHERE username=? AND PASSWORD=?”;
PreparedStatement pstat = conn.prepareStatement(sql)
執行SQL語句:
int executeUpdate(); –執行insert update delete語句.
ResultSet executeQuery(); –執行select語句.
boolean execute(); –執行select返回true 執行其他的語句返回false.
設定實際引數
void setXxx(int index, Xxx xx) 將指定引數設定為給定Java的xx值。在將此值傳送到資料庫時,驅動程式將它轉換成一個 SQL Xxx型別值。

Statement

執行sql語句
ResultSet executeQuery(String sql)
int executeUpdate(String sql)
批處理執行
void addBatch(String sql) 將給定的SQL命令新增到此Statement物件的當前命令列表中
void clearBatch() 清空此Statement物件的當前命令列表
int[] executeBatch() 將一批命令提交給資料庫執行,如果全部成功,則返回更新計陣列成的陣列

ResultSet

JDBC的元資料MataData(瞭解)– 編寫通用性較高的程式碼

DatabaseMetaData:獲得資料庫連線的資訊,獲得資料庫的表的資訊.
獲得資料庫元資料:Connection中getMetaData();
ParameterMetaData:獲得SQL中的引數的個數及型別.
獲得引數元資料:PreparedStatement中getParameterMetaData()
ResultSetMetaData:獲得結果集中的列名及列的型別.
獲得結果集元資料:ResultSet中getMeta()

@Test
    /**
     * 資料庫元資料
     */
    public void demo1(){
        Connection conn = null;
        conn = JDBCUtils2.getConnection();
        // 獲得資料庫元資料:
        try {
            DatabaseMetaData metaData = conn.getMetaData();
            System.out.println("獲得驅動名稱:"+metaData.getDriverName());
            System.out.println("獲得驅動URL:"+metaData.getURL());
            System.out.println("獲得使用者名稱:"+metaData.getUserName());

            // 獲得表中的主鍵:
            ResultSet rs = metaData.getPrimaryKeys(null, null, "category");
            if(rs.next()){
                String name = rs.getString("COLUMN_NAME");
                System.out.println(name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Test
    /**
     * 引數元資料:
     */
    public void demo2(){
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            conn = JDBCUtils2.getConnection();
            String sql = "update category set cname = ? where cid = ?";
            stmt = conn.prepareStatement(sql);
            ParameterMetaData metaData = stmt.getParameterMetaData();
            int count = metaData.getParameterCount();
            System.out.println(count);
        }catch(Exception e){

        }
    }

    @Test
    /**
     * 結果集元資料:
     */
    public void demo3(){
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils2.getConnection();
            String sql = "select * from category";
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();

            ResultSetMetaData metaData = rs.getMetaData();
            int count = metaData.getColumnCount();
            for(int i = 1;i<=count ;i++){
                String name = metaData.getColumnName(i);

                String type = metaData.getColumnTypeName(i);
                System.out.println(name+type);
            }
        }catch(Exception e){

        }
    }

DBUtils

properties配置檔案

開發中獲得連線的4個引數(驅動、URL、使用者名稱、密碼)通常都存在配置檔案中,方便後期維護,程式如果需要更換資料庫,只需要修改配置檔案即可。
通常情況下,我們習慣使用properties檔案,此檔案我們將做如下要求:
1. 檔案位置:任意,建議src下
2. 檔名稱:任意,副檔名為properties
3. 檔案內容:一行一組資料,格式是“key=value”.
a) key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
b) value值不支援中文,如果需要使用非英文字元,將進行unicode轉換。

DBUtils

DBUtils就是JDBC的簡化開發工具包。需要專案匯入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫程式碼。

Dbutils三個核心功能介紹

QueryRunner中提供對sql語句操作的API.
ResultSetHandler介面,用於定義select操作後,怎樣封裝結果集.
DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法

QueryRunner

update(Connection conn, String sql, Object… params) ,用來完成表資料的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler rsh, Object… params) ,用來完成表資料的查詢操作

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集合