Monday, July 28, 2014

Sử dụng Transaction trên JDBC

Như đã nêu ở bài trước bài này chúng ta sẽ làm ví dụ về quản lý Transaction và batch execute trên jdbc.

JDBC cho phép thực thì hàng loạt thao tác trong một lần gởi yêu cần về server dữ liệu (batch).

Chúng ta ví dụ thêm dữ liệu và 02 bảng đồng thời (Semester và Subject của bài trước).

1 Connection conn; 2 conn = DriverManager.getConnection("jdbc:sqlserver://localhost;user=sa;password=sa;database=java;"); 3 // khoi tao transaction 4 conn.setAutoCommit(false); 5 Statement command = conn.createStatement(); 6 command.addBatch("insert into semester(id,name) values(1,'Semester 1')"); 7 command.addBatch("insert into subject(id,sem_id,name) values(1,1,'HTML')"); 8 command.addBatch("insert into subject(id,sem_id,name) values(2,1,'Java')"); 9 command.addBatch("insert into subject(id,sem_id,name) values(2,1,'csharpe')"); 10 command.executeBatch(); 11 // cap nhat thay doi du lieu ve server 12 conn.setAutoCommit(true);

Nhìn vào đoạn mã trên chúng ta thấy rằng sẽ có 03 dòng dữ liệu được thêm vào hệ thống nhưng dòng cuối cùng thì lỗi trùng khóa chính. Với lệnh

1 conn.setAutoCommit(false);

Chúng ta đã báo cho jdbc biết rằng những thay đổi mà chúng ta đã thực hiện thì chỉ được chấp nhận khi nào chúng ta gọi lệnh

1 conn.setAutoCommit(true);

Do đó, khi chạy ứng dụng chúng ta sẽ kg có dòng nào được thêm vào dữ liệu ở đây do dòng 09 phát sinh lỗi nên dòng 12 sẽ không được thực thi.

Friday, July 18, 2014

Sử dụng stored procedure trong jdbc

 

Cấu trúc dữ liệu

