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(“logo ndb”);
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(“logo ndb”);
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(“logo ndb”);
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(“logo ndb”);
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 getXX=(“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_INSENSI TIVE,
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();
}
}
}