Bài 324: Các cải tiến JDBC của Java 7

Ngày đăng: 1/7/2023 11:12:45 AM

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30     

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35      

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30     

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36     

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

Nguồn tin: viettuts.vn