Để thiết kế một Website nhằm giới thiệu sản phẩm cho một công ty với cơ sở dữ liệu sản phẩm đã được lưu trữ trên hệ quản trị CSDL SQL Server.
Làm thế nào để có thể đọc các thông tin sản phẩm trong CSDL để trình bày lên trang web và để cho phép cập nhật các thông tin về sản phẩm mới vào cơ sở dữ liệu?
1. CÁC ĐỐI TƯỢNG KẾT NỐI
• Có 3 đối tượng chính để làm việc với cơ sở dữ liệu là:
- Connection;
- Statement;
- ResultSet.
• Trước khi sử dụng các đối tượng này, phải khai báo import java.sql.* và khai báo trình điều khiển JTDS như sau:
Class.forName("net.sourceforge.jtds.jdbc.Driver");
2. CONNECTION
• Connection là đối tượng dùng để mở kết nối cơ sở dữ liệu bằng trình điều khiển JDBC, bằng cách sử dụng phương thức DriverManager.getConnection của đối tượng Connection bạn có thể mở kết nối cơ sở dữ liệu với loại cơ sở dữ liệu cùng với các tham số khác.
• Khai báo:
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + hostName + ":1433/" + database);
Hoặc:
Connection con = null;
con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + hostName + ":1433/"+database);
• Tạo đối tượng Statement: Sau khi mở kết nối cơ sở dữ liệu bằng đối tượng Connection, ta có thể sử dụng phương thức createStatement để trả về đối tượng Statement bằng cú pháp:
con.createStatement();
• Đóng kết nối: Để đóng kết nối cơ sở dữ liệu, ta sử dụng cú pháp:
con.close();
• Giải phóng kết nối: Khi không có nhu cầu sử dụng đối tượng Connection, cần huỷ đối tượng này để giải phóng bộ nhớ mà đối tượng đã chiếm.
con.dispose();
3. STATEMENT
• Đối tượng Statement dùng để thực thi phát biểu SQL dùng cho hành động truy vấn, cập nhật, thay đổi và xoá dữ liệu.
• Khai báo:
Khai báo đối tượng Statement, bạn sử dụng cú pháp như sau:
Statement st = con.createStatement();
Hoặc:
Statement st = null;
st = con.createStatement();
• Thực thi phát biểu SQL:
- Sau khi mở kết nối cơ sở dữ liệu bằng đối tượng Connection và khai báo đối tượng Statement, có thể sử dụng phương thức executeUpdate để thực thi phát biểu SQL dạng hành động:
st.executeUpdate(sql);
- Hay khai báo biến int để nhận số mẩu tin được thực thi:
int records= st.executeUpdate(sql);
• Đóng đối tượng: Để đóng kết nối cơ sở dữ liệu, bạn sử dụng cú pháp:
st.close();
• Giải phóng đối tượng: Tương tự như trong trường hợp đối tượng Connection, khi không có nhu cầu sử dụng đối tượng Statement, bạn cần huỷ đối tượng này để giải phóng bộ nhớ mà đối tượng đã chiếm.
st.dispose();
4. RESULTSET
• Đối tượng ResultSet nắm giữ một tập dữ liệu cho phép thao tác trên tập dữ liệu bằng các phương thức và thuộc tính của nó.
• Khai báo:
Khai báo đối tượng ResultSet, sử dụng cú pháp như sau:
ResultSet rs = st.executeQuery(sql);
Hoặc:
ResultSet rs = null;
rs= st.executeQuery(sql);
• Đọc dữ liệu từ đối tượng ResultSet:
- Sau khi mở kết nối cơ sở dữ liệu bằng đối tượng Connection, có thể sử dụng phương thức createStatement để trả về đối tượng Statement, có thể đọc tập dữ liệu để điền vào đối tượng ResultSet và có thể đọc đối tượng bằng phương thức next() như sau:
rs.next()
- Nếu cần kiểm tra đối tượng tồn tại mẩu tin hay không, có thể sử dụng phát biểu if như sau:
if(rs.next())
{
//Xử lý dữ liệu
}
- Trong trường hợp duyệt từng mẩu tin bên trong đối tượng, sử dụng phát biểu while như sau:
while(rs.next())
{
//Xử lý dữ liệu
}
• Đóng đối tượng ResultSet: Để đóng đối tượng ResultSet, bạn sử dụng cú pháp:
rst.close();
• Giải phóng đối tượng ResultSet:
Tương tự như trên, khi không có nhu cầu sử dụng đối tượng ResultSet, bạn cần huỷ đối tượng này để giải phóng bộ nhớ mà đối tượng đã chiếm.
rst.dispose();
5. SỬ DỤNG CONECTION, STATEMENT VÀ RESULTSET
• Sử dụng phương thức executeQuery:
- Trở lại tập tin .JSP, có thể khai báo để kết nối cơ sở dữ liệu và truy vấn dữ liệu, có thể khai báo và sử dụng phương thức executeQuery và đối tượng Resultset như sau:
+ Tạo đối tượng connection:
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + hostName + ":1433/" + database);
+ Tạo đối tượng statement qua phương thức createStatement() của đối tượng connection;
+ Tạo đối tượng resultset qua phương thức executeQuery của đối tượng statement.
Ví dụ: Chương trình sau đây sẽ sử dụng đối tượng resultset để duyệt các bản ghi trong bảng PRODUCT qua cầu nối JTDS.
Bước 1: Tạo Cơ sở dữ liệu mytest
Chạy script sau để sinh giá trị cho CSDL
USE [mytest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[PRODUCT](
[CODE] [varchar](20) NOT NULL,
[NAME] [varchar](128) NOT NULL,
[PRICE] [float] NOT NULL,
PRIMARY KEY CLUSTERED
(
[CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[USER_ACCOUNT] Script Date: 4/23/2018 8:32:53 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[USER_ACCOUNT](
[USER_NAME] [varchar](30) NOT NULL,
[GENDER] [varchar](1) NOT NULL,
[PASSWORD] [varchar](30) NOT NULL,
PRIMARY KEY CLUSTERED
(
[USER_NAME] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[PRODUCT] ([CODE], [NAME], [PRICE]) VALUES (N'P001', N'Java Core', 100)
GO
INSERT [dbo].[PRODUCT] ([CODE], [NAME], [PRICE]) VALUES (N'P002', N'C# Core', 90)
GO
INSERT [dbo].[USER_ACCOUNT] ([USER_NAME], [GENDER], [PASSWORD]) VALUES (N'1', N'M', N'1')
GO
INSERT [dbo].[USER_ACCOUNT] ([USER_NAME], [GENDER], [PASSWORD]) VALUES (N'jerry', N'M', N'jerry001')
GO
Bước 2: Tạo trang jsp với code sau
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
Connection con;
Class.forName("net.sourceforge.jtds.jdbc.Driver");
try {
String connectionURL = "jdbc:jtds:sqlserver://DOTNETGROUP:1433/mytest";
con = DriverManager.getConnection(connectionURL);
Statement st = con.createStatement();
String sql = "Select * from PRODUCT";
ResultSet rs = st.executeQuery(sql);
out.println("<table border='1' cellpadding='2' cellspacing='0' width='100%'>");
out.println("<tr><th>CODE</th><th>NAME</th>");
out.println("<th>PRICE</th></tr>");
while (rs.next()) {
out.println("<tr><td>" + rs.getString("CODE") + "</td><td>" + rs.getString("NAME") + "</td>");
out.println("<td>" + rs.getString("PRICE") + "</td></tr>");
}
out.println("</table>");
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
%>
</body>
</html>
Bước 3: Chạy chương trình
CODE | NAME | PRICE |
P001 | Java Core | 100.0 |
P002 | C# Core | 90.0 |
6. SỬ DỤNG PHƯƠNG THỨC EXECUTEUPDATE
• Ta có thể sử dụng phương thức executeUpdate để thực hiện các hành động cập nhật, thêm, xóa các bản ghi trong cơ sở dữ liệu.
- Tạo đối tượng connection;
- Tạo đối tượng Statement qua phương thức createStatement() của đối tượng connection;
- Tạo câu lệnh thực thi SQL;
- Gọi phương thức executeUpdate qua đối tượng Statement.
Ví dụ:
- Xây dựng chương trình hiển thị thông tin về các sản phẩm và thực hiện việc xóa bản ghi bằng câu lệnh SQL qua phương thức executeNonQuery.
- Xây dựng trang ProductList.JSP hiển thị thông tin các sản phẩm như sau:
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
String code="";
Connection con;
Class.forName("net.sourceforge.jtds.jdbc.Driver");
try {
String connectionURL = "jdbc:jtds:sqlserver://DOTNETGROUP:1433/mytest";
con = DriverManager.getConnection(connectionURL);
Statement st = con.createStatement();
String sql = "Select * from PRODUCT";
ResultSet rs = st.executeQuery(sql);
out.println("<table border='1' cellpadding='2' cellspacing='0' width='100%'>");
out.println("<tr><th>CODE</th><th>NAME</th>");
out.println("<th>PRICE</th><th>ACTION</th></tr>");
while (rs.next()) {
code = rs.getString("CODE").toString().trim();
out.println("<tr><td>" + rs.getString("CODE") + "</td><td>" + rs.getString("NAME") + "</td>");
out.println("<td>" + rs.getString("PRICE") + "</td>");
out.println("<td><a href=deleteProduct.jsp?code=" + code + ">Delete</a></td></tr>");
}
out.println("</table>");
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
%>
</body>
</html>
- Xây dựng trang deleteProduct.JSP để xóa bản ghi bằng lệnh executeUpdate của đối tượng Statement.
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
String code = request.getParameter("code");
Connection con;
Statement st;
ResultSet rs;
Class.forName("net.sourceforge.jtds.jdbc.Driver");
String connectionURL = "jdbc:jtds:sqlserver://DOTNETGROUP:1433/mytest";
con = DriverManager.getConnection(connectionURL);
st = con.createStatement();
String sql = "Delete from PRODUCT where Code like N'%"+ code+"%'";
st.executeUpdate(sql);
st.close();
con.close();
%>
<jsp:forward page="resultsetdemo.jsp"></jsp:forward>
</body>
</html>
CODE | NAME | PRICE | ACTION |
P002 | C# Core | 90.0 | Delete |