Lập trình cơ bản với Java Tác giả: PGS.TS Trần Văn Lăng, Ths. Chu Nguyên Hoàng Minh Giúp các bạn tiếp cần gần hơn với bộ môn lập trình để trở thành một Lập trình viên suất sắc Lập trình cơ bản với Java Tác giả: PGS.TS Trần Văn Lăng, Ths. Chu Nguyên Hoàng Minh Giúp các bạn tiếp cần gần hơn với bộ môn lập trình để trở thành một Lập trình viên suất sắc
Trang 1Bảng phân chia thời lượng:
Trang 2243
6.1 iới hiệ n
Hầu h hương ình m y ính h n này đ u ít nhiều n qu n đ n vi c truy xuất hông n ong ơ sở dữ li u Chính vì th nên các thao tác h trợ lập ình ơ sở dữ
li u là chứ năng không hể thi u c a các ngôn ngữ lập trình hi n đạ , ong đó ó
C API à hư n chứa các l p và giao di n h trợ lập trình viên Java k t n i và truy cập đ n các h ơ sở dữ li u
Phiên b n JDBC API m i nhất hi n nay là 3.0, là một thành phần trong J2SE, nằm ong 2 gó hư n:
java.sql: chứa các l p à g o d n ơ sở c a JDBC API
javax.sql: chứa các l p và giao di n mở rộng
JDBC API cung cấp ơ h cho phép mộ hương ình t bằng Java có kh năng độc lập v i các h ơ sở dữ li u, có kh năng uy ập đ n các h ơ sở dữ li u khác nhau
mà không cần vi t lạ hương ình C đơn g n hóa vi c tạo và thi hành các câu truy vấn Q ong hương ình
6.2 iến c n 2] trang 629)
Ki n trúc c a c C ương ự như k n trúc ODBC do Microsoft xây dựng Theo
ki n này h o n qu n đ n ơ sở dữ li u ong hương ình được thực hi n hông qu C API u đó C API sẽ truyền các yêu cầu c hương trình
đ n bộ qu n ình đ ều khiển JDBC, là bộ phận có nhi m vụ lựa chọn ình đ ều khiển thích hợp để có thể làm vi c v ơ sở dữ li u cụ thể mà hương ình mu n k t n i Như ậy ki n trúc c a JDBC gồm 2 tầng: tầng đầu tiên là các JDBC API, có nhi m
vụ chuyển các câu l nh SQL cho bộ qu n ình đ ều khiển JDBC; tầng thứ 2 là các JDBC Driver API, thực hi n nhi m vụ li n h v ình đ ều khiển c a h qu n trỉ ơ sở dữ
li u cụ thể
Trang 3244 Hình n dư i minh họa các l p và giao di n ơ n trong JDBC API
Trang 4245
6.3 Các khái niệm cơ bản ([1] trang 282, [2] trang 632)
6.3.1 JDBC Driver
Để có thể ti n hành truy cập đ n các h qu n trị ơ sở dữ li u s dụng kỹ thuật JDBC, chúng ta cần ph ò ình đ ều khiển JDBC c a h qu n trị CSDL mà chúng ta
đ ng s dụng T ình đ ều khiển C à đoạn hương ình, do hính nhà ây dựng h
qu n trị CSDL hoặc do nhà cung ứng thứ ba cung cấp, có kh năng y u ầu h qu n trị CSDL cụ thể thực hi n các câu l nh SQL
nh s h ình đ ều khiển JDBC cho các h qu n trị CSDL khá nh u được
http://industry.java.sun.com/products/jdbc/drivers
C ình đ ều khiển C được phân làm 04 loại khác nhau:
Loại 1: có tên gọ à dge e T ình đ ều khiển loại này k t n i v i các h
CSDL thông qua cầu n O C Đây hính à ình đ ều khiển được s dụng phổ
bi n nhất trong những ngày đầu Java xuất hi n Tuy nh n, ngày n y ình đ ều khiển loại này không còn phổ bi n do có nhiều hạn ch T ình đ ều khiển loại này uôn được cung cấp kèm trong bộ J2SE v i tên: sun.jdbc.odbc.JdbcOdbcDriver
Loại 2: Có tên gọ à N e API e T ình đ ều khiển loại này sẽ chuyển các
lời gọi c C API s ng hư n hàm (API) ương ứng v i từng h CSDL cụ thể T ình đ ều khi n loạ này hường chỉ do nhà xây dựng h CSDL cung cấp Đểcó thề h hành hương ình mã nh để làm vi c v i h CSDL cụ thể cần
ph được cung cấp đ kèm hương ình
Trang 5246
Loại 3: có tên gọi là JDBC-Ne e T ình đ ều khiển loại này sẽchuyển các lời
gọi JDBC API sang một dạng chuẩn độc lập v i các h C , à s u được chuyển sang lời gọi c a h CSDL cụ thể bỡ 1 hương ình ung g n T ình đ ều khiển
c a các nhà cung ứng thứ 3 hường thuộc loại này Lợi th c ình đ ều khiển loại này là không cần cung cấp mã l nh kèm theo và có thể s dụng cùng một trình
đ ều khiển để truy cập đ n nhiều h CSDL khác nhau
Loại 4: Có tên gọ à N e P o o o e T ình đ ều khiển loại này chuyển các
lời gọi JDBC API sang mã l nh c a h CSDL cụ thể Đây à ình đ ều khiển thần Ja , ó nghĩ à không ần ph i có mã l nh c a h CSDL cụ thể khi thi hành hương ình
6.3.2 JDBC URL
Để có thể k t n i v i CSDL, chúng ta cần định nguồn dữ li u cùng v i các thông s n qu n dư i dạng 1 UR như s u: jd :<su p o o o >:<dsn>:<o hers>
T ong đó:
<su p o o o >: đượ dùng để định ình đ ều khiển để k t n i v i CSDL
Trang 66.4.1 Đăn ký ình điều khiển
T ình đ ều khiển C được nạp khi mã bytecode c nó được nạp vào JVM Một
h đơn g n để thực hi n công vi c này là thự h phương hức
C ss fo N me(“< C e >”)
Ví dụ: để nạp ình đ ều khiển s dụng cầu n i ODBC do Sun cung cấp, chúng ta s dụng
câu l nh s u C ss fo N me(“sun jd od d Od e ”)
6.4.2 Thực hiện kết nối
u kh đã nạp trình đ ều khiển JDBC, vi c k t n i v C được thực hi n v i
mộ ong phương hức sau trong l p DriverManager:
public static Connection getConnection(String url) throws SQLException: thực
hi n k t n i v C được yêu cầu Bộ qu n ình đ ều khiển sẽ tự động lựa chọn ình đ ều khiển phù hợp trong s ình đ ều khiển đã được nạp
public static Connection getConnection(String url, String user, String pass)throws SQLException: ti n hành k t n i t i CSDL v i tài kho n user và mật mã pass
public static Connection getConnection(String url, Properties info) throws
Q E ep on: ương ự h phương hức trên ngoài ra cung cấp thêm các thông
n qu định thuộc tính k t n hông qu đ ượng c a l p Properties
Trang 7248
K t qu tr về c phương hức trên là mộ đ ượng c a l p
j sq Conne on đượ dùng để đại di n cho k t n đ n CSDL
6.4.3 Ví dụ
Trong phần ví dụ này chúng ta sẽ tìm hi u h kh nh u để k t n i v i tập tin CSDl Access movies.mdb có một b ng tên Movies B ng này gồm các cột number, title, category và fomat
Để có thể ti n hành k t n i v i Microsoft Access thông qua cầu n i ODBC sau khi
đã ạo tập tin CSDL movies.mdb, chúng ta cần ph i tạo Data Source Name cho CSDL bằng cách vào Control Panel và chọn ODBC Data Source
Ti p theo nhấn vào nút Add, bạn sẽ thấy hiển thị d nh s h ình đ ều khiển CSDL hi n có
Trang 9public class TestConnection{
public static void main(String args[]){
Connection connection = null;
if(args.length != 1){
System.out.println("Syntax: java TestConnection " + "DSN");
return;
} try { // load driver
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Loading the driver ");
}catch(Exception e){//problem load driver,class not exist
e.printStackTrace( );
return;
} try{
Trang 10} }
}
Sau khi biên dị h đoạn hương ình n, h ng ó hể thực hi n k t n i v i CSDL bằng cách thực thi câu l nh: java TestConnection moviesDSN
6.5 iể ữ liệ kiể ữ liệ
Trong quá trình thao tác v i CSDL, chúng ta sẽ gặp ph i vấn đề chuyển đổi giữa kiểu dữ li u trong CSDL sang kiểu dữ li u Java h trợ à ngược lai Vi c chuyển đổi này được thực hi n như ong 2 ng sau
Trang 11B ng chuyển đổi từ kiểu dữ li u SQL sang Java
Trang 12c a l p j sq Resu e , ngược lại (các câu l nh h y đổi nội dung CSDL) sẽ tr về k t
qu là mộ s nguy n C đ ượ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
Trang 13254
6.6.1 Các lớp cơ bản
java.sql.Statement
Statement là một trong 3 l p C ơ n dùng để thể hi n một câu l nh SQL Mọi
h o n C được thực hi n hông qu 3 phương hức c a l p Statemen Phương thức executeQuery() nhận vào 1 tham s là chu i nội dung câu l n SQL và tr về 1 đ i ượng kiểu Resu e Phương hứ này được s dụng ong ường hợp câu l nh SQL
có tr về các k t qu trong CSDL
Phương hứ e e u eUpd e() ũng nhận vào 1 tham s là chu i nội dung câu l nh SQL Tuy nhi n phương hức này chỉ s dụng đượ đ 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ị động bỡi câu l nh SQL
Phương hứ e e u e() à ường hợp tổng quát c 2 phương hức tr n Phương hứ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 à dòng ong C hì phương hức tr về giá trị
ue, ngược lại tr về giá trị f se T ong ường hợp giá trị true, s u đó h ng ó hể dùng phương hứ ge Resu e () để lấy các dòng k t qu tr về
java.sql.ResultSet
Đ ượ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 phương hứ để 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 hứ này đều có dạng:
type getType(int | String)
T ong đó h m 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ờ đ ểm chúng ta chỉ có thể thao tác trên 1 dòng c esu se Để thao tác trên dòng ti p theo chúng ta s dụng phương hứ ne () Phương hức tr về giá trị true ong ường hợp có dòng ti p heo, ngược lại tr về giá trị false
6.6.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){
Trang 14public String toString(){
return number + ": " + movieTitle + " - " + category + " " + mediaFormat;
}
}
Trang 15256
import java.sql.*;
public class MovieDatabase{
private Connection connection;
private PreparedStatement findByNumber, updateCategory;
private CallableStatement findByCategory;
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.getInt(1);
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();
} }
}
Trang 16257
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);
Statement addMovie = connection.createStatement();
ng sq = “IN ERT INTO Mo es VA UE (“ + mov e ge Num e () + “, “
+ “‘“ + mo e ge Mo eT e() + “‘, “ + “‘“ + mo e ge C ego y() +
“‘, “
Trang 17}
import java.sql.*;
public class AddMovies{
public static void main(String [] args){
Connection connection = DriverManager.getConnection(url);
System ou p n n(“Conne o “ + onne on ge C og() + “
su ess!”);
MovieDatabase db = new MovieDatabase(connection);
Movie [] movies = new Movie[6];
mo es[0] = new Mo e(1, “ W s: A New Hope”,“ en e
F on”, “ V ”);
movies[1] = new Mo e(2, “C zen ne”, “ m ”, “VH ”);
mo es[2] = new Mo e(3, “The ung e ook”, “Ch d en”, “VH ”);
Trang 18}
Trang 19260
i ập
Để x được dữ li u từ mộ C , hương ình ph i thực hi n lần ượt theo các
ư c sau:
Gọi hàm getConnection() để nhận đượ đ ượng c a l p Connection;
Tạo ra mộ đ ượng c a l p Statement;
Chuẩn bị mộ đ i ượng để x lý l nh c a SQL và truy vấn vào dữ li u theo yêu
cầu; Câu l nh SQL có thể thực hi n trực ti p hông qu đ ượng c a Statement hoặc có thể được biên dịch dị h hông qu đ ượng c a PreparedStatement hay gọi một th tụ để ưu ại thông qua CallableStatement
Khi hàm executeQuery() được thực hi n, thì k t qu được cho lạ à đ ượng c a l p ResualtSet bao gồm các dòng dữ li u và có thể s dụng hàm next() để định các dữ li u
theo yêu cầu
Câu 1 Tạo ơ sở dữ li u đơn g n trong MS Access và SQL Server 2000 bao gồm 2 b ng
như s u:
SanPham(MaSP, TenSP, NhaSanXuat, MaLoaiSP)
LoaiSanPham(MaLoaiSP, TenLoaiSP)
Câu 2 Vi hương ình ho phép h ển thị MaSP, TenSP và TenLoaiSP (trong
console và trong giao di n)
Câu 3 Cho phép nhập vào dữ li u vào b ng LoaiSP
Thư n dùng để k t n i vào SQL Server gồm các file: msbase.jar, mssqlserver.jar, msutil.jar
ưu ần kh o hư n ư c khi biên dịch
Câu 4 Thi t k CSDL và vi hương ình qu n í bán hàng hóa theo các mô t sau:
NHANVIEN: m i nhân viên có một mã nhân viên duy nhất, họ n, ngày h ng năm s nh, địa chỉ s đ n thoại và gi i tính
Trang 20261
SANPHAM: m i một s n phẩm có một mã s n phẩm để phân bi t v i s n phẩm khác, một tên s n phẩm, đơn ị ính à g (đơn g > 0)
HOADON: m i một hóa đơn ó mộ mã hó đơn duy nhất, mã nhân viên lập hó đơn, loạ hó đơn (nhập, xuất, chuyển hay tr ), ngày lập hó đơn, ngày g o nhận, diễn gi i (ngày lập <= ngày hi n hành)
CHITIETHOADON: m i chi ti hó đơn ho t 1 s n phẩm được nhập, xuất, chuyển hay tr c a mộ hó đơn nào i s ượng, đơn g n
Câu 5 Vi hương ình ằng ngôn ngữ lập trình Java k t n i vào CSDL tạo trên Câu 6 Chương ình ho phép h o h m, ó , s a, xem dữ li u ở các b ng Câu 7 Thi t k form ở dạng master/detail hiển thị thông tin về hó đơn à h t
TenTG Tên tác gi Varchar
DCLienHe Địa chỉ liên h Varchar
TuKhoa Từ khóa mô t sách Varchar
Trang 21NgayMuon Ngày mượn sách Datetime
NgayPhaiTra Ngày ph i sách Datetime
Hãy vi hương ình j :
Trang 22263
Câu 9 S dụng cầu n i JDBC-ODBC k t n đ n CSDL nói trên bằng c hai cách:
s dụng DNS và File DNS
Câu 10 S dụng đ ượng emen để tạo ra các b ng trên
Câu 11 Chèn một s mẫu tin vào các b ng
Câu 12 Lấy về tất c các mẫu tin c a b ng sách và in ra màn hình
Câu 13 Vi hương ình ó g o d n đồ họa cho phép xem các mẫu tin c a b ng
GiaoVien(MaGV, HoTen, DiaChi, MaHV)
KetQua(MaSv, MaDT, Diem)
Trang 23264
DeTai: B ng ưu d nh s h đề tài
KetQua: B ng ưu d nh k t qu b o v c đề tài
G oV en: ưu d nh mục các giáo viên
nhV en_ eT : ưu đề tài mà sinh viên thực hi n
G oV en_ eT : ưu đề à mà s nh mà g o n hư ng dẫn
Một sinh viên có thể không tham gia hoặc tham gia nhiều đề tài
Một giáo viên có thể không hư ng dẫn hoặ hư ng dẫn nhiều đề tài
M i sinh viên b o v đề tài có một k t qu riêng bi t
M i giáo viên chỉ có một học vị
Hãy vi hương ình j hực hi n các yêu cầu sau:
Câu 16 S dụng ình điều khiển cho SQL Server c M osof để k t n i vào
Sql Server
Câu 17 S dụng đ ượng emen để tạo các b ng trên và các quan h giữa
chúng
Câu 18 Vi t một ứng dụng có giao di n đồ họa và s dụng đ ượng
P ep ed eme để nhập một s mẫu tin vào các b ng
Vi t các th tụ ưu ữ sau:
Trang 24265
Câu 19 Vi t th tụ ưu ữ có tham s là xâu ký tự, th tục này sẽ tr về đề tài có
mã o ương ứng tham s c a th tụ đề à đó, hông n gồm: T n đề tài, tên
s nh n h m g , n g o n hư ng dẫn
Câu 20 Vi t th tụ ưu ữ có tham s là một s nguyên, th tục này sẽ tr về các
sinh viên có k t qu b o v đề tài nhỏ hơn g ị c a tham s c a th tục
Câu 21 Vi t th tụ ưu ữ có tham s là một xâu kí tự, th tục này sẽ tr về s
ượng đề à hư ng dẫn c a giáo viên có mã bằng tham s c a th tục
Câu 22 Vi t th tụ ưu ữ có tham s là một xâu kí tự, th tục này sẽ tr về s
ượng s nh n h m g đề tài có mã bằng tham s c a th tục
Câu 23 Hãy thêm cột XepLoai vào b ng KetQua và vi t th tụ ưu ữ để để cập
nhập x p loại cho cột x p loại theo công thức:
Diem<5: Y u
Diem>=5 và Diem<7 : Trung bình
Diem>=7 và Diem<8: Khá
Diem>8: Giỏi