Executequery là gì

Sau khi bạn đã kết nối vào cơ sở dữ liệu ở phần trước, bây giờ chúng ta có thể thao tác với đối tượng JDBC. Bài viết này, tôi sẽ giới thiệu một vài thao tác. Giả sử ta có 1 database MySQL có tên là logondb với 1 bảng users có 2 trường username, password và 1 kết nối con đến database.

1> Sử dụng đối tượng Statement

Với đối tượng này, chúng ta có thể dùng để thực thi câu các SQL. Tương ứng với loại câu SQL ta sẽ dùng các phương thức tương ứng.

Đầu tiên chúng ta khởi tạo đối tượng Statement bằng phương thức:

Statement stmt=con.createStatement();

hoặc là

Statement stmt=con.createStatement(int resultSetType, int resultSetConcurrency)

với con là đối tượng Connection kết nối đến CSDL trước đó.

resultsetType là 1 trong 3 kiểu:
* ResultSet.TYPE_FORWARD_ONLY, (chỉ đi tới, mặc định)
* ResultSet.TYPE_SCROLL_INSENSITIVE, (cho phép cuộn và không cập nhật thay đổi)
* ResultSet.TYPE_SCROLL_SENSITIVE (cho phép cuộn và không cập nhật thay đổi trên người dùng khác)

resultSetConcurrency là 1 trong 2 kiểu:
* ResultSet.CONCUR_READ_ONLY (chỉ cho phép đọc)
* ResultSet.CONCUR_UPDATABLE (Cho phép cập nhật trên ResultSet)

Chúng ta thực thi câu SQL bằng cách gọi các phương thức executeXXX với XXX là kiểu thực thi

int executeUpdate(String sql) throws SQLException

Phương thức này dùng để thực thi các câu sql insert, delete, update,… ngoại trừ câu select. Phương thức này trả về số mẫu tin bị ảnh hưởng bởi câu SQL.

void TestExecuteUpdate() { try { con=ConnectDBFactory.CreateMySqlConnection(“logondb”); Statement stmt=con.createStatement(); String sql=”Insert into users values(‘det’,’123′)”; int smt=stmt.executeUpdate(sql); if(smt<1) System.out.println(“Không chèn được”); } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } }

}

ResultSet executeQuery(String sql) throws SQLException

Phương thức này thực thi câu select SQL, trả về 1 đối tượng ResultSet để chứa 1 danh sách các records thỏa mãn câu select.

void TestExecuteQuery() { try { con=ConnectDBFactory.CreateMySqlConnection(“logondb”); Statement stmt=con.createStatement(); String sql1=”select * from users”; ResultSet rs=stmt.executeQuery(sql1); while(rs.next()) { String ms=rs.getString(“username”); String mk=rs.getString(“password”); System.out.println(ms+”\t”+mk); } } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } }

}

boolean execute(String sql) throws SQLException

Phương thức này thực thi 1 câu SQL bất kỳ và có thể trả về các kiễu khác nhau. Như vậy sau khi thực thi câu SQL bằng phương thức này ta có thể lấy kết quả bằng 3  phương thức sau:
int getUpdateCount() throws SQLException
ResultSet getResultSet() throws SQLException
hoặc boolean getMoreResults() throws SQLException.

int[] executeBatch() throws SQLException

Cho phép thực thi 1 lô các câu SQL (lưu ý là các câu sql không bao gồm câu select)

void TestExecuteBatch() { try { con=ConnectDBFactory.CreateMySqlConnection(“logondb”); Statement stmt=con.createStatement(); String sql1=”Insert into users values(‘det1′,’123’)”; String sql2=”Insert into users values(‘det2′,’123’)”; String sql3=”delete from users where username=’2424′”; stmt.addBatch(sql1); stmt.addBatch(sql2);

stmt.addBatch(sql3);

int []ds=stmt.executeBatch(); for(int i:ds) { System.out.println(“kết quả: “+i); } } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } }

}

2> Sử dụng đối tượng PrepareStatement

