
Su tm bi:
www.daihoc.com.vn
15
}
catch(SQLException e){
e.printStackTrace();
}
}
}
Sử dụng một vòng lặp để thiết lập các giá trị
Ta có thể sử dụng vòng lặp để thiết lập các giá trị cho các tham số đầu vào.
PreparedStatement updateSales;
String updateString = "update COFFEES " +
"set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);
int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso",
"Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1, salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
}
Các giá trị trả về của phương thức executeUpdate
Phương thức executeQuery trả về một đối tượng ResultSet chứa các kết quả của truy
vấn được gửi tới hệ quản trị cơ sở dữ liệu, giá trị trả về khi xử lý phương thức
executeUpdate là một số nguyên int chỉ ra số hàng trong bảng đã được cập nhật.
updateSales.setInt(1, 50);
updateSales.setString(2, "Espresso");
int n = updateSales.executeUpdate();
// n = 1 because one row had a change in it
8. Sử dụng các giao tác
Quản lý giao tác
Một giao tác là một tập hợp một hoặc nhiều lệnh được xử lý cùng với nhau như
một chỉnh thể thống nhất (đơn vị). Khi xử lý một giao tác hoặc tất cả các lệnh được xử lý
hoặc không lệnh nào được xử lý. Nhiều trường hợp ta không muốn một lệnh có hiệu lực
ngay nếu lệnh khác không thành công.
Điều này có thể được thực hiện nhờ phương thức setAutoCommit() của đối tượng
Connection. Phương thức này nhận một giá trị boolean làm tham số..
Ngăn chế độ Auto-commit
Khi một liên kết được tạo ra, thì liên kết đó ở chế độ auto-commit.
Mỗi lệnh SQL được xem như là một giao tác và sẽ được tự động hoàn thành ngay
khi nó được xử lý.
Cách để cho phép hai hoặc nhiều lệnh được nhóm cùng với nhau thành một giao
tác là cấm chế độ auto-commit.
Ví dụ:
con.setAutoCommit(false);
Xác nhận hoàn thành một giao tác
Mỗi khi chế độ auto-commit bị cấm, không có lệnh SQL nào sẽ được xác nhận hoàn
thành cho tới khi ta gọi phương thức commit().

Su tm bi:
www.daihoc.com.vn
16
Ta có thể thực hiện điều này bằng cách gọi phương thức commit() của các đối tượng liên
kết.
Nếu ta cố gắng xử lý một hay nhiều lệnh trong một giao tác và nhận được một ngoại lệ
SQLException, ta cần gọi phương thức rollback() để hủy bỏ giao tác và khởi động lại toàn
bộ giao tác.
con.setAutoCommit(false);
PreparedStatement updateName =null;
String query = null;
Query="UPDATE license SET name = ? WHERE id = 126"
updateName= con.prepareStatement(query);
updateName.setString(1, name);
updateName.executeUpdate();
PreparedStatement updateSex = null;
query = "UPDATE test SET test_value =?”
updateSex = con.prepareStatement(query);
updateSex.setString(1, "Male");
updateSex.executeUpdate();
con.commit();
con.setAutoCommit(true);
Ví dụ:
import java.sql.*;
public class PreparedUpdate{
public static void main(String args[]) throws Exception{
int empid;
int rows=0;
String LastName;
String FirstName;
String query = "insert into EMP " +"(EmployeeID,LASTNAME,FIRSTNAME) "
+"values " +"(?,?, ?)";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con =DriverManager.getConnection ("jdbc:odbc:MyData");
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setInt(1,Integer.parseInt(args[0]));
pstmt.setString(2,args[1]);
pstmt.setString(3,args[2]);
rows = pstmt.executeUpdate( );
pstmt.close( );

Su tm bi:
www.daihoc.com.vn
17
pstmt = null;
System.out.println(rows + " rows inserted");
System.out.println("");
con.commit();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
catch(SQLException e){
e.printStackTrace();
}
}
}
8. Sử dụng các giao tác
Sau đó thực hiện các lệnh: Các chương trình Java chỉ thực hiện được các lệnh trên
CSDL thông qua đối tượng Statement.
Các câu lệnh SQL có thể được thực hiện tức thì thông qua đối tượng Statement, có thể
là một câu lệnh biên dịch trước (đối tượng PreparedStatement) hay có thể là một lệnh
gọi các thủ tục cài sẵn (Stored Procedure) trong CSDL (đối tượng CallableStatement).
Các câu lệnh SQL có thể được thực hiện thông qua phương thức executeQuery() – kết
quả là một đối tượng ResultSet, hay phương thức executeUpdate() – kết quả là một số
nguyên cho biết tổng số các record chịu ảnh hưởng của câu lệnh vừa thực hiện (thường
là các câu lệnh sửa đổi dữ liệu Update - Delete).
Trong trường hợp có sử dụng trình quản lý transaction, các phương thức rollback() được
dùng để phục hồi trạng thái trước đó và commit() đế xác nhận việc thực hiện lệnh.
Để chấm dứt cần xóa kết nối, xóa các đối tượng để giải phóng tài nguyên của hệ thống.
.

