You are on page 1of 18

BÀI 5: LẬP TRÌNH CƠ SỞ DỮ LIỆU JDBC

Học xong bài này người học thực hiện được các nội dung sau.
- Trình bày được khái niệm về JDBC; Các thành phần JDBC; Phân loại JDBC; Cơ
chế hoạt động JDBC,..
- Thực hiện được việc tải và cài đặt JDBC driver cho project
- Trình bày được các phương pháp kết nối CSDL với các hệ QT CSDL SQL Server,
Ocracle, MySQL,…
- Thực hiện được việc kết nối và truy xuất cơ sở dữ liệu
- Thực hiện được việc xử lý kết xuất kết quả truy xuất CSDL.
- Xây dựng được ứng dụng Quản lý CSDL
5.1. GIỚI THIỆU VỀ JDBC
5.1.1. JDBC là gì?
JDBC (Java DataBase Connectivity) là một thư viện chuẩn dùng để truy xuất các
cơ sở dữ liệu như MS Acess, SQL Server, Oracle, PostgreSQL,… trong các ứng dụng
Java bằng ngôn ngữ truy vấn SQL.
JDBC hỗ trợ các chức năng như tạo một kết nối đến một cơ sở dữ liệu, tạo câu lệnh
SQL (Structured Query Language), thực thi câu lệnh SQL, xem và thay đổi dữ liệu.

Hình 5.1. Trình điều khiển JDBC


5.1.2. Các thành phần JDBC - JDBC API
Các thành phần JDBC:
- DriverManager: Lớp này quản lý một danh sách trình điều khiển cơ sở dữ liệu
(database drivers). Lựa chọn trình điều khiển phù hợp từ yêu cầu của ứng dụng
java sử dụng giao thức giao tiếp.
- Connection: Đại diện cho một kết nối đến cơ sở dữ liệu

ThS. Dương Thành Phết http://www.thayphet.net Trang 126


- Statement: Đối tượng dùng để thực thi các câu lệnh SQL như câu lệnh thêm dữ liệu
(insert), câu lệnh thay đổi dữ liệu (update), câu lệnh xoá dữ liệu (delete), câu lệnh
xem dữ liệu (select), …
- ResultSet: Đối tượng này sẽ chứa dữ liệu sau khi chúng ta thực thi câu lệnh xem dữ
liệu. Sử dụng đối tượng này để duyệt qua tất cả dữ liệu được chứa trong ResultSet.

Hình 5.2. Các thành phần của JDBC


5.1.3. Phân loại JDBC Database Driver
Có 4 kiểu JDBC Database Driver:
- Kiểu 1: JDBC-ODBC bridge driver
 Chuyển đổi các lời gọi JDBC thành ODBC, ODBC có thể truy xuất
giao thức DBMS.
 Phương thức truy xuất dữ liệu đòi hỏi trình điều khiển ODBC được
cài đặt trên máy tính client.

Hình 5.3. JDBC-ODBC bridge driver


- Kiểu 2: Native protocol partly java driver
 Chuyển lời gọi JDBC thành các lời gọi giao thức DBMS đặc thù.
 Khi đó sự chuyển đỗi này đặt trên máy client, một số mã nhị phân phải được
cài đặt trên máy tính client.

ThS. Dương Thành Phết http://www.thayphet.net Trang 127


Hình 5.4. Native protocol partly java driver
- Kiểu 3: Net protocol all Java driver
 Chuyển đổi các lời gọi JDBC thành giao thức mạng độc lập với bất kỳ giao
thức DBMS đặc thù. Sau đó, một phần mềm trung gian (middleware) chạy
trên máy server chuyển đỗi giao thức mạng thành giao thức DBMS đặc thù.
 Sự chuyển này đặt ở phía server mà không đòi hỏi cài đặt trên máy tính
client.

Hình 5.5. Net protocol all Java driver


- Kiểu 4: Native protocol all Java driver
 Chuyển lời gọi JDBC thành các lời gọi giao thức DBMS đặc thù.
 Khi đó sự chuyển đỗi này đặt phía server, mà không đòi hỏi cài đặt
trên máy tính client

ThS. Dương Thành Phết http://www.thayphet.net Trang 128