Đối tượng này được sử dụng khi chúng ta muốn thực thi 1 câu truy vấn có tham số. Tuy nhiên nó được khuyên dùng ngay cả khi không cần phài truyền tham số bởi nó thực thi nhanh hơn do được preload trước khi thực thi. Nó là 1 đối tượng được extends từ statement(public interface PreparedStatement extends Statement) cho nên mọi phương thức của Statement đều có thể dùng ở đây.  Cú pháp của nó như sau:

PreparedStatement prepareStatement(String sql)throws SQLException hoặc

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)throws SQLException

với sql là câu truy vấn truyền vào.

Ví dụ sau cho chúng ta cách dùng đối tượng này. Đây là ví dụ về đăng nhập hệ thống với database đã cho ở trên.

boolean Logon(String un,String psw)throws Exception { con=ConnectDBFactory.CreateMySqlConnection(“logondb”); String sql=”select * from users where username=? and password=?”;

PreparedStatement pStmt=con.prepareStatement(sql);

//truyền tham số pStmt.setString(1, un);//qui định tham số pStmt.setString(2, psw); ResultSet rs=pStmt.executeQuery();//thực thi if(rs.next()) return true; return false;

}

3> Sử dụng đối tượng ResultSet

Đối tượng ResultSet trong lập trình JDBC rất quan trọng, nó lưu giữ các mẫu tin thỏa mãn 1 tính chất nào đó của database, cho phép thực hiện các thao tác trên nó,…

ResultSet có được khi chúng ta thực thi 1 câu select SQL từ đối tượng xStatement. Sau khi có được đối tượng ResultSet ta có thể đọc 1 mẫu tin bằngphương thức next(). Phương thức này trả về false khi không có mẫu tin để đọc (có thể là cuối danh sách). Sau khi đọc 1 mẫu tin, ta có thể lấy dữ liệu từ mẫu tin hiện tại bằng cách dùng các phương thức getXXX(“fieldName hoặc index”) trong đó XXX là kiểu dữ liệu của field cần đọc. Vì do kiểu của csdl và kiểu của java là không giống nhau nên ta phải chú ý ánh xã từ kiểu của csdl sang kiểu của java tương ứng. Tuy nhiên trong 1 số trường hợp, jdbc tự ép kiểu cho chúng ta theo nguyên tắc của việc chuyển kiểu.

Về tham số truyền vào phương thức getXXX, tôi nghĩ là chúng ta nên truyền vào tên field thay thì chỉ số index vô tri vô giác. Lưu ý: trong lập trình JDBC, index luôn bắt đầu từ 1. Vi dụ :

void TestExecuteQuery() { try { con=ConnectDBFactory.CreateMsSqlServerConnection("BookMS"); Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sql1="select * from book"; ResultSet rs=stmt.executeQuery(sql1); while(rs.next()) { String ms=rs.getString("isbn"); String mk=rs.getString("bookTiitle"); System.out.println(ms+"\t"+mk); } rs.previous(); String ms=rs.getString("isbn"); System.out.println("Sau khi di lui"); System.out.println(ms); } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } }

}

Đối với 2 kiểu đặc biệt CLOB và BLOB tôi sẽ bàn đến trong bài sau.

Chúc các bạn thành công!

JDBC là viết tắt của Java Database Connectivity, nó là một API cho phép chúng ta xây dựng những ứng dụng có thể truy cập, thao tác với nhiều loại database khác nhau. Trong bài viết này, mình sẽ trình bày với các bạn những kiến thức cơ bản về JDBC các bạn nhé!

OK,

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ minh hoạ:

Executequery là gì

JDBC cung cấp cho chúng ta một cái nhìn tổng quát về kết nối database, thực thi câu lệnh SQL và xử lý kết quả trả về. Nó bao gồm nhiều interface và mỗi interface sẽ đảm nhận một vai trò khác nhau.

Có bốn interfaces chính của JDBC nằm trong package java.sql đó là: DriverConnection, Statement, ResultSet. Các loại database khác nhau như MySQL, Oracle, … sẽ dựa vào những interface này để hiện thực các đối tượng cho phù hợp với loại database đó. Tập hợp các đối tượng hiện thực này chúng ta gọi chúng là những JDBC Driver. Mỗi database sẽ cung cấp JDBC Driver khác nhau và được đóng gói thành những tập tin .jar.

