Chuyển đến nội dung chính

Statement, ResultSet, PrepareStatement trong Java

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();
}
}

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...