Hình 5.6. Native protocol all Java driver
Kết luận trình điều khiển nào nên được sử dụng (Which driver should be used)
- Nếu truy cập vào cơ sở dữ liệu như MySQL, SQL Server, PostgreSQL, Oracle, … thì
loại 4 nên được sử dụng.
- Nếu ứng dụng Java truy cập nhiều loại CSDL cùng lúc thì loại 3 nên được sử dụng.
- Loại 2 được sử dụng trong một số tình huống khi mà loại 3 hoặc loại 4 là không có
sẵn.
- Loại 1 thường được sử dụng với mục đích thử nghiệm.
5.2. CƠ CHẾ HỌAT ĐỘNG VỚI JDBC

Hình 5.7: Mô hình hoạt động của ứng dụng với JDBC

ThS. Dương Thành Phết http://www.thayphet.net Trang 129


Các bước truy xuất cơ sở dữ liệu
- Nạp trình điều khiển.
- Thiết lập kết nối.
- Tạo đối tượng Statement
- Thực hiện thao tác dữ liệu
- Xử lý kết quả trả về
- Đóng kết nối
5.2.1. NẠP TRÌNH ĐIỀU KHIỂN.
Sử dụng phương thức tĩnh registerDriver của lớp DirverManager hoặc
forName() của lớp Class với tham số là tên trình điều khiển cơ sở dữ liệu.
try {
DriverManager.registerDriver(new
com.microsoft.sqlserver.jdbc.SQLServerDriver());
} catch(ClassNotFoundException e) {
System.out.println(“Error loading driver: “ e);
}
Hoặc
try {
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
} catch(ClassNotFoundException e) {
System.out.println(“Error loading driver: “ e);
}
Một số trình điều khiển thường dùng là:
 Trình điều khiển của MySQL: Class.forName(“org.gjf.mm.mysql.Driver”);
 Trình điều khiển của Oracle: Class.forName(“oracle.jdbc.driver.OracleDriver”);
 Trình điều khiển của Sybase: Class.forName(“com.sybase.jdbc.SybDriver”);
 Trình điều khiển qua cầu nối ODBC:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
 Trình điều khiển qua cầu nối SQL Server (Native):
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
5.2.2 Thiết lập kết nối.
- Chỉ định chuỗi kết nối
String host = "dbhost.yourcompany.com";
String dbName = "someName";
int port = 1234;
String oracleURL = "jdbd:oracle:thin:@" + host + ":" + port + ":" + dbName;
String sybaseURL = "jdbc:sybase:Tds:" + host + ":" + port + ":" +

ThS. Dương Thành Phết http://www.thayphet.net Trang 130


"?SERVICEid="+ dbName;
- Thiết lập kết nối: Để thiết lập kết nối ta gọi phương thức tĩnh getConnection()
của lớp DriverManager, khi đó trả về một thể hiện của lớp Connection, theo dạng
sau:
String user = “sa”
String password = “secret”
Connection con = DriverManager.getConnection(dbUrl, username, password);
Trong đó:
- dbUrl: chuỗi kết nối đến cơ sở dữ liệu.
- username: tên người dùng đăng nhập
- password: mật khẩu đăng nhập.
Để lấy các thông tin về cơ sở dữ liệu gọi phương thức getMetaData() của
Connection trả về đối tượng lớp DatabaseMetaData.

 Ví dụ sau minh họa kết nối đến MySQL

 Ví dụ sau minh họa cách kết nối tới Oracle

ThS. Dương Thành Phết http://www.thayphet.net Trang 131


 Ví dụ minh họa cách kết nối tới SQL Server:
try {
DriverManager.registerDriver(new
com.microsoft.sqlserver.jdbc.SQLServerDriver());
String url = “jdbc:sqlserver://localhost:1433;database=QLBanSach;user=sa;
password= 1234567”
Connection connection = DriverManager.getConnection(url);
} catch(ClassNotFoundException e) {
System.out.println(“Driver not found: “ e.getMessage);
}catch(SQLException e){
System.out.println(“SQL Exception : “ + e.getMessage) ;
}
5.2.3 Tạo đối tượng Statement
Một đối tượng Statement được sử dụng để truyền câu truy vấn và câu lệnh
đến CSDL và nó được tạo từ đối tượng Connection đã khởi tạo.
Cách tạo đối tượng statement là gọi phương thức createStatement() của đối tượng
Connection: Statement statement = connection.createStatement();
Theo mặc đinh, đối tượng statement được tạo ra từ phương thứccreateStatement() khi
truy vấn đến cơ sở dữ liệu cho kết quả là forward-only và read-only.
Tạo statement cho phép cập nhật:
createStatement(int resultSetType,int resultSetConcurrency) throws
SQLException
Cho phép tạo đối tượng Statement mà sẽ phát sinh đối tượng ResultSet với kiểu và
thao tác xác định.
Các tham số:
- resultSetType: kiểu của tập kết quả, có thể là
 ResultSet.TYPE_FORWARD_ONLY