Su tm bi:
www.daihoc.com.vn
Chương 10
TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG
LẬP TRÌNH MẠNG
1. Tuần tự hóa đối tượng
1.1. Khái niệm
Tuần tự hóa là quá trình chuyển tập hợp các thể hiện đối tượng chứa
các tham chiếu tới các đối tượng khác thành một luồng byte tuyến tính,
luồng này có thể được gửi đi qua một Socket, được lưu vào tệp tin hoặc
được xử lý dưới dạng một luồng dữ liệu. Tuần tự hóa là cơ chế được sử
dụng bởi RMI để truyền các đối tượng giữa các máy ảo JVM hoặc dưới
dạng các tham số trong lời gọi phương thức từ client tới server hoặc là các
giá trị trả về từ một lời gọi phương thức.
Tuần tự hóa là một cơ chế đã được xây dựng và được đưa vào các
lớp thư viện Java căn bản để chuyển một đồ thị các đối tượng thành các
luồng dữ liệu. Luồng dữ liệu này sau đó có thể được xử lý bằng cách lập
trình và ta có thể tạo lại các bản sao của đối tượng ban đầu nhờ quá trình
ngược lại được gọi là giải tuần tự hóa.
Tuần tự hóa có ba mục đích chính sau
Cơ chế ổn định: Nếu luồng được sử dụng là FileOuputStream, thì dữ
liệu sẽ được tự động ghi vào tệp.
Cơ chế sao chép: Nếu luồng được sử dụng là ByteArrayObjectOuput,
thì dữ liệu sẽ được ghi vào một mảng byte trong bộ nhớ. Mảng byte
này sau đó có thể được sử dụng để tạo ra các bản sao của các đối
tượng ban đầu.
Nếu luồng đang được sử dụng xuất phát từ một Socket thì dữ liệu sẽ
được tự động gửi đi tới Socket nhận, khi đó một chương trình khác
sẽ quyết định phải làm gì đối với dữ liệu nhận được.
Một điều quan trọng khác cần chú ý là việc sử dụng tuần tự hóa độc lập
với thuật toán tuần tự hóa.
1.2. Khả tuần tự (Serializable)
Chỉ có đối tượng thực thi giao diện Serializable mới có thể được ghi
lại và được phục hồi bởi các tiện ích tuần tự hóa. Giao diện Serializable
không định nghĩa các thành phần. Nếu một lớp thực thi giao diện
Serializable thì lớp đó có khả năng tuần tự hóa. Một lớp là khả tuần tự thì
tất cả các lớp con của nó cũng là khả tuần tự.
Giao diện ObjectOutput thừa kế từ giao diện DataOutput và hỗ trợ tuần
tự hóa đối tượng. Lớp ObjectOuputStream là lớp con của lớp ObjectOuput
và thực thi giao diện ObjectOutput. Nó có nhiệm vụ ghi các đối tượng vào
một luồng bằng cách sử dụng phương thức writeObject(Object obj).

Su tm bi:
www.daihoc.com.vn
ObjectInput thừa kế giao diện DataInput và định nghĩa các phương thức.
Nó hỗ trợ cho việc tuần tự hóa đối tượng. Phương thức readObject() được
gọi để giải tuần tự hóa một đối tượng.
ObjectInputStream được định nghĩa trong gói java.io là một luồng cài đặt
cơ chế đọc trạng thái của luồng nhập đối tượng.
Một vấn đề đặt ra là: liệu mọi lớp trong Java đều có khả năng tuần tự
hóa? Câu trả lời là không, bởi vì không cần thiết hoặc sẽ không có ý nghĩa
khi tuần tự hóa một số lớp nhất định. Để xác định xem một lớp có khả tuần
tự hay không ta sử dụng công cụ serialver có trong bộ JDK.
Hình 1
Hình 2
Với kết quả trên cho ta thấy lớp này là khả tuần tự. Nhưng không phải mọi
lớp trong Java đều khả tuần tự chẳng hạn ta thử kiểm tra với lớp
java.net.Socket
Hình 3
Khi đó kết quả hiển thị là Class java.net.Socket is not Serializable (Lớp
java.net.Socket không khả tuần tự).
1.3. Xây dựng lớp một lớp khả tuần tự
Đối với các lớp do người lập trình định nghĩa ta phải khai báo để báo
hiệu cho hệ thống biết nó có khả tuần tự hay không. Một lớp do người dùng
định nghĩa có khả năng tuần tự hóa khi lớp đó thực thi giao diện
Serializable. Trong ví dụ dưới đây ta định nghĩa lớp Point để lớp này có khả
năng tuần tự hóa.
public class Point implements Serializable
{
private double x,y;