35
Lp trnh hưng đi tưng JDBC Java Database Connectivity Nhóm 7-D08CNTT3 Các thành viên: 1.Nguyn Đc Hnh 2. Nguyn Thu Giang 3.Trn Th Thu Huyn

JDBC

Embed Size (px)

Citation preview

Page 1: JDBC

Lâp trinh hương đôi tương

JDBCJava Database Connectivity

Nhóm 7-D08CNTT3Các thành viên:

1. Nguyên Đưc Hanh2. Nguyên Thu Giang3. Trân Thi Thu Huyên

Page 2: JDBC

Nội dung

1.Giơi thi u chung JDBC APIê

2. Kêt nôi cơ sơ dư li uê

3. Truy vân đên cơ sơ dư li uê

4. Sư dung Transaction( giao dich )

Page 3: JDBC

I. Giơi thi u chung vê JDBC:ê

JDBC API la gi?• JDBC la m t chuân cho vi c kêt ô ê

nôi csdlm t cach đ c l p giưa ô ô ângôn ngư l p trinh java va hang âloat cac cơ sơ dư li uê

• Ban chỉ cần học JDBC va sau đó ban sẽ được đảm bảo rằngban sẽ có thể phat triển nên cac ứng dụng truy cập cơ sơ dư liệu có khả năng truy cập đên cac RDBMS khac nhau bằng cach sử dụng cac JDBC driver khac nhau.

Tại sao lại dùng JDBC?

Write Once, Run Anywhere!

Page 4: JDBC

1.1 Chức năng cua JDBC API:

• Thiêt l p m t kêt nôi vơi â ôm t cơ sơ dư li u ho c truy ô ê ăc p tơi m t nguôn dư li u â ô êdang bảng bât ky

• Gửi m t câu l nh SQLô ê• Nh n va xử ly cac kêt quả â

nh n tư database khi trả lơi âtruy vân

JDBC API lam ra để thưc hi n 3 ê

vi c sau!ê

Page 5: JDBC

1.2 Kiên truc JDBC API

• JDBC API hô trợ cả hai mô hinh 2 lơp va 3 lơp cho vi c truy c p cơ sơ dư li u.ê â ê

This’s two-tier model !

Page 6: JDBC

And this’s three-tier model !

Middle tier

Client

Database server

Page 7: JDBC

• Đê kêt nôi vao cơ sơ dư li u cân phai cai đ t ê ăJDBC Drivers

• JDBC Drivers la tâng thâp nhât, giao tiêp trực tiêp vơi DBMS

• Môi h quan tri cơ sơ dư li u thương có ê êm t sô Driver riêngô

1.3 Drivers JDBC:

Page 8: JDBC

Loại 4 Loại 3 Loại 1 Loại 2

4 loai Driver JDBC

Page 9: JDBC

2. Kêt nôi cơ sơ dư li uê

Page 10: JDBC

2.1 Cac bươc kêt nôi cơ sơ dư li u:êBươc 1. Load JDBC Driver cần dung

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

Bươc 2. Tao URL JDBC (cac Driver sử dụng cac chuôi kêt nôi khac nhau:String conUrl = "jdbc:sqlserver://localhost:1433;user=sa;password=admin;";

Bươc 3. Khơi tao Connection va mơ kêt nôi:Connection con = DriverManager.getConnection(conUrl);

Page 11: JDBC

Connection con = null; try{

String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver“; Class.forName(driver);

String conUrl = "jdbc:sqlserver://localhost:1433;user=sa;password=admin;";

con = DriverManager.getCon(connUrl); System.out.print("Connected!");

} catch(SQLException e) { System.out.print(e.getMessage()); }

finally{ if(con != null) con.close();}

}

Vi dụ 1: mơ kêt nôi vơi SQL serverSử dụng SQLServerDriver do microsoft cung câp.

Page 12: JDBC

Connection con = null; try{

String url = "sun.jdbc.odbc.JdbcOdbcDriver";Class.forName(url);

String conUrl = “jdbc:odbc:myDNS"; con = DriverManager.getConnection (url, "sa", "admin"); System.out.print("Connected!");

} catch(SQLException e) { System.out.print(e.getMessage()); }

finally{ if(con != null) con.close();}

}

Vi dụ 2: mơ kêt nôi vơi SQL serverSử dụng cầu nôi JDBC-ODBC

Page 13: JDBC

3. Truy vân đên cơ sơ dư li uê

Page 14: JDBC

3.1 Cac đôi tượng thưc thi truy vân?

Statement

PreparedStatement

CallableStatement

Thưa kê

Thưa kê

Page 15: JDBC

Statement• Tao bơi phương thức Connection.createStatement() • M t đôi tượng Statement được sử dụng để gửi nhưng ô

câu l nh SQL không tham sô.ê

PrepareStatement

• Tao bơi phương thức Connection.prepareStatement() • M t đôi tượng PreparedStatement được sử dụng để ô

biên dich câu l nh SQL có săn câu truc, có thể có ho c ê ăkhông có tham sô.