1 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Semester]') AND type in (N'U'))
2 DROP TABLE [dbo].[Semester]
3 GO
4
5 CREATE TABLE [dbo].[Semester](
6 [id] [int] NOT NULL,
7 [name] [nvarchar](50) NULL,
8 CONSTRAINT [PK_Semester] PRIMARY KEY CLUSTERED
9 (
10 [id] ASC
11 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
12 ) ON [PRIMARY]
13
14 GO
15
16 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Subject]') AND type in (N'U'))
17 DROP TABLE [dbo].[Subject]
18 GO
19
20 CREATE TABLE [dbo].[Subject](
21 [id] [int] NOT NULL,
22 [sem_id] [int] NOT NULL,
23 [name] [nvarchar](50) NULL,
24 [duration] [int] NULL,
25 CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED
26 (
27 [id] ASC,
28 [sem_id] ASC
29 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
30 ) ON [PRIMARY]
31
32 GO

Tạo một storeprocedure như sau


1 CREATE PROCEDURE ListAll
2 @Sem_id int
3 AS
4 BEGIN
5 SELECT * From Subject where sem_id = @Sem_id
6 END
7 GO

Như vậy chúng ta sẽ có được một thủ tục tên là “ListAll”. Đoạn mã sau dùng để gọi thực thi thủ tục trên


1 public void jdbcSQLServer() {
2 try {
3 // dang ky driver
4 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
5 Connection conn;
6 // thiet lap ke noi
7 conn = DriverManager.getConnection("jdbc:sqlserver://localhost;user=sa;password=sa;database=java;");
8 // khoi tao loi goi thuc thi thu tuc
9 CallableStatement command = conn.prepareCall("{call ListAll (?)}");
10 // cung cap gia tro cho bien
11 command.setInt(1, 1);
12 ResultSet result = command.executeQuery();
13 // duyet ket qua
14 while (result.next()) {
15 System.out.print(result.getInt("id"));
16 System.out.println(" - " + result.getString("name"));
17 }
18 // dong ket noi
19 conn.close();
20 } catch (Exception ex) {
21 ex.printStackTrace();
22 }
23 }

Gọi thực thi đoạn mã trên chúng ta có kết quả sau


1 -  HTML
2 -  Java

====>>>> Bài tiếp theo chúng ta tìm hiểu Transaction trên jdbc.

Thursday, July 17, 2014

Căn bản về JDBC – Từng bước kết nối dữ liệu SQL server

  1. Đăng ký Driver.
  2. Thiết lập kết nối với DataBase Server.
  3. Tạo và thực thi câu lệnh.
  4. Xử lý kết quả và đóng kết nối.

Để đăng ký JDBC drive chúng ta sử dụng hàm forName của lớp Class

Đối với odbc:

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

Cần đăng ký odbc user với hệ điều hành windows (tôi sẽ demo trực tiếp)

http://youtu.be/iRBQm1YrSHY

Đối với jdbc:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Cần nhúng thư viện jdbc của sql server vào ứng dụng. download tại jdbc sqlserver driver (phần nhúng vào tôi sẽ demo trực tiếp)

http://youtu.be/cRyPUvkZx-U

Tiếp theo, chúng ta thiết lập kết nối.

Đối với loại kết nối thứ 4 cho sql server

Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost;user=sa;password=sa;database=Northwind;");

Đối với loại kết nối thứ 1

Connection con = DriverManager.getConnection("jdbc:odbc:demo", "sa","sa");

Bước kế tiếp chúng ta tạo câu lệnh đọc dữ liệu và đón nhận thông qua ResultSet

Với odbc

Statement command = con.createStatement();
ResultSet result = command.executeQuery("Select * from Employees");

Với jdbc loại 4

PreparedStatement command = conn.prepareStatement("Select * from Employees where employeeid like ?");
command.setInt(1,id);
ResultSet result = command.executeQuery();

Đoạn trên chúng ta sử dụng dấu ? để tham qui định tham số trong câu lệnh truy vấn, sử dụng các setXXX(số thứ tự tham số bắt đầu = 1) với XXX là loại dữ liệu mối gán vào.

Thao tác cuối cùng là xử lý dữ liệu đã nhận về và đóng kết nối với database server. Trong phần này chúng ta chỉ đơn giản là liệt kê các cột dữ liệu gồm: tên cột, loại dữ liệu và ràng buộc của cột dữ liệu, hiển thị toàn bộ dữ liệu đã nhận được.

1. Thể hiện cấu trúc dữ liệu lấy về (giống nhau cho cả hai loại driver mà chúng ta đã thực hiện lý do là dữ liệu đã lấy về ứng dụng đề được chứa trong ResultSet

ResultSetMetaData rsm = result.getMetaData();

int count = rsm.getColumnCount();
  for(int i=0; i<count;i++) {
     System.out.print("Col " + rsm.getColumnName(i+1));
     System.out.println("is"+rsm.getColumnTypeName(i+1));
}

Chạy thử ứng dụng chúng ta có kết quả như sau:

Col EmployeeID is int identity
Col LastName is nvarchar
Col FirstName is nvarchar
Col Title is nvarchar
Col TitleOfCourtesy is nvarchar
Col BirthDate is datetime
Col HireDate is datetime
Col Address is nvarchar
Col City is nvarchar
Col Region is nvarchar
Col PostalCode is nvarchar
Col Country is nvarchar
Col HomePhone is nvarchar
Col Extension is nvarchar
Col Photo is image
Col Notes is ntext
Col ReportsTo is int
Col PhotoPath is nvarchar
Col Image is nvarchar
Col Hinh is varchar
Col Gender is bit

2. Duyệt và in kết quả ra màn hình

for (int i = 0; i < count; i++) {
  System.out.print("Col"+rsm.getColumnName(i+1) + "\t");
}
System.out.println();
while (result.next()) {
  for (int i = 0; i < count; i++) {
   System.out.print("Col"+result.getString(i + 1)+ "\t");
  }
  System.out.println("");
}

Chạy ứng dụng chúng ta có kết quả sau:

EmployeeID    LastName    FirstName    Title    TitleOfCourtesy   
1    Ngo Tuong Dan    Ngo    null    Ms.   
2    Fuller    Andrew    Vice President, Sales    Dr.   
3    Leverling    Janet    null    Ms.   
4    Peacock    Margaret    Sales Representative    Mrs.   
5    Buchanan    Steven    Sales Manager    Mr.   
6    Suyama    Michael    Sales Representative    Mr.   
7    King    Robert    Sales Representative    Mr.   
8    Callahan    Lauradddd    Inside Sales Coordinator    Ms.

Cuối cùng là đóng kết nối với database server

con.close();

Như vậy là chúng ta đã thực hiện được những thao tác rất rất cơ bản trong sử dụng jdbc để đọc dữ liệu.

>>>> Bài tiếp theo tôi sẽ thực hiện gọi hàm và thủ tục.

Translate