CHƯƠNG IV- GIỚI THIỆU VỀ NGÔN NGỮ LẬP TRÌNH JAVA
III- Cơ chế truyền nhận trong Java
3. Cơ Sở Dữ Liệu
3.4. Sử dụng JDBC để truy xuất Cơ sở dữ liệu
Trước khi có thể truy xuất tới cơ sở dữ liệu ODBC dưới nền Window95/98/Me hay WinNT/Win2000 Server, ta phải đăng ký nó với một bảng điều khiển driver ODBC.
Dưới nền Window95/98/Me, đó là một icon ODBC trong chương trình Control Panel.
Còn trong WinNT, nó được tìm thấy trong Start menu.
Nhấp đôi chuột vào icon ODBC, sau đó chọn mục "Add".
Sau đó chọn một driver cơ sở dữ liệu (ở đây ta chọn Microsoft dBase Driver) và nhấp vào "OK". Ðánh tên cơ sở dữ liệu vào Data Source Name và Description, rồi chọn mục
"Select" để cập nhật và chọn nó.
a. Kết nối tới Cơ sở dữ liệu :
Tất cả các đối tượng cơ sở dữ liệu và phương thức được đặt trong gói java.sql, và do đó ta phải import gói java.sql.* vào chương trình đang sử dụng JDBC. Ðể kết nối tới một cơ sở dữ liệu ODBC, trước tiên ta phải load cầu nối driver JDBC_ODBC:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Phát biểu này sẽ load driver và tạo ra một đối tượng của lớp đó. Sau đó, để kết nối tới một phần của cơ sở dữ liệu, ta phải tạo ra một đối tượng của lớp Connection, và cơ sở dữ liệu sử dụng cú pháp URL:
String url="jdbc:odbc:Subname");
Connection conn=create.getConnection(url);
Subname chính là Data Source name mà ta đăng ký trong Control Panel.Cú pháp URL có thể biến đổi hoàn toàn cho các kiểu khác của cơ sở dữ liệu.
jdbc.Subprotocol.Subname
Những chữ đầu tiên minh họa cho protocol kết nối và luôn luôn là jdbc.
Subprotocol ở đây được ghi rõ là odbc. Nó định nghĩa cơ chế kết nối cho một lớp cơ sở dữ liệu. Nếu ta kết nối tới một Server cơ sở dữ liệu trên một máy khác, ta có thể ghi rõ tên máy, Subprotocol đó cũng như UserName, password như một phần của chuỗi Connection.
b. Truy xuất Cơ sở dữ liệu trong java :
Một khi đã kết nối được tới cơ sở dữ liệu, điều ta đòi hỏi là các thông tin tên bảng, tên cột, nội dung của các cột, và ta có thể chạy SQL mà không cần phải truy vấn đến cơ sở dữ liệu, hoặc thêm vào, hoặc sửa chữa lại nội dung của nó. Các đối tượng mà ta có thể sử dụng để thu được các thông tin từ cơ sở dữ liệu là:
♦DatabaseMetaData: thông tin đầy đủ về cơ sở dữ liệu: tên bảng, tên các chỉ mục của bảng, tên sản phẩm cơ sở dữ liệu, version và các hoạt động được cung cấp bởi cơ sở dữ liệu.
♦ ResultSet: thông tin về một bảng hay kết quả của một truy vấn. Ta có thể truy xuất tới hàng dữ liệu bởi một hàng, nhưng có thể truy xuất tới các cột bằng nhiều cách khác.
♦ResultSetMetaData: thông tin về một tên cột, các kiểu của cột trong đối tượng ResultSet.
Trong khi mỗi đối tượng này có một số lượng lớn các phương thức hướng dẫn ta lấy được các thông tin chi tiết chính về các phần tử của cơ sở dữ liệu. Có một vài phương SVTH: Bùi Thi Thu Hiền Trang 73
thức chính trong mỗi đối tượng này cho ta những thông tin đầy ý nghĩa về cơ sở dữ liệu của ta.
c. Ðối Tượng ResultSet:
Ðối tượng ResultSet là một đối tượng rất quan trọng trong JDBC. Nó là một sự trừu tượng hóa rất cần thiết của một bảng được tổ chức về chiều rộng và có chiều dài không được biết trước. Hầu như tất cả các phương thức, kết quả của các truy vấn đều trả về dữ liệu như một ResultSet. Nó liên quan đến số tên cột mà ta có thể truy vấn bởi tên.
Nó còn gồm cả tên của các hàng mà ta có thể di chuyển suốt từ trên xuống dưới của dãy trong một lần.
Trước khi dùng ResultSet, ta cần phải biết xem có bao nhiêu cột liên quan đến.
Thông tin này được cất trong đối tượng ResultSetMetaData.
ResultSet results;
ResultSetMetaData rsmd;
rsmd=results.getMetaData();
numcols=rsmd.getColumnCount();
Khi ta thu được một ResultSet, nó chỉ tới hàng đầu tiên. Ta sử dụng phương thức next() để thu thêm các hàng còn lại, và phương thức trả về False khi không còn hàng nào nữa. Từ khi đem dữ liệu từ một cơ sở dữ liệu, có thể, nó sẽ phát ra những biệt lệ. Ta phải luôn đặt hàm lấy kết quả trong một khối try
try {
rsmd= results.getMetaData(); //lấy dữ liệu từ kho MetaData ResultSetMetaData rsmd=results.getMetaData();
int numCols=rsmd.getColumnCount();//tạo biến đếm số cột boolean more=results.next(); //tạo biến cho biết cột đã hết chưa.
while(more)
for(j=1;j<=numcols;j++) {
System.out.print(results.getString(j));
System.out.println();
more=results.next();
}
results.close();
}
catch(Exception e) }
System.out.println(e.getMessage()) ; }
Các bước của chương trình:
- Lấy dữ liệu từ kho MetaData.
- Ðếm số cột bằng phương thức getColumnCount() trong ResultSetMetaData.
- Tạo biến đối tượng xem xét số cột đã hết chưa (true : còn, false : hết).
- Trong khi còn các cột:
- Tạo vòng lặp đếm số cột.
- Lấy giá trị tại cột thứ j.
- Gọi tiếp phương thức next() cho các cột còn lại.
SVTH: Bùi Thi Thu Hiền Trang 74
- Ðóng đối tượng results - Bắt biệt lệ hết cột xảy ra.
- Trả dữ liệu về kho ResultSetMetaData.
Ta có thể thu được dữ liệu trong ResultSet theo nhiều dạng, phụ thuộc vào kiểu dữ liệu được cất trong mỗi cột. Do đó, ta có thể thu được nội dung của cột mà không cần biết đến số cột hay tên cột.
Chú ý rằng số cột bắt đầu là một (1), không phải là không (0).
Một vài phương thức minh họa cho đối tượng ResulSet sau:
♦getInt(int): trả về nội dung của cột được đánh số như là một số integer.
♦getInt(String): Trả về nội dung của cột được đặt tên như là một số integer.
♦getFloat(int): Trả về nội dung của cột được đánh số như là một số float.
♦getFloat(String): Trả về nội dung của cột được đặt tên như là một số float.
♦getDate(int): Trả về ngày tạo lập của cột được đánh số.
♦getDate(String): Trả về ngày tạo lập của cột được đặt tên.
♦next(): Chuyển con trỏ tới hàng kế tiếp và trả về false khi hết hàng.
♦close(): Ðóng đối tượng ResultSet.
d. Ðối Tượng ResultSetMetaData:
Ta thu được đối tượng ResultSetMetaData từ đối tượng ResulSet khi sử dụng phương thức getMetaData(). Ta có thể sử dụng đối tượng này để tìm số và kiểu của cột cũng như tên của mỗi cột.
♦ getColumnCount(): Trả về số cột trong ResultSet.
♦ getColumnName(int): Trả về tên của cột được đánh số.
♦getColumnLabel(int): Trả về nhãn của cột được đánh số.
♦Iscurrency(int): Trả về true nếu cột này chứa một số trong Currency Unit.
♦ IsReadOnly(int): Trả về true khi nội dung trong cột là read only.
♦IsAutoIncrement(int): Trả về true nếu cột tự động tăng lên. Các cột này thường là khóa và là read only.
♦getColumnTypes(int): Trả về kiểu dữ liệu SQL cho cột này. Những kiểu dữ liệu này bao gồm: BIGINT, BINARY, BIT, CHAR, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, LONGVABINARY, LONGVACHAR, NULL, NUMERIC, OTHER, REAL, SMALLINT, TIME, TIMESTAMP, TINYINT, VARBINARY, và VARCHAR.
e. Ðối Tượng DatabaseMetaData:
Ðối tượng này cho ta thông tin về cơ sở dữ liệu hiện hành. Ta sử dụng nó một cách chính thức để lấy tên của bảng trong cơ sở dữ liệu, và tên của cột trong bảng. Do có nhiều cơ sở dữ liệu khác nhau nên chúng cung cấp nhiều sự khác biệt của SQL. Sau đây là một số phương thức mà nó có thể truy vấn đến cơ sở dữ liệu như những gì mà nó cung cấp cho SQL:
♦getCatalogs(): Trả về danh sách catalogs của các thông tin trong cơ sở dữ liệu.
Với cầu driver JDBC_ODBC ta đã có một danh sách của cơ sở dữ liệu được ghi bằng ODBC. Rất hiếm khi Catalog được sử dụng trong cơ sở dữ liệu JDBC_ODBC.
♦getTables(catalog, schema, tablename, columnname): Trả về diện mạo của tất cả các bảng được gom trong tablename, và tất cả các cột gom lại trong tên cột.
♦getColumns(catalog, schema, tablename, columnname)
SVTH: Bùi Thi Thu Hiền Trang 75
♦getURL(): Lấy tên của URL mà ta kết nối tới.
♦getDriverName(): Lấy tên của driver mà ta kết nối tới.
f. Lấy Thông Tin Trên Table:
Ta có thể lấy thông tin trên một bảng trong cơ sở dữ liệu bằng cách dùng phương thức getTables() trong kho DatabaseMetaData(). Phương thức này có bốn thông số:
results=dma.getTables(catalog, schema, tablemask, type[]);
- Catalog: Tên catalog để tìm tên bảng trong đó.
- Schema: Giản đồ tóm lược cơ sở dữ liệu. Nhiều cơ sở dữ liệu không cung cấp Schema. Một số trường hợp khác, nó là username của người chủ cơ sở dữ liệu. Nó thường được đặt là null.
- Tablemask: Một mask thì minh họa cho tên một bảng mà ta muốn lấy ra. Nếu ta muốn lấy tất cả tên bảng, ta đặt nó trong một ký tự wildcard %. Ký tự wildcard trong SQL là % chứ không giống như ký tự wildcard trong các chương trình khác là *.
- Type[]: Một dãy String minh họa kiểu của bảng mà ta muốn lấy ra. Nếu type[]
là null, ta sẽ lấy toàn bộ những thông tin trên bảng đó. Nếu ta để vào chỗ này một phần tử dãy chứa tên bảng kiểu String, ta sẽ chỉ thu được bảng mà ta muốn dùng.
Ðoạn mã để lấy tên bảng trong cơ sở dữ liệu từ DatabaseMetaData:
con= DriverManager.getConnection(url);
//lấy meta database dma=con.getMetaData();
System.out.println("Da ket noi toi: "+dma.getURL());
System.out.println("Driver: "+dma.getDriverName());
//lấy ra tên của table trong CSDL String[] types =new String[1];
types[0]="Table";
//chú ý dấu hiệu % của wild card
results=dma.getTables(null,null,"%",types);
boolean more=results.next(); //tạo biến cho biết cột đã hết chưa.
while(more)
for(j=1;j<=numcols;j++){
System.out.print(results.getString(j)+"");
System.out.println();
more=results.next();
}
Tất cả đều được đặt trong khối try.
SVTH: Bùi Thi Thu Hiền Trang 76
TÓM TẮT CHƯƠNG IV.
Ngôn ngữ Java ngôn ngữ lập trình của Sun Microsystems, có một sức mạnh đầy ấn tượng. Java được phát triển vào thập kỷ 1990, do nhà thiết kế là James Gosling. Java phát triển nhanh chóng là nhờ Web. Nhưng trên thực tế, sức mạnh vốn có của Java không phải là ngôn ngữ lập trình cho Web. Hệ thống quan trọng nhất của ngôn ngữ lập trình Java là Java Virtual Machine (Máy ảo Java, bộ thông dịch).
- Ưu điểm của java là: được Sun mô tả như là một ngôn ngữ lập trình đơn giản, hướng đối tượng, kiểu - mạng, có thể biên dịch, mạnh, an toàn, độc lập với cấu trúc, dễ di chuyển, hiệu suất cao, đa luồng, và có tính động. Java còn là một môi trường độc lập, đó là một lợi thế quan trọng cho phép Java hơn hẳn những ngôn ngữ khác, đặc biệt là cho những hệ thống cần làm việc trên nhiều môi trường khác nhau.
- Nhược điểm của Java là: Java có tốc độ thực thi chương trình phải thông qua JVM nên tốc độ rất chậm so với các ngôn ngữ khác.
- Hoạt động của một ứng dụng viết bằng Java: được chia làm hai loại: Java Applet và Java Application.
- Cơ chế truyền nhận trong Java: Các máy tính chạy trên mạng Internet truyền thông với nhau dùng các Protocol TCP, UDP.
+ TCP là một protocol dựa trên connection, cung cấp các data flow tin cậy giữa 2 máy tính.
+ UDP là một protocol, gửi những package độc lập, gọi là các datagrams, từ máy này tới máy khác, không đảm bảo chắc chằn sẽ thành công. UDP không dựa trên connection như TCP.
- Networking:
+ URL: URL là toàn bộ địa chỉ của Web Site hoặc trang Web.
Có 5 loại URL : file, http, gopher, news, partials.
+ Sockets: Những lớp Socket và ServerSocket trong java.net package hỗ trợ cho việc thực hiện các kênh truyền TCP độc lập hệ thống.
Một Socket là một end-point của một liên kết giữa hai chương trình chạy trên mạng. Các lớp socket được sử dụng để thể hiện connection giữa một chương trình client và một chương trình Server. Package java.net cung cấp hai lớp : Socket và ServerSocket tương ứng với client và server.
Socket được xem là một cấu trúc dữ liệu trừu tượng (asbtraction data structure) dùng tạo ra một kênh truyền (channel) để gởi và nhận dữ liệu giữa các process trong cùng chương trình hay giữa các máy trong cùng môi trường mạng với nhau.
- Java Security: Các Java-application không thực hiện tính bảo mật như Java- applet. Với một Java-application, nó có thể đọc và ghi file, giao tiếp với thiết bị, connect với các socket, . . .Nhưng với Java-applet thì không như vậy. Có nhiều việc mà Java- applet không được phép làm, và nhiều tài nguyên mà Java-applet chỉ nên hạn chế truy xuất. Các applet có thể quan hệ tới mô hình Client/Server cổ điển theo cách : Web server là server của applet
- Multithreading:Việc áp dụng threads rất hiệu quả khi thiết kế Client với đặc tính : luôn thực hiện "đồng thời" hai nhiệm vụ: vừa listen data do Server gửi cho, vừa tương tác với user. Ngoài ra Server cũng buộc phải thực hiện multithreading, mỗi thread quản lý một connection với một client.
SVTH: Bùi Thi Thu Hiền Trang 77
- Synchronization (xử lý crictical section): Như đã nói ở trên, khả năng multithread do Java support mang lại nhiều lợi điểm. Tuy nhiên, điều gì sẽ xảy ra nếu hai thread truy xuất và làm thay đổi cùng một đối tượng? Lý thuyết chung của vấn đề này vẫn là: phải đảm bảo trong quá trình một thread truy xuất và sửa đổi đối tượng dùng chung, nó không bị interrupted ta dùng đến Synchronization.
- Exceptions: Java cũng support việc quản lý exception, một đặc trưng quan trọng tạo nên sức mạnh của chương trình. Bất cứ khi nào một lỗi run-time xảy ra trong một phương thức, nó có thể throw một exception, giúp đoạn code chứa phương thức đó khắc phục lỗi hay thoát có chủ ý, không làm down toàn bộ hệ thống
- Cơ sở dữ liệu dùng JDBC: Java có hai hướng: là một ngôn ngữ lập trình và cũng là một hệ thống client/server trong đó chương trình tự động download và chạy trên máy cục bộ (thay vì máy server). Một trong những thư viện của API đó là Java Database Connectivity hay JDBC. Mục đích chính là kết nối chặt chẽ ngôn ngữ Java với cơ sở dữ liệu.
SVTH: Bùi Thi Thu Hiền Trang 78
C CHƯƠNG HƯƠNG 5 5
PHÂN TÍCH VÀ THIẾT KẾ PHÂN TÍCH VÀ THIẾT KẾ
CHƯƠNG TRÌNH.
CHƯƠNG TRÌNH.
SVTH: Bùi Thi Thu Hiền Trang 79
I - Giới thiệu, mục đích chương trình.
- Mục đích của chương trình Company Chat là cung cấp một dịch vụ nhằm giúp đỡ những người quản lý của một công ty hoặc một tổ chức có thể kiểm soát tất cả nhân viên của mình, hoặc cần yêu cầu đến một phòng ban, hay cá nhân nhân viên nào đó,có thể trao đổi thông tin trực tiếp, trao đổi tài liệu, gởi thông báo,cập nhật tình hình công ty hàng ngày. Chương trình sẽ giải quyết bằng cách gởi thông điệp một cách nhanh chóng, đồng thời giảm được chi phí, công sức so với điện thoại .
II - Nội dung đề tài.
Xây dựng dịch vụ Chat dựa trên môi trường Client-Server.
- Dùng cho một mạng lưới của một công ty hay một tổ chức nào đó. Chương trình chỉ dành cho những người trực thuộc công ty hay tổ chức đó đang sử dụng chương trình.
- Chương trình cần cài đặt ở cả máy client và máy server - Máy Server sẽ là nguời chủ động kích hoạt chương trình.
a. Đối với máy Server.
Sau khi đã cài đặt thành công.
- Quản lý tất cả các thông tin của các user đã đăng nhập,có thể thêm,xoá,sửa thông tin của nhân viên .
- Đổi phông chữ thể hiện.
- Đổi màu cho phông chữ.
- Đổi màu cho background thể hiện.
SVTH: Bùi Thi Thu Hiền Trang 80
- Thay đổi max số người tham gia hệ thống chat, Time in, Time out của hệ thống.
- Một khung text ghi chú trong mọi trường hợp.
- Dưới mỗi thành viên có trong danh sách đều có một trang ghi chú riêng. Trên trang này sẽ tự động cập nhật ngày giờ gần nhất vừa được kích hoạt , danh sách các client kết nối vào và kết thúc kết nối .
- Lưu lại những thông tin trên.
Các đặc tính chung dành cho cả Server và Client.
- Các tính năng chung.
♦ Gởi thông điệp tức thời đến tất cả thành viên có trong danh sách.
♦ Gởi thông điệp tức thời đến một số thành viên nào đó có trong danh sách.
♦ Gởi thông điệp tức thời đến một thành viên nào đó có trong danh sách.
♦ Chèn biểu tượng cảm xúc vào thông điệp tức thời.
♦ Lưu thông điệp tức thời này nếu bạn muốn
♦ Nếu sau khi mình disconnect,có thành viên nào đó gởi thông điệp hay muốn chat với mình thì sẽ có thông báo đi ra ngoài.Khi mình login thì thông điệp do ai đó gởi sẽ tự động hiện lên.
- Trao đổi tập tin.
♦Trao đổi tập tin giữa các thành viên có trong danh sách.
♦ Tự động nhận tập tin gởi đến Server, client.
- Đặc tính Image.
♦ Cho phép gởi tập tin hình ảnh/ âm thanh.
♦ Cho phép lưu tập tin hình ảnh/ âm thanh.
III- Yêu cầu của đề tài
Dựa vào nội dung đề tài đặt ra em đi xây dựng một chương trình ứng dụng dựa trên các yêu cầu sau :
- Xây dựng một chương trình theo mô hình Client-Server, toàn bộ dữ liệu liên quan đến hệ thống được lưu trữ trên Server, tất cả những xử lý liên quan cũng được thực hiện trên Server. Việc truy cập và truyền dữ liệu được thực hiện thông qua mạng nhằm phục vụ cho việc kiểm tra, trao đổi cập nhật thông tin
- Thông qua môi trường Web, người sử dụng có thể thực hiện các thao tác phù hợp với các chức năng sẵn có của chương trình .Thông qua trình duyệt Web này, người quản lý mạng có thể kiểm soát toàn bộ tiến trình của chương trình: lựa chọn, sắp xếp, cập nhật thông tin, yêu cầu về phía nhân viên…một cách nhanh chóng.
- Đối tượng sử dụng chương trình:
Chương trình được thực hiện chủ yếu dựa vào người quản lý. Chương trình sẽ được kích hoạt khi người quản lý này kích hoạt và các nhân viên sẽ được thực hiện chương trình tùy theo mức độ mà người quản lý cho phép.
IV- Giải quyết vấn đề.
1- Khái niệm về mạng trong chương trình.
- Dựa vào những yêu cầu và nội dung ở trên, ở đây đề tài của em sẽ nghiên cứu về mô hình mạng Client/Server.
♦Nhiệm vụ của máy client :là thi hành một dịch vụ cho người dùng, bằng cách kết nối với những chương trình tương ứng ở máy server, dựa vào những chuỗi nhập để chuyển yêu cầu cho máy server và trả kết quả cho người dùng.
SVTH: Bùi Thi Thu Hiền Trang 81