Trong project trên, mình đã thêm MySQL Driver dependency:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>

    <artifactId>mysql-connector-java</artifactId>

vì mình sẽ dùng MySQL database để minh hoạ cho bài viết này.

Bây giờ mình sẽ tạo mới database để làm ví dụ nhé các bạn.

Mình sẽ có 2 bảng chứa thông tin của lớp học và những thông tin về những sinh viên của những lớp học đó. Cụ thể cấu trúc của 2 bảng sẽ như sau:

CREATE TABLE `clazz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(45) NOT NULL,

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `code` varchar(10) NOT NULL, `date_of_birth` datetime DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `clazz_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `student_clazz_idx` (`clazz_id`), CONSTRAINT `student_clazz` FOREIGN KEY (`clazz_id`) REFERENCES `clazz` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `students` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(45) NOT NULL,

  `code` varchar(10) NOT NULL,

  `date_of_birth` datetime DEFAULT NULL,

  `email` varchar(100) DEFAULT NULL,

  `clazz_id` int(11) NOT NULL,

  KEY `student_clazz_idx` (`clazz_id`),

  CONSTRAINT `student_clazz` FOREIGN KEY (`clazz_id`) REFERENCES `clazz` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mình sẽ thêm một số dữ liệu để mình có thể dùng JDBC truy vấn, thao tác trên những dữ liệu này.

Executequery là gì

OK, bây giờ chúng ta sẽ bắt đầu viết code nhé!

Điều đầu tiên chúng ta cần làm là thiết lập kết nối giữa ứng dụng của chúng ta với database.

Interface DriverManager sẽ giúp chúng ta làm điều này!

Các JDBC Driver khi ứng dụng chạy sẽ tự đăng ký chính nó với DriverManager và từ đối tượng DriverManager chúng ta có thể lấy được đối tượng Connection chứa kết nối đến database nên việc thiết lập kết nối giữa ứng dụng của chúng ta đến database sẽ dễ dàng.

Ví dụ ở đây mình dùng MySQL thì lớp hiện thực interface của MySQL Driver là com.mysql.cj.jdbc.Driver. Nếu bạn mở code của lớp này xem bạn sẽ thấy như sau

Executequery là gì

Như các bạn thấy, đối tượng Driver của MySQL Driver sẽ có một đoạn code nằm trong khối static để đăng ký chính nó với DriverManager. Việc của chúng ta là cần phải khai báo JDBC Driver nào mà chúng ta cần sử dụng mà thôi.

Mình xin nói thêm là với JDBC phiên bản 3.0 hoặc cũ hơn, chúng ta cần phải gọi Class.forName() và truyền vào phương thức forName() tên lớp hiện thực interface Driver của JDBC Driver đó để có thể sử dụng JDBC Driver.

Ví dụ cho MySQL driver thì chúng ta cần gọi:

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

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

Với JDBC từ phiên bản 4.0 trở đi như trong ví dụ của bài viết này, chúng ta không cần phải gọi Class.forName() nữa bởi vì JDBC đã hỗ trợ tự động đăng ký tất cả các JDBC Driver trong ứng dụng của các bạn bằng cách sử dụng cái mà tiếng Anh gọi là Service Provider Mechanism. Tất cả các JDBC Driver cho JDBC phiên bản từ 4.0 trở lên phải chứa một tập tin cấu hình với tên gọi là java.sql.Driver trong thư mục META-INF/services của tập tin .jar. Tập tin này sẽ chứa thông tin đầy đủ tên những lớp hiện thực interface Driver của JDBC Driver đó.

Bây giờ nếu bạn mở MySQL Driver trong project của chúng ta, các bạn sẽ thấy tập tin này.

Executequery là gì

và nội dung của tập tin này là

Executequery là gì

OK, mình sẽ sử dụng cơ chế tự động đăng ký các JDBC driver nên mình sẽ không cần gọi phương thức Class.forName() nhé các bạn.

Giờ mình sẽ dùng DriverManager để lấy đối tượng Connection.

