Các thao tác cơ bản trên CSDL

Các thao tác truy vấn CSDL chỉ có thể được thực hiện sau khi đã có đối tượng Connection, được tạo ra từ quá trình kết nối vào CSDL. Chúng ta sử dụng đối tượng của lớp Connection để tạo ra các thể hiện của lớp java.sql.Statement. Sau khi tạo ra các đối tượng của lớp Statement chúng ta có thể thực hiện các thao tác trong các đối tượng statement trên connection tương ứng.

Nội dung trong một statement chính là các câu SQL. Câu lệnh SQL trong các statement chỉ được thực hiện khi chúng ta gửi chúng đến CSDL. Nếu câu lện SQL là một câu truy vấn nội dung thì kết quả trả về sẽ là một thể    hiện của  lớp java.sql.ResultSet, ngược lại (các câu lệnh thay đổi nội dung CSDL) sẽ trả về kết quả là mộ số nguyên. Các đối tượng của lớp ResultSet cho phép chúng ta truy cập đến kết quả trả về của các câu truy vấn.

1. Các lớp cơ bản

■ java.sql.Statement

Statement là một trong 3 lớp JDBC cơ bản dùng để thể hiện một câu lệnh SQL. Mọi thao tác trên CSDL được thực hiện thông qua 3 phương thức của lớp Statement. Phương thức executeQueryO nhận vào 1 tham số là chuỗi nội dung câu lện SQL và trả về 1 đối tượng kiểu ResultSet. Phương thức này được sử dụng trong các trường hợp câu lệnh SQL có trả về các kết quả trong CSDL.

Phương thức executeUpdate() cũng nhận vào 1 tham số là chuỗi nội dung câu lệnh SQL. Tuy nhiện phương thức này chỉ sử dụng được đối với các cây lệnh cập nhật nội dung CSDL. Kết quả trả về là số dòng bị tác động bỡi câu lệnh SQL.

Phương thức execute() là trường hợp tổng quát của 2 phương thức trên. Phương thức nhận vào chuỗi nội dung câu lệnh SQL. Câu lệnh SQL có thể là câu lệnh truy vấn hoặc cập nhật. Nếu kết quả của câu lệnh là các dòng trong CSDL thì phương thức trả về giá trị true, ngược lại trả về giá trị false. Trong trường hợp giá trị true, sau đó chúng ta có thể dùng phương thức getResultSet() để lấy các dòng kết quả trả về.

■ java.sql.ResultSet

Đối tượng resultset là các dòng dữ liệu trả về của câu lệnh truy vấn CSDL. Lớp này cung cấp các phương thức để rút trích các     cột trong  từng  dòng  kết  quả  trả  về. Tất

cả các phương thức này đều có dạng:

type getType(int | String)

Trong đó tham số có thể là số thứ tự của cột hoặc tên cột cần lấy nội dung.

Tại 1 thời điểm chúng ta chỉ có thể thao tác trên 1 dòng của resultset. Để thao tác trên dòng tiếp theo chúng ta sử dụng phương thức next(). Phương thức trả về giá trị true trong trường hợp có dòng tiếp theo, ngược lại trả về giá trị false.

2. Ví dụ truy vấn CSDL

public class Movie{

private String movieTitle, category, mediaFormat; private int number;

public Movie(int n, String title, String cat, String format){ number = n; movieTitle = title; category = cat; mediaFormat = format;

}

public int getNumber(){return number;} public String getMovieTitle(){return movieTitle;} public String getCategory(){return category;} public void setCategory(String c){category = c;} public String getFormat(){return mediaFormat;} public void setFormat(Stringf) {mediaFormat = f;} public String toString(){

return number + “: ” + movieTitle + ” – ” + category + ”         + mediaFormat;

}

}

import java.sql. *;

public class MovieDatabase{ private Connection connection;

private PreparedStatement findByNumber, updateCategory; private CallableStatementfindByCategory;

public MovieDatabase(Connection connection) throws

SQLException{

this.connection = connection;

}

public void showAllMovies(){

try{

Statement selectAll = connection.createStatement(); String sql = “SELECT * FROM Movies”;

ResultSet results = selectAll.executeQuery(sql); while(results. next()) {

int number = results.getlnt(l);

String title = results.getString(“title”);

String category = results.getString(3);

String format = results.getString(4);

Movie movie = new Movie(number, title, category,

format);

System. out.println(movie. toString());

}

results.close(); selectAll. close();

}

catch(SQLException e){
e.printStackTrace ();

}

}

}

import java.sql. *;

public class ShowMovies{

public static void main(String [] args){

String url = “jdbc:odbc:” + args[0];

try{

Class.forName (“sun.jdbc. odbc. JdbcOdbcDriver “);

Connection connection = DriverManager.getConnection(url);

MovieDatabase db        =          new MovieDatabase (connection);

db.showA llMovies();

connection. close ();

}

catch(Exception e){

}

}

}

3. Ví dụ cập nhật CSDL

Phương thức addMovie() bên dưới được thêm vào lớp MovieDatabase đã định nghĩa ở ví dụ trên.

public class MovieDatabase{

public void addMovie(Movie movie){

System.out.println(“Addingmovie: “ + movie.toString());

try{

Statement addMovie = connection.createStatement();

String sql = “INSERTINTO Movies VALUES(“

+ movie.getNumber() + “, “

+ “‘“ + movie.getMovieTitle() + “‘, “

+ “‘“ + movie.getCategory() + “‘, “

+ “‘“ + movie.getFormat() + “‘) ”;

System.out.println(“Executingstatement: “ + sql);

addMovie. execute Update(sql);

addMovie. close ();

System.out.println(“Movie added successfully!”);

}

catch(SQLException e){
e.printStackTrace ();

}

}

}

import java.sql. *;

public class AddMovies{

public static void main(String [] args){

String url = “jdbc:odbc: ” + args[0];

 

System.out.println(“Attempting to connect to “ + url);

try{

System.out.println(“Loading the driver… ”);

Class.forName(“sun.jdbc. odbc.JdbcOdbcDriver ”);

System.out.println(“Establishing a connection… ”);

Connection connection = DriverManager.getConnection(url);

System.out.println(“Connect to “+ connection.getCatalog() + “ a success!”);

MovieDatabase db        =          new MovieDatabase (connection);

Movie [] movies = new Movie[6];

movies[0] = new Movie(1, “Star Wars: A New Hope ”, “Science Fiction ”, “D VD ”);

movies[1] = newMovie(2, “Citizen Kane”, “Drama”, “VHS”);

movies[2] = new Movie(3, “The Jungle Book”, “Children”, “VHS”);

movies[3] = new Movie(4, “Dumb and Dumber”, “Comedy”, “DVD”);

movies[4] = new Movie(5, “Star Wars: Attack of the Clones”, “Science Fiction”, “DVD”);

movies[5] = newMovie(6, “Toy Story”, “Children”, “DVD”);

for(int i = 0; i < movies.length; i++){ db. addMovie(movies[i]);

}

System.out.println(“Closing the connection… ”); connection. close ();

}

catch(Exception e){ e.printStackTrace ();

}

}

}