Java數據庫基礎(JDBC)

JDBC(Java Data Base Connectivity):SUN公司爲了簡化統一對數據庫的操作,定義了一套Java操作數據庫的規範,稱之爲JDBC;

這樣應用程序就不需要關注數據庫底層的詳細實現,只需要學習使用JDBC就可以。

 

            

 

 

 

 當用戶需要操作數據庫時,需要先把數據庫的驅動放到程序裏,註冊驅動,sun公司定義了DriverManager類用戶完成驅動程序的註冊;

 

這裏首先給出連接數據庫的一些參數:

1     private static String driver = "com.mysql.jdbc.Driver" ;2     private static String url = "jdbc:mysql://localhost:3306/hibernate";3     private static String user = "root";4     private static String password = "root";

 

(一)驅動程序的註冊(加載)有兩種方式:

1)有API的源碼可以知道,這種方式會導致驅動程序註冊兩次,在內存中會有兩個Driver對象, 而且這種方式依賴於mysql的jar包,如果缺少jar包會導致程序無法編譯;

DriverManager.registerDriver(Driver driver)

DriverManager.getConnection(url,user,passwprd)

2)一般使用第二種方式較多,只需要一個字符串即可,不需要依賴具體的驅動;

Class.forName("com.mysql.jdbc.Driver)

(二) URL:

URL用於標識數據庫的位置,通過url告知程序連接那個數據庫,url的寫法爲:jdbc:mysql:[]//localhost:3306/test?參數名:參數值

常用的數據庫url地址的寫法:

Oracle:jdbc:oracle:thin:@localhost:1521:sid;

mysql:jdbc.mysql.://localhost:3306/sid;

sql server:jdbc.microsoft:sqlserver://localhost.1433/DatabaseName=sid;

其中sid爲各個數據庫自定義的服務號,mysql爲數據庫名,oracle爲對應版本有不同的服務號,XE版默認XE,企業版默認:orcl

以下給出數據庫連接的例子:

複製代碼

   /**
     * 獲取數據庫連接
     * @param driver 驅動
     * @param url 地址
     * @param user 用戶名
     * @param password 密碼
     * @return 返回連接對象     */
    public static Connection getConnection(String driver, String url, String user, String password) {        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("mysql connect succeed~");            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }        return null;
    }

複製代碼

 

Connection對象

Jdbc程序中的Connection,它用於代表數據庫的鏈接,Collection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過connection對象完成的,這個對象的常用方法:

  • createStatement():創建向數據庫發送sql的statement對象。

  • prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。

  • prepareCall(sql):創建執行存儲過程的CallableStatement對象。

  • setAutoCommit(boolean autoCommit):設置事務是否自動提交。

  • commit() :在連接上提交事務。

  • rollback() :在此連接上回滾事務。

 

 

 Statement對象

Jdbc程序中的Statement對象用於向數據庫發送SQL語句, Statement對象常用方法:

  • executeQuery(String sql) :用於向數據發送查詢語句。

  • executeUpdate(String sql):用於向數據庫發送insert、update或delete語句

  • execute(String sql):用於向數據庫發送任意sql語句

  • addBatch(String sql) :把多條sql語句放到一個批處理中。

  • executeBatch():向數據庫發送一批sql語句執行。

 

 ResultSet

Jdbc程序中的ResultSet用於代表SQL語句的執行結果。Resultset封裝執行結果時,採用的類似於表格的方式。ResultSet 對象維護了一個指向表格數據行的遊標,初始的時候,遊標在第一行之前,調用ResultSet.next() 方法,可以使遊標指向具體的數據行,進行調用方法獲取該行的數據。
ResultSet既然用於封裝執行結果的,所以該對象提供的都是用於獲取數據的get方法:
獲取任意類型的數據

  • getObject(int index)

  • getObject(string columnName)

獲取指定類型的數據,例如:

  • getString(int index)

  • getString(String columnName)

注意:列的索引從1開始。

ResultSet還提供了對結果集進行滾動的方法:

  • next():移動到下一行

  • previous():移動到前一行

  • absolute(int row):移動到指定行

  • beforeFirst():移動resultSet的最前面。

  • afterLast() :移動到resultSet的最後面。

 釋放資源

  • Jdbc程序運行完後,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet, Statement和Connection對象。

  • 特別是Connection對象,它是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是儘量晚創建,儘量早的釋放。(使用原則:儘量晚的創建,儘量早的釋放)

  • 爲確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。

 

程序示例:

使用jdbc進行增刪改查操作:

 

複製代碼

 /**
     * 獲取查詢的結果集
     * @param connection 數據庫連接對象
     * @param tableName 需要查詢的表名
     * @return 返回結果集     */
    public static ResultSet select(Connection connection, String tableName){
        ResultSet resultSet = null;
        String sql = "select * from " + tableName;
        PreparedStatement statement = null;        try {
            statement = connection.prepareStatement(sql);            //執行給定的 SQL 語句,該語句返回單個 ResultSet 對象
            resultSet = statement.executeQuery(sql);            return resultSet;
        } catch (SQLException e) {
            e.printStackTrace();
        }        return null;
    }    /**
     * 數據庫插入操作
     * @param connection
     * @return
     */
    public static boolean add(Connection connection, String userName, String password, String address){
        String sql = "INSERT  INTO  t_user(username, password, address) VALUES ('"+userName+"','"+password+"','"+address+"')";
        System.out.println(sql);
        PreparedStatement statement = null;        try {
            statement = connection.prepareStatement(sql);            //執行給定的 SQL 語句,返回影響的行數
            int num = statement.executeUpdate(sql);            if (num != 0){                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }        return false;
    }    /**
     * 刪除操作
     * @param connection
     * @param id 需要刪除的id值
     * @return
     */
    public static boolean delete(Connection connection, String id){
        String sql = "DELETE FROM t_user WHERE uid = " + id;
        System.out.println(sql);
        PreparedStatement statement = null;        try {
            statement = connection.prepareStatement(sql);            //執行給定的 SQL 語句,返回影響的行
            int num = statement.executeUpdate(sql);            if (num != 0){                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }        return false;
    }    /**
     * 修改數據操作
     * @param connection
     * @param id
     * @param userName
     * @return
     */
    public static boolean update(Connection connection, String id, String userName){
        String sql = "UPDATE t_user SET username = '"+userName+"'WHERE uid = " + id;
        System.out.println(sql);
        PreparedStatement statement = null;        try {
            statement = connection.prepareStatement(sql);            //執行給定的 SQL 語句,返回影響的行數
            int num = statement.executeUpdate(sql);            if (num != 0){                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }        return false;
    }

複製代碼

 

Jdbc中的statement對象用於向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。

Statement對象的executeUpdate方法,用於向數據庫發送增、刪、改的sql語句,executeUpdate執行完後,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。

Statement.executeQuery方法用於向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。

其中對ResultSet的遍歷:

複製代碼

ResultSet resultSet = MysqlUtils.select(conn, "t_user");        try {            while (resultSet.next()){                //序列從1號開始
                System.out.println(resultSet.getString(1));
                System.out.println(resultSet.getString(2));
                System.out.println(resultSet.getString(3));
                System.out.println(resultSet.getString(4));
                System.out.println("------------------------");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

複製代碼

 

 PreperedStatement

  • PreperedStatement是Statement的孩子,它的實例對象可以通過調用Connection.preparedStatement()方法獲得,相對於Statement對象而言:

  • PreperedStatement可以避免SQL注入的問題。

  • Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩衝區溢出。PreparedStatement 可對SQL進行預編譯,從而提高數據庫的執行效率。

  • 並且PreperedStatement對於sql中的參數,允許使用佔位符的形式進行替換,簡化sql語句的編寫。

 


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