DriverManager là đối tượng quản lý tất cả các JDBC Driver mà ứng dụng của chúng ta sẽ sử dụng, chúng ta lấy đối tượng Connection từ nó bằng cách gọi phương thức getConnection(). Ở đây chúng ta có tất cả 3 phương thức của getConnection()

public static Connection getConnection(String url) throws SQLException public static Connection getConnection(String url, Properties info) throws SQLException public static Connection getConnection(String url, String user, String pwd) throws SQLException

public static Connection getConnection(String url) throws SQLException

public static Connection getConnection(String url, Properties info) throws SQLException

public static Connection getConnection(String url, String user, String pwd) throws SQLException

Mình sẽ dùng phương thức thứ 3 để lấy Connection từ DriverManager.

package com.huongdanjava.javajdbcbasic; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Application { public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456"); } }

package com.huongdanjava.javajdbcbasic;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class Application {

    public static void main(String[] args) throws SQLException {

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456");

Url ở đây có định dạng là:

jdbc:subprotocol://<host>:<port>/<database_name>

jdbc:subprotocol://<host>:<port>/<database_name>

trong đó subprotocol là một yếu tố chính để DriverManager có thể tìm thấy được JDBC driver phù hợp trong danh sách JDBC driver mà nó đang quản lý.

OK, giờ chúng ta đã có Connection rồi, bây giờ chúng ta sẽ bắt đầu viết code để truy vấn database.

Từ đối tượng Connection chúng ta sẽ tạo ra một đối tượng Statement giúp chúng ta có thể thực thi một câu lệnh SQL theo ý chúng ta muốn:

package com.huongdanjava.javajdbcbasic; import java.sql.*; public class Application { public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456"); Statement statement = connection.createStatement(); } }

package com.huongdanjava.javajdbcbasic;

public class Application {

    public static void main(String[] args) throws SQLException {

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456");

        Statement statement = connection.createStatement();

Đối tượng Statement có hai phương thức chính là executeUpdate() và executeQuery() để thao tác với database. Các bạn cần phân biệt khi nào sẽ dùng executeUpdate() và khi nào sử dụng executeQuery() nhé!

Phương thức executeUpdate() được sử dụng để thực thi một câu lệnh SQL để thêm một dòng trong bảng, chỉnh sửa hoặc xóa những bảng đang tồn tại. Nói tóm lại, phương thức này dùng để thực thi những câu lệnh SQL có tác động đến database của bạn như thêm mới, chỉnh sửa, xóa,…

Còn phương thực executeQuery() chỉ được sử dụng trong trường hợp bạn muốn đọc dữ liệu từ database. Nếu bạn sử dụng cho những mục đích khác có thể sẽ bị lỗi SQLException khi chạy đó nhé!

Trong bài viết này mình cần lấy danh sách lớp học đang có. Do đó mình sẽ chỉ sử dụng phương thức executeQuery() và đối tượng Statement thực thi câu lệnh SQL sau:

Kết quả thực thi câu lệnh này sẽ trả về đối tượng ResultSet, chúng ta sẽ sử dụng đối tượng này để đọc kết quả câu lệnh SQL của chúng ta

package com.huongdanjava.javajdbcbasic; import java.sql.*; public class Application { public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456"); Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery("SELECT * FROM clazz"); while (rs.next()) { System.out.print(rs.getInt("id") + "-"); System.out.print(rs.getString("name") + "\n"); } } }

package com.huongdanjava.javajdbcbasic;

public class Application {

    public static void main(String[] args) throws SQLException {

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example", "root", "123456");

        Statement statement = connection.createStatement();

        ResultSet rs = statement.executeQuery("SELECT * FROM clazz");

            System.out.print(rs.getInt("id") + "-");

            System.out.print(rs.getString("name") + "\n");

Kết quả:

Executequery là gì

Như các bạn thấy, từ đối tượng ResultSet chúng ta có thể đọc được dữ liệu trả về thông qua các phương thức getInt(), getString(),…

Tóm lại, bài viết này mình diễn đạt những cái cơ bản cần phải biết khi làm việc với JDBC cho tất cả các bạn. Hi vọng các bạn có thể bổ sung được nhiều kiến thức cho mình.