13/08/2018, 22:01

Các cải tiến JDBC của Java 7

Chữ số Java với dấu gạch dưới Java JDBC được sử dụng để kết nối đến database. Bạn có thể truy cập bất kỳ dữ liệu nào từ database, spreadsheets hoặc file bằng cách sử dụng JDBC. Trong Java 7, Java đã giới thiệu các tính năng sau: 1) Nó cung cấp khả năng sử dụng câu lệnh ...

Chữ số Java với dấu gạch dưới

Java JDBC được sử dụng để kết nối đến database. Bạn có thể truy cập bất kỳ dữ liệu nào từ database, spreadsheets hoặc file bằng cách sử dụng JDBC.

Trong Java 7, Java đã giới thiệu các tính năng sau:

1) Nó cung cấp khả năng sử dụng câu lệnh try-with-resources để tự động đóng các tài nguyên kiểu Connection, ResultSet và Statement.

2) RowSet 1.1: Sự ra đời của interface RowSetFactory và lớp RowSetProvider, cho phép bạn tạo tất cả các hàng được trình điều khiển JDBC hỗ trợ.

RowSetFactory Interface

Nó định nghĩa các bản cài đặt của factory được sử dụng để đạt được các kiểu khác nhau của kiểu RowSet.

Các phương thức của RowSetFactory Interface

Phương thức Mô tả
CachedRowSet createCachedRowSet() throws SQLException Nó tạo ra một thể hiện mới của FilteredRowSet. Nó ném SQLException, nếu không thể tạo một CachedRowSet.
FilteredRowSet createFilteredRowSet() throws SQLException Nó tạo ra một thể hiện mới của FilteredRowSet. Nó ném SQLException, nếu một FilteredRowSet không thể được tạo ra.
JdbcRowSet createJdbcRowSet() throws SQLException Nó tạo ra một thể hiện mới của JdbcRowSet. Nó ném SQLException, nếu không thể tạo JdbcRowSet.
JoinRowSet createJoinRowSet() throws SQLException Nó tạo ra một thể hiện mới của JoinRowSet. Nó ném SQLException, nếu một JoinRowSet không thể được tạo ra.
WebRowSet createWebRowSet() throws SQLException Nó tạo ra một thể hiện mới của WebRowSet. Nó ném SQLException, nếu một WebRowSet không thể được tạo ra.

Lớp Java RowSetProvider

Nó là một factory API giúp các ứng dụng để có được bản cài đặt của RowSetFactory có thể được sử dụng để tạo ra các kiểu RowSet khác nhau.

Phương thức Mô tả
public static RowSetFactory newFactory() throws SQLException Nó tạo ra một thể hiện mới của một RowSetFactory. Nó ném SQLException, nếu lớp factory mặc định không thể được nạp hoặc khởi tạo.
public static RowSetFactory newFactory(String factoryClassName, ClassLoader cl) throws SQLException Nó tạo ra một thể hiện mới của một RowSetFactory từ tên lớp factory được chỉ định. Chức năng này rất hữu ích khi có nhiều provider trong classpath. Nó cho phép kiểm soát nhiều hơn đối với ứng dụng vì nó có thể chỉ định provider nào nên được nạp. Nó ném SQLException, nếu factoryClassName là null, hoặc không thể tải lớp factory.

Ví dụ JDBC – kết nối MySQL sử dụng Try-With-Resources

package vn.viettuts;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample1 {
    public static void main(String args[]) {
        try (//su dung try-with-resources
             // tao connection
                Connection con = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/student", 
                        "root", "1234567890");
                // tao statement
                Statement stmt = con.createStatement();
                // thuc thi sql query
                ResultSet rs = stmt.executeQuery("select * from user");)
        {
          // lap cac phan tu ResultSet
            while (rs.next()) {
                System.out.println(rs.getInt(1) + " " + rs.getString(2) 
                    + " " + rs.getString(3));
            }
        }
        catch (Exception e) { // xu ly ngoai le
            System.out.println(e.getMessage());
        }
    }
}

Trong ví dụ trên, chúng ta sử dụng try-with-resources. Nó được sử dụng để đóng tài nguyên sau khi hoàn thành khối try. Bây giờ, bạn không cần đóng kết nối cơ sở dữ liệu một cách rõ ràng.

Đảm bảo bạn đang sử dụng phiên bản JDBC 4.0 trở lên và Java phiên bản 1.6 trở lên.

RowSet 1.1