ThS. Dương Thành Phết http://www.thayphet.net Trang 132


 ResultSet.TYPE_SCROLL_INSENSITIVE
 ResultSet.TYPE_SCROLL_SENSITIVE
- resultSetConcurrency: kiểu thao tác, có thể là
 ResultSet.CONCUR_READ_ONLY
 ResultSet.CONCUR_UPDATABLE
5.2.4 Thực hiện thao tác dữ liệu
Xây dựng câu truy vấn (query):
String sql = “SELECT col1, col2,col3 FROM table1, table2”;
String sql = “Update table1 set col1 = col1 *10 / 100”;
Để thực thi câu lệnh SQL ta sử dụng một trong hai phương thức sau của đối tượng
Statement là executeQuery() và executeUpdate().
- Phương thức executeQuery: thực hiện câu vấn tin dạng SELECT và nhận kết
quả trả về là một đối tượng ResultSet (tập các bản ghi dữ liệu truy vấn được).
- Phương thức executeUpdate: thưc thi câu vấn tin dạng CREATE, UPDATE,
INSERT, DELETE.
Sau đây là một số ví dụ về cập nhật dữ liệu:
- Thêm một bản ghi mới vào cơ sở dữ liệu

- Cập nhật các thay đỗi vào cơ sở dữ liệu

- Xóa các bản ghi thỏa mãn điều kiện

ThS. Dương Thành Phết http://www.thayphet.net Trang 133


Ngoài ra ta cũng có thể sử dụng đối tượng PreparedStatement để viết các câu lệnh truy
vấn có tham số và câu lệnh được biên dịch trước
Ví dụ:

Khi sử dụng PreparedStatement, database server phải kiểm tra cú pháp và


chuẩn bị một kế hoạch xử lý một lần cho mỗi câu lệnh SQL.Để xác định một tham
số cho PreparedStatement, gỏ dấu chấm hỏi (?) trong câu lệnh SQL. Để cung cấp
các giá trị cho các tham số trong PreparedStatement, sử dụng các phương thức dạng
setAAAA().
Để xử lý câu SELECT, sử dụng phương thức executeQuery(). Để xử lý câu INSERT,
UPDATE, hoặc DELETE, sử dụng phương thức executeUpdate().
Ví dụ sau sử dụng PreparedStatement để sửa đổi dữ liệu:

Ví dụ sau sử dụng PreparedStatement thêm mới một bản ghi:

Ví dụ sau sử dụng PreparedStatement xóa các bản ghi thõa mãn điều kiện:
ThS. Dương Thành Phết http://www.thayphet.net Trang 134
5.2.5 Xử lý kết quả trả về (ResultSet)
Đối với câu vấn tin dạng SELECT, nếu truy vấn thành công thì kết quả trả về là tập
các bản ghi dữ liệu được lưu trong đối tượng ResultSet và ta có thể hiển thị hoặc xử lý trên
kết quả này. Cách duyệt qua các bản ghi dữ liệu như sau:

Đối tượng ResultSet


- Theo mặc định phương thức createStatement() tạo ra đối tượng ResultSet là
forward-only & read-only. Điều này có nghĩa ta chỉ có thể di chuyển con trỏ thông
qua nó từ bản ghi đầu tiên đến bản ghi cuối cùng mà không thể cập nhật được.
- Khi ResultSet được tạo, con trỏ được định vị trước bản ghi đầu tiên. Sau đó
ta có thể sử dụng các phương thức của ResultSet để di chuyển con trỏ.
- Các phương thức của ResultSet ném ra ngoại lệ SQLException.
- Ví dụ tạo ResultSet gồm 1 dòng và 1 cột:
Statement stmt = connection.createStatement();
ResultSet rsUserID = stmt.executeQuery(“SELECT UserID
FROM User WHERE Email=“jerry@yahoo.com””);
- Ví dụ ResultSet gồm nhiều dòng và nhiều cột:
Statement stmt = connection.createStatement();
ResultSet rsProducts = stmt.executeQuery(“SELECT * FROM product”);
- Một số phương thức của ResultSet forward-only, read-only:
 Next(): Di chuyển tới dòng kế tiếp trong ResultSet.
 Last(): Di chuyển đến dòng cuối cùng trong tập kết quả
 Close(): Đóng kết nối giữa JDBC Resultset va Cơ sở dữ liệu