CallableStatement

• Tao ra bơi phương thức Connection.prepareCall() • Đôi tượng CallableStament được sử dụng để thưc hi n ê

cac thu tục lưu trư. Bô sung thêm cac phương thức xử ly tham sô vao ra.

Page 16: JDBC

3.2 Statement – Truy vân không tham sô

Connection

Statement

URL JDBC

Database

execute()

executeUpdate()

executeQuery()

Khơi tao

Page 17: JDBC

Vi dụ:Connection con = DriverManager.getConnection(url, "sa", "admin");Statement stmt = con.createStatement ();

Connection StatementcreateStatement method

Page 18: JDBC

Interface Statement cung câp 3 phương thức để thưc thi truy vân SQL

Statement

executeQuery: được thiêt kêt cho truy vân trả vê m t t p kêt quả duy nhât như câu l nh SELECTô â ê

executeUpdate: được sử dụng để thưc thi cac l nh INSERT, UPDATE, DELETE va cả câu l nh SQL ê ê

DDL như CREATE TABLE, DROP TABLE…

execute: được sử dụng để thưc thi nhưng câu l nh ma nó trả vê nhiêu hơn m t t p kêt quả, ê ô â

nhiêu hơn sô lần update ho c cả hai.ă

Page 19: JDBC

Statement.Execute()

String sqlQuery = "CREATE TABLE “++“Goods(Name VARCHAR(20), Price INT);";

try { Statement st =

con.createStatement(); st.execute(sqlQuery); st.close(); } catch(SQLException e) { System.out.print(e.getMessage()); }

•Chương trinh tao m t bảng ôGoods( Name, Price) trong cơ sơ dư li u.ê•Câu l nh SQL được thưc êhi n bơi phương thức êexecute()•Phương thức nay có thể thưc hi n được tât cả cac truy vân.ê

Page 20: JDBC