Trong các phiên bản trước của Java, bạn đã tạo ra các thể hiện của JdbcRowSet, CachedRowSet, FilteredRowSet vv bằng cách sử dụng lớp JdbcRowSetImpl.

Bây giờ, Java 7 đã thêm một RowSet phiên bản 1.1. Vì vậy, bạn có thể tạo thể hiện của JdbcRowSet bằng cách sử dụng giao diện RowSetFactory.

Java CachedRowSet

Nó lưu trữ (cache) dữ liệu vào bộ nhớ để có thể thực hiện các hoạt động trên dữ liệu riêng của nó chứ không phải là dữ liệu được lưu trữ trong cơ sở dữ liệu. Nó có thể hoạt động mà không được kết nối với nguồn dữ liệu của nó, đó là lý do tại sao, nó còn được gọi là disconnectedRowSet.

Ví dụ Java JDBC: CachedRowSet

package vn.viettuts;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetProvider;

public class JdbcExample2 {
    public static void main(String args[]) throws Exception {
        try (// su dung try-with-resources
             // tao connection
                Connection con = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/student", 
                        "root", "1234567890");
                // tao statement
                Statement stmt = con.createStatement();
                // thuc thi sql query
                ResultSet rs = stmt.executeQuery("select * from user");) {
            // tao CachedRowSet
            CachedRowSet cRS = RowSetProvider.newFactory().createCachedRowSet();
            // điền dữ liệu ResultSet vào CachedRowSet
            cRS.populate(rs);
            while (cRS.next()) {
                System.out.println(cRS.getInt(1) + " " + cRS.getString(2) 
                    + " " + cRS.getString(3));
            }
        }
        catch (Exception e) { // xy ly ngoai le
            System.out.println(e);
        }
    }
}

Java JdbcRowSet

Nó là một đối tượng được cải tiến ResultSet được sử dụng để duy trì kết nối đến một nguồn dữ liệu. Nó tương tự như ResultSet, nhưng sự khác biệt lớn là nó cung cấp tập hợp các thuộc tính và listener như một JavaBeans. Mục đích chính của JdbcRowSet là làm cho một ResultSet có thể cuộn và cập nhật được.

Trong ví dụ sau, chúng ta sẽ tạo thể hiện của JdbcRowSet bằng cách sử dụng cách tiếp cận mới.

Ví dụ 1 Java JdbcRowSet

package vn.viettuts;

import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetProvider;

public class JdbcExample3 {
    public static void main(String args[]) throws Exception {
        try (// su dung try-with-resources
             // tao connection
                JdbcRowSet jRS = RowSetProvider.newFactory().createJdbcRowSet();) {
            // thiet lap ket noi database
            jRS.setUrl("jdbc:mysql://localhost:3306/student");
            // thiet lap username
            jRS.setUsername("root");
            // thiet lap password
            jRS.setPassword("1234567890");
            // thiet lap sql query de thuc thi
            jRS.setCommand("select * from user");
            // thuc thi query
            jRS.execute();
            while (jRS.next()) {
                System.out.println(jRS.getInt(1) + " " + jRS.getString(2) 
                    + " " + jRS.getString(3));
            }
        }
        catch (Exception e) { // xu ly ngoai le
            System.out.println(e);
        }
    }
}

Ví dụ 2 Java JdbcRowSet: update row

package vn.viettuts;

import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetProvider;

public class JdbcExample4 {
    public static void main(String args[]) throws Exception {
        try (// su dung try-with-resources
             // tao connection
                JdbcRowSet jRS = RowSetProvider.newFactory().createJdbcRowSet();) {
            // thiet lap ket noi database
            jRS.setUrl("jdbc:mysql://localhost:3306/student");
            // thiet lap username
            jRS.setUsername("root");
            // thiet lap password
            jRS.setPassword("1234567890");
            // thiet lap sql query de thuc thi
            jRS.setCommand("select * from user");
            // thuc thi query
            jRS.execute();
            // try van row thu 3
            jRS.absolute(3);
            System.out.println(jRS.getInt(1) + " " + jRS.getString(2) 
                    + " " + jRS.getString(3));
            // update row 3
            jRS.updateString("name", "David Bishop");
            jRS.updateRow();
            // try van row thu 3 mot lan nua
            System.out.println(jRS.getInt(1) + " " + jRS.getString(2) 
                    + " " + jRS.getString(3));
        }
        catch (Exception e) { // xu ly ngoai le
            System.out.println(e);
        }
    }
}

Kết quả:

3  David        6677028
3  David Bishop 6677028
Chữ số Java với dấu gạch dưới
0