ThS. Dương Thành Phết http://www.thayphet.net Trang 135
 getRow(): Trả về dòng hiện tại (số nguyên)
- Cách nhận dữ liệu từ ResultSet:
 Các phương thức dạng getAAAA() có thể sử dụng để lấy về các kiểu
dữ liệu cơ bản, như int, long, double, …
int n = rsProduct.getInt(“Soluong”),
double price = rsProduct.getDouble(“Price”);
...
 Các phương thức dạng getAAAA() cũng có thể được sử dụng để lấy
về kiểu chuỗi, ngày tháng, thời gian, …
String username = rsUser.getString(1);
Date = rsProduct.getDate(“MakeDate”);

5.2.6 Đóng kết nối
Để ngắt kết nối ta sử dụng phương thức close của đối tượng connection:
connection.close()
5.3 CHƯƠNG TRÌNH MẪU
Để thực hiện ứng dụng minh họa, cần kiểm tra tài khoản đăng nhập SQL Server, cần
điều chỉnh thiết lập mật khẩu cho tài khoản sa. Tiến hành kiểm tra và điều chỉnh port 1433
cho SQL Server.
5.3.1. Thiết lập tài khoản đăng nhập SQLServer 20XX
Khi chưa thiết lập tài khoản sa khi cài đặt sql server, hoặc quên mất mật khẩu của tài
khoản sa, hoặc muốn đổi mật khẩu sa.
Bước 1: Thiết lập SQL Server cho phép đăng nhập với tài khoản của SQL Server
- Khởi động SQL Server và đăng nhập với chế độ Windows Authenticate
- Tại cửa sổ Opject Explorer: Chuột phải SQL Server -> Chọn Properties
- Chọn SQL Server and Windows Authencation mode
- Khởi động lại SQL Server
Bước 2: Kích hoạt và đặt mật khẩu cho tài khoản sa
- Tại mục Login của cửa sổ Object Explorer của SQL Server
- Tại mục Logins Click phải tài khoản sa -> Chọn Properties
- Đặt mật khẩu  OK
- Tại mục Status  Login Kích hoạt tài khoản sa bằng cách chọn Enable (mặc định tài
khoản này là disable)

ThS. Dương Thành Phết http://www.thayphet.net Trang 136


- Tiếp theo phải restart lại service, thấy những thay đổi này mới được thực thi. Để restart
service: Dùng tổ hợp phím Windows +R để xuất hiện hộp thoại Run, nhập lệnh
services.msc, tìm chọn mục SQL Server (SQL Express…)
- Service đang hoạt động. Ta tiến hành Stop và rồi ta Start cho khởi động lại. Ok xong
- Đã thấy chữ Started  Service đang hoạt động
Tiến hành đăng nhập SQLServer với chế độ SQL Server Authenticate với tài khoản sa.
và thực hiện việc tạo CSDL với SQLServer.
5.3.2. Tạo CSDL cho ứng dụng:
Đăng nhập SQL Server với tài khoản sa, tạo CSDL và nhập liệu mẫu như sau:
--Tạo CSDL: QLSanpham
Create DataBase QLSanpham
use QLSanpham
---Tao Table LoaiSP
Create Table LoaiSP
(
Maloai char(2) primary key,
Tenloai nvarchar(20)
)
Insert into LoaiSP values('BK',N'Bánh kẹo')
Insert into LoaiSP values('GK',N'Giải khát')
Insert into LoaiSP values('MP',N'Mỹ phẩm')
----Tạo tabl Sanpham
Create Table Sanpham
(
MaSP char(4) primary key,
TenSP nvarchar(20),
Dongia bigint,
Maloai char(2) foreign key references LoaiSP(Maloai)
)
Insert into Sanpham values('SP01',N'Bánh mì',10000,'BK')
Insert into Sanpham values('SP02',N'Bánh bao',15000,'BK')
Insert into Sanpham values('SP03',N'Coca cola',12000,'GK')
Insert into Sanpham values('SP04',N'Pepsi',11000,'GK')
Insert into Sanpham values('SP05',N'Kem chống nắng',85000,'MP')

ThS. Dương Thành Phết http://www.thayphet.net Trang 137


5.3.3. Tải và cài đặt JDBC Driver cho project
- Tải MS SQL Server JDBC Driver và giải nén:
https://www.microsoft.com/en-US/download/details.aspx?id=11774

Hình 5.8 tải và giải nén JDBC Driver SQL Server