Statement.executeUpdate()public void insertData(String name, double val) { String insertQuery = "INSERT INTO Goods

VALUES('" + name + "'," + val + ");"; try { Statement st = con.createStatement(); int d = st.executeUpdate(insertQuery); System.out.println("So dong duoc cap

nhat: " + d); st.close(); } catch(SQLException e) { System.out.print(e.getMessage()); } }

•Phương thức chen dư li u êvao bảng vưa tao sử dụng executeUpdate()•Gia tri được trả vê tư executeUpdate la m t sô ônguyên cho biêt sô hang bi thay đôi. Đôi vơi câu l nh ênhư CREATE TABLE, DROP TABLE, không tac đ ng đên ôcac hang, gia tri trả vê luôn la 0.

Page 21: JDBC

Statement.executeQuery() public ResultSet GetResultSet(String tableName) throws SQLException {

ResultSet rs = null;Statement stmt =

con.createStatement();String sql = "select * from " +

tableName;rs = stmt.executeQuery(sql);return rs;

}

• Câu l nh SQL sẽ được gửi êđên cơ sơ dư li u qua êtham sô cua phương thức executeQuery• Dư li u nh n được vê tư ê âserver sẽ được phương thức executeQuery sẽ trả vê kiểu ResultSet

Page 22: JDBC

3.3 Đôi tượng ResultSet

Statement

DBMS

QueryData

Data

Pointer

Pointer

Pointer

ResultSet

Page 23: JDBC

Chương trinh đọc va in ra các dòng trong bang usertestResultSet()

Khơi tao đôi tượng Statement tư Connection đã có săn

Khơi tao đôi tượng ResultSetThưc thi câu lệnh va hứng dư liệu vao ResultSet

Duyệt cac dòng cua rs tư đầu đên cuôiVơi môi dòng đang xétLây gia tri cua cột a gan vao iLây gia tri cua cột b gan vao sLây gia tri cua cột c gan vao fIn ra man hinh

Statement stmt;stmt = con.createStatement();

ResultSet rs;rs = stmt.executeQuery ("SELECT a, b, c FROM user");

while (rs.next()) {int i = rs.getInt("a");String s = rs.getString("b");float f = rs.getFloat("c");

System.out.println("ROW = " + i + " " + s + " " + f);}

Page 24: JDBC

Con trỏ dòng trong ResultSet

• Ban đầu con trỏ được đặt ơ hang 1• Được di chuyển nhơ cac phương thức:next: Dòng tiêp theoprevious: Dòng trươcfirst : Dòng đầu tiênlast: Dòng cuôi cungabsolute(int i): di chuyển đên dòng iCac phương thức khac: relative,afterLast ,

beforeFirst…• getRow: thứ tư dòng hiện tai

ResultSet

Page 25: JDBC

Lây gia tri tư cột cua dòng hiện tai

• Cac cột đanh sô tư 1• Dung cac phương thức getter để lây

gia tri cac cột cua hang hiện tai– getString(Id column)– getString(Name column)

• Phương thức findColumn (Name column)• Thông tin cột trong ResultSet có thây lây ra

tư phương thức ResultSet.getMetaData. Đôi tượng ResultSetMetaData

Page 26: JDBC

Sử dụng cac phương thức getter phu hợp

Page 27: JDBC

3.3 Đôi tượng ReparedStatement

INSERT INTO SET Pass = ‘123’table WHERE Name=‘A’

INSERT INTO SET Pass = ?table WHERE Name = ?

Statement

ReparedStatement

Pass = ‘456’ Name=‘B’Pass = ‘789’ Name=‘C’

Page 28: JDBC

Đôi tượng PreparedStatement• PreparedStatement thưa kê interface tư

Statement va khac tai 2 điểm:– PreparedStatement biên dich câu lệnh SQL ngay

sau khơi tao– Câu lệnh SQL có cac tham sô có gia tri không xac

đinh khi câu lệnh SQL được tao. Thay vao đó, câu truy vân sẽ có cac dâu “?” thay thê cho tham sô đầu vao. Trươc khi thưc thi phải đặt cac gia tri cho cac “?” trong PreparedStatement trươc khi thưc thi câu truy vân.

Tăng hiệu suất khi thực hiện nhiều câu lệnh cùng cấu trúc

Page 29: JDBC

Phương thức thêm một dòng vao bảng Goods

• Phương thức thêm dòng vơi cac tham sô: name, price, descrip

• Khơi tao PreparedStatement vơi câu lệnh SQL 3 tham sô được thay bằng “?”

• Đặt cac gia tri cho cac tham sô trươc khi thưc thi bằng cac phương thức setter

• Thưc thi

public void insertGoods(String name, int price, String descrip) throws SQLException

{PreparedStatement pStm =

con.prepareStatement("INSERT INTO Goods (Name, Price,Descrip) VALUES(? , ?, ? )");

pStm.setString(1, name); pStm.setInt(2, price); pStm.setString(3, descrip);

int rowCount = pStm.executeUpdate(); }

Page 30: JDBC

Truyên tham sô• Trươc khi đôi tượng

PreparedStatement được thưc thi,gia tri cua môi “?” phải được đặt. Việc nay được thưc hiện bơi cac ham setter– pStm.setString(oder arg, value);Oder arg: thứ tư tham sô trong câu

lệnh SQL, bắt đầu bằng 1Value: gia tri cần đặt

• Cac gia tri được giư lai cho đên khi được đặt lai hoặc pStm.clearParameters() được gọi

Truyên tham sô cho câu lệnh SQL cua

PreparedStatement như sau!

Page 31: JDBC

4. Transaction (Giao dich)

Page 32: JDBC

Transaction (Giao dich)• Mặc đinh, sau khi môi câu lệnh SQL được thưc thi qua JDBC, dư liệu sẽ

được cập nhật ngay vao trong cơ sơ dư liệu. Nhưng có nhưng trương hợp ta muôn dư liệu chỉ được cập nhật vao CSDL sau khi một sô câu lệnh SQL được thưc hiện.

• Nhóm cac câu lệnh ma lệnh trươc hoan thanh chỉ khi cac lệnh sau được hoan thanh. Nêu một lệnh không hoan thanh thi giao dich sẽ bi huy

• Vi dụ 1 giao dich chuyển tiên điện tử tư A -> B, gôm 1 nhóm lệnh cần thưc hiện đông thơi.

User A User B

Trư tiên A Cộng tiên BTrư tiên A Không cộng BMât điện

RollBackCộng tiên lai

cho A ^^!

Page 33: JDBC

Cai đặt một giao dich

• Tắt chê độ auto-commit tư Connectioncon.setAutoCommit(false);

• Thưc hiện cac lệnh trong giao dich• Thưc hiện Commit

con.commit();• Bật lai chê độ auto-commit nêu không dung giao

dich nưacon.setAutoCommit(true);

• Nêu bắt được lôi thi rollbackcon.rollback();

Page 34: JDBC

Huy một giao dich

• Trong qua trinh thưc hiện giao dich, nêu có sai sót nao xảy ra, ta có thể huy giao dich đang được thưc hiện nửa chưng bằng cach sử dụng rollback

• Connection.rollback() sẽ khôi phục dư liệu đên thơi điểm nó được commit gần nhât– Tuy vao DBMS ma cach rollback có thể khac

nhau

Page 35: JDBC

String insertQuery = "INSERT INTO Goods (Name, Price,Descrip) VALUES(?,?,?)";

if (con != null){ try{ con.setAutoCommit(false); PreparedStatement pStm =

con.prepareStatement(insertQuery); pStm.setString(1, "Biscuit"); pStm.setInt(2, 1000); pStm.setString(3,"Banh"); pStm.executeUpdate(); pStm.setString(1, "Pen"); pStm.setInt(2, 2000); pStm.setString(3,"But"); pStm.executeUpdate(); pStm.close();

con.commit(); con.setAutoCommit(true); } catch(SQLException e) { con.rollback(); }

}

Tắt autoCommit

Thực hiện câu lệnh 1

Thực hiện câu lệnh 2

Thực hiện CommitBật lai autoCommit

Rollback nếu có lỗi

Transaction