- Cài đặt Microsoft SQL Server JDBC Driver cho NetBeans
 Khởi động NetBeans
 Tạo Project mới: KetnoiCSDLDemo
 Chọn thẻ tool -> library -> New Library
o Ở Textfield Library Name: chọn tên thư viện mà bạn muốn đặt
o Còn ở Library Type thì cứ để mặc định  Sau đó OK.
 Tiếp tục Chọn Nút Add JAR/Folder
o Chỉ đường dẫn đến file JAR mới vừa down về.

ThS. Dương Thành Phết http://www.thayphet.net Trang 138


Hình 5.9 Cài đặt JDBC Driver cho project
Kết quả đã cài đặt:

Hình 5.8 Kết quả cài đặt JDBC Driver cho project
5.3.4. Tạo ứng dụng kết nối CSDL SQL Server với Java trên Netbeans
- Minh họa 1: Trong Project KetnoiCSDLDemo thực hiện code cho chương trình
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class KetnoiCSDLDemo {
public static void main(String[] args) throws SQLException {

}
Thực thi chương trình:

Hình 5.10 Kết quả minh họa


- Minh họa 2: Hiện thị dữ liệu lên JTable
Tạo thêm vào project java class QLSanpham

ThS. Dương Thành Phết http://www.thayphet.net Trang 139


Hình 5.11 Thêm mới 1 Java Class
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class QLSanpham extends JFrame {
private Connection connect = null;
private JTable jtable = new JTable();
private DefaultTableModel tableModel = new DefaultTableModel();
public QLSanpham() throws SQLException{
String []colsName = {"Mã SP", "Tên SP","Đơn giá", "Loai Sp"};
tableModel.setColumnIdentifiers(colsName); // đặt tiêu đề cột cho tableModel
jtable.setModel(tableModel); // kết nối jtable với tableModel
initComponent(); // Khởi tạo các components trên JFrame
connectSQL(); // kết nối cơ sở dữ liệu
updateData(view());
// gọi hàm view để truy suất dữ liệu sau đó truyền cho hàm updateData
//để đưa dữ liệu vào tableModel và hiện lên Jtable trong Frame
}
public void updateData(ResultSet result){
try {
while(result.next()){ // nếu còn đọc tiếp được một dòng dữ liệu

ThS. Dương Thành Phết http://www.thayphet.net Trang 140


String rows[] = new String[4];
rows[0] = result.getString(1); // lấy dữ liệu tại cột số 1 (ứng với mã sp)
rows[1] = result.getString(2);
rows[2] = result.getString(3);
rows[3] = result.getString(4);
tableModel.addRow(rows);
// đưa dòng dữ liệu vào tableModel để hiện thị lên jtable
//mỗi lần có sự thay đổi dữ liệu ở tableModel thì Jtable
//sẽ tự động update lại trên frame
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void initComponent(){
this.setSize(400, 200);
// Đưa jtable vào trong thanh cuộn (khi dữ liệu quá nhiều dòng
// sẽ có thanh cuộn ngang và doc để xem dữ liệu)
JScrollPane scroll = JTable.createScrollPaneForTable(jtable);
this.add(scroll); // Đưa thanh cuộn vào Frame (hiện thanh cuộn trên frame)
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
}
public void connectSQL() throws SQLException{
try {
String userName ="sa";
String password = "123456";
String url = "jdbc:sqlserver://localhost:1433;databaseName=QLSanpham;";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connect = java.sql.DriverManager.getConnection(url,userName,password);
System.out.println ("Da ket noi CSDL");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public ResultSet view(){
ResultSet result = null;
String sql = "SELECT * FROM Sanpham";
try {
Statement statement = (Statement) connect.createStatement();
return statement.executeQuery(sql);
} catch (SQLException e) {

ThS. Dương Thành Phết http://www.thayphet.net Trang 141


e.printStackTrace();
}
return result;
}
public static void main(String[] args) throws SQLException {
new QLSanpham();
}
}

Hình 5.12 Kết quả minh họa

ThS. Dương Thành Phết http://www.thayphet.net Trang 142


TÓM TẮT
Bài học này trình bày cách thức truy xuất và thao tác cơ sở dữ liệu sử dụng
JDBC với các bước như sau:
- Nạp trình điều khiển.
- Thiết lập kết nối.
- Tạo đối tượng Statement
- Thực hiện vấn tin và xử lý kết quả trả về
- Thực hiện các lệnh them, xóa, sửa dữ liệu
- Đóng kết nối
----------Hết--------

ThS. Dương Thành Phết http://www.thayphet.net Trang 143

You might also like