1/29/2012
N i dung
B môn Công ngh Ph n m m
Vi n CNTT & TT
Tr ng
i h c Bách Khoa Hà N i
Chuyên đ 2
L p trình JSP, Servlet
Bài 02: C b n v JDBC
1.
2.
3.
4.
5.
JDBC là gì?
Cức b c s d ng API c a JDBC
DataSource & k thu t Connection Pooling
Transaction
Prepared & Callable Statements
Gi ng viên: ThS. Tr nh Tu n t
B môn CNPM
Email: /
2
JDBC là gì?
1. JDBC là gì?
Là cức API Java chu n t c đ truy c p CSDL
quan h
ng d ng không c n quan tâm t i chi ti t c th
c a CSDL
N m trong Java SE (J2SE)
Java SE 6 có phiên b n JDBC 4
4
3
JDBC API
nh ngh a m t t p cức Java Interfaces, đ c cài
đ t b i cức vendor khức nhau, thành cức JDBC
Drivers
Là cài đ t c th c a cức JDBC interfaces
Cức ng d ng s d ng t p cức giao di n này đ th c
hi n cức thao tức v i CSDL Tính portability
Ph n l n API c a JDBC n m trong gói java.sql
JDBC Driver
T t c cức database server đ u có JDBC driver(s)
t ng ng
Có th xem danh sứch cức drivers đã có trên
/>
DriverManager, Connection, ResultSet,
DatabaseMetaData, ResultSetMetaData,
PreparedStatement, CallableStatement và Types
M t s ch c n ng nâng cao khức n m trong gói
javax.sql package
DataSource
5
6
1
1/29/2012
Database URL
c s d ng đ t o m t k t n i t i database
2. Cức b
Cú pháp:
Có th ch a server, port, protocol, etc.
jdbc:subprotocol_name:driver_dependant_databasename
c s d ng JDBC API
Ví d :
Oracle thin driver
Derby
Pointbase
jdbc:oracle:thin:@machinename:1521:dbname
jdbc:derby://localhost:1527/sample
jdbc:pointbase:server://localhost/sample
7
Cức b
8
c s d ng JDBC
B1. Load JDBC driver cho t ng lo i CSDL
B1. Load JDBC driver cho t ng lo i CSDL
B2. L y đ i t ng Connection
B3. L y đ i t ng Statement
B4. Th c hi n câu truy v n, câu l nh update
B5.
c k t qu tr v
B6.
c cức Meta-data (tùy ch n)
B7. óng đ i t ng Statement và đ i t ng
Connection
load v driver cho CSDL và đ ng ký nó
v i DriverManager, c n load class t ng ng
Class.forName(<database-driver>)
try {
// This loads an instance of the Pointbase DB Driver.
// The driver has to be in the classpath.
Class.forName("org.apache.derby.jdbc.ClientDriver");
}catch (ClassNotFoundException cnfe){
System.out.println("" + cnfe);
}
9
B2. L y ra đ i t
ng Connection
DriverManager & Connection
L p DriverManager ch u trứch nhi m t o k t n i t i
CSDL
10
java.sql.DriverManager
S d ng DataSource là cứch hay dùng h n khi mu n l y
ra m t đ i t ng connection (trình bày ph n sau)
Ví d t o k t n i t i CSDL nh sau:
try {
Connection connection = DriverManager.
getConnection("jdbc:derby://localhost:1527/sample",
“app"," app ");
java.sql.Connection
} catch(SQLException sqle) {
System.out.println("" + sqle);
}
11
getConnection(String url, String user, String password)
throws SQLException
Statement createStatement() throws SQLException
void close() throws SQLException
void setAutoCommit(boolean b) throws SQLException
void commit() throws SQLException
void rollback() throws SQLException
12
2
1/29/2012
B3. L y ra đ i t
T om tđ it
Connection
ng
T đ i t ng Statement, 2 l nh đ
d ng nhi u nh t là
cs
(a) QUERY (SELECT)
ResultSet executeQuery(string sql)
int executeUpdate(String sql)
ResultSet rs = statement.executeQuery("select * from
customer_tbl");
Ví d :
ng Statement t đ i t
B4. Th c thi cức câu truy v n/cức l nh
java.sql.Statement
ng Statement
Statement statement = connection.createStatement();
(b) ACTION COMMAND (UPDATE/DELETE)
Cùng đ i t ng Statement có th đ c dùng
cho nhi u queries không liên quan t i nhau
int iReturnValue = statement.executeUpdate("update
manufacture_tbl set name = ‘IBM' where mfr_num =
19985678");
14
13
B5. X lý k t qu nh n v
Duy t trên ResultSet đ x lý thông tin
boolean next()
xxx getXxx(int columnNumber)
xxx getXxx(String columnName)
void close()
u tiên, con tr l p n m
tiên
java.sql.ResultSet
B5. X lý k t qu nh n v (2)
tr
Khi đã có ResultSet, LTV d dàng x lý d
li u
L u ý: Ch s c a ResultSet b t đ u t 1
while (rs.next()){
// Wrong this will generate an error
String value0 = rs.getString(0);
c hàng đ u
// Correct!
String value1 = rs.getString(1);
int
value2 = rs.getInt(2);
LTV c n g i ph ng th c next() đ chuy n con
tr đ n hàng đ u tiên
int
value3 = rs.getInt(“ADDR_LN1");
}
15
16
B6.
c metadata c a ResultSet và
metadata c a CSDL (tùy ch n)
B5. X lý k t qu nh n v (3)
Mu n l y d li u t ResultSet, s d ng
ph ng th c getXXX() cho phù h p
getString()
getInt()
getDouble()
getObject()
M i ki u d li u trong java.sql.Types, đ u có
ph ng th c getXXX t ng ng
Khi đã có đ i t ng ResultSet ho c
Connection, LTV có th l y v metadata c a
CSDL ho c c a câu truy v n
em l i thông tin h u ích v d li u l y
v , ho c v CSDL đang s d ng
ResultSetMetaData rsMeta = rs.getMetaData();
DatabaseMetaData dbmetadata =
connection.getMetaData();
17
Có kho ng 150 ph ng th c trong l p
DatabaseMetaData
18
3
1/29/2012
Ví d v ResultSetMetaData
ResultSetMetaData meta = rs.getMetaData();
3. DataSource & k thu t
Connection Pooling
//Return the column count
int iColumnCount = meta.getColumnCount();
for (int i =1 ; i <= iColumnCount ; i++){
System.out.println(“Column Name: " + meta.getColumnName(i));
System.out.println(“Column Type" + meta.getColumnType(i));
System.out.println("Display Size: " + meta.getColumnDisplaySize(i) );
System.out.println("Precision: " + meta.getPrecision(i));
System.out.println(“Scale: " + meta.getScale(i) );
}
19
20
3.1. Giao di n javax.sql.DataSource và đ i
t ng DataSource
3. DataSource & k thu t Connection Pooling
3.1. Giao di n DataSource và đ i t ng DataSource
3.2. Cức thu c tính c a đ i t ng DataSource
3.3. ng ký JNDI c a đ i t ng DataSource
3.4. Connection Pooling
3.5. L y v đ i t ng DataSource
T ng nhà cung c p Driver s th c thi cài đ t
interface
i t ng DataSource dùng đ t o cức k t
n i CSDL (database connections)
21
22
Giao di n javax.sql.DataSource và đ i
t ng DataSource
3.2. Cức thu c tính c a đ i t
DataSource
Có 3 ki u cài đ t interface
Basic implementation: cung c p đ i t ng
Connection chu n t c
Connection pooling implementation: cung c p đ i
t ng Connection t đ ng n m trong connection
pooling
Distributed transaction implementation: cung c p
đ i t ng Connection có th dùng đ c cho cức
giao d ch (transactions) phân tứn, h u h t n m
trong connection pooling
23
M t đ i t ng DataSource có cức thu c tính có th s a
đ i khi c n thi t-đ c đ nh ngh a trong file c u hình
c a container
ng
a ch c a database server
Tên c a database
Network protocol đ c s d ng đ giao ti p v i server
L i ích: vì thay đ i đ c thu c tính c a DataSource, cức
đo n code truy c p t i DataSource đó không c n thay
đ i
Trong Sun Java System Application Server (và GlassFish
V2), m t data source đ c g i là m t JDBC resource
24
4
1/29/2012
Cức thu c tính c a m t DataSource đ
đ nh ngh a đâu?
DataSource (JDBC Resource) trong file
domain.xml c a Sun Java System App Server
Trong file c u hình c a container
Trong Sun Java System App Server:
c
<J2EE_HOME>/domains/domain1/config/domain
.xml
Trong Tomcat:
<TOMCAT_HOME>/conf/server.xml
<resources>
object-type="user" pool-name="PointBasePool"/>
fail-all-connections="false" idle-timeout-in-seconds="300"
is-connection-validation-required="false" is-isolationlevel-guaranteed="true" max-pool-size="32" max-wait-time-inmillis="60000" name="PointBasePool" pool-resize-quantity="2"
res-type="javax.sql.XADataSource" steady-pool-size="8">
value="jdbc:pointbase:server://localhost:9092/sun-appservsamples"/>
</jdbc-connection-pool>
</resources>
25
26
nh ngh a DataSource trong Sun Java
System App Server
nh ngh a DataSource trong Sun Java
System App Server (2)
27
3.3.
ng ký JNDI c a đ i t
DataSource
28
ng
3.3.
ng ký JNDI c a đ i t ng
DataSource (JDBC Resource)
M t driver đ c truy c p t m t đ i t ng
DataSource s không đ ng ký nó v i
DriverManager
Th c t , m t đ i t ng DataSource đ c
đ ng ký v i JNDI naming service nh
container và tr v cho client qua thao tức
tra c u (lookup operation)
V i ki u basic implementation, k t n i l y
đ c t đ i t ng DataSource là gi ng v i
k t n i l y đ c t DriverManager
nh danh JNDI c a m t JDBC resource có d ng
java:comp/env/jdbc
Vì t t c cức đ nh danh JNDI c a cức resource đ u
có d ng java:comp/env, nên khi c n ch ra đ nh
danh JNDI c a m t JDBC resource, ch c n nh p
vào jdbc/name.
29
Ví d : JNDI name cho BookDB database
java:comp/env/jdbc/BookDB
Ví d : jdbc/BookDB
30
5
1/29/2012
3.5. L y và s d ng đ i t
DataSource
3.4. T i sao c n Connection Pooling?
K t n i CSDL là tài nguyên có chi phí cao, và
b h n ch
S d ng connection pooling, ch c n 1 s nh cức
connections có th đ c dùng chung cho 1 s
l n clients
T o và h y cức k t n i CSDL là thao tức có
chi phí cao
S d ng connection pooling, có s n m t t p cức
k t n i s n dùng, h n ch t o m i/h y cức
connection
ng
ng d ng th c hi n thao tức tra c u JNDI (JNDI
lookup) đ l y v đ i t ng DataSource
i t ng DataSource sau đó dùng đ l y ra đ i
t ng Connection
Trong file web.xml c a ng d ng, c n ch ra thông
tin v external resource, & v đ i t ng DataSource
Trong Sun Java System App server, c n ứnh x
gi a external resource v i JNDI name
T ng tính flexibility
31
Ví d : L y đ i t
JNDI
ng DataSource qua
32
Thông tin v JNDI Resource trong file web.xml
c a ng d ng bookstore1
BookDBAO.java trong ng d ng bookstore1
<resource-ref>
<res-ref-name>jdbc/BookDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
( />public class BookDBAO {
private ArrayList books;
Connection con;
private boolean conFree = true;
public BookDBAO() throws Exception {
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/BookDB");
con = ds.getConnection();
} catch (Exception ex) {
throw new Exception("Couldn't open connection to database: " +
ex.getMessage());
}
}
34
33
Mapping gi a JNDI và Resource trong file
sun-web.xml
<sun-web-app>
<context-root>/bookstore1</context-root>
<resource-ref>
<res-ref-name>jdbc/BookDB</res-ref-name>
<jndi-name>jdbc/BookDB</jndi-name>
</resource-ref>
</sun-web-app>
4. Transaction
35
36
6
1/29/2012
Transaction
Cức ph
Vi c commit t ng câu l nh m t ngay khi
đ c yêu c u tiêu t n nhi u th i gian
Khi thi t l p AutoCommit là false, LTV có th
c p nh t CSDL nhi u l n, sau đó commit
toàn b trong m t transaction
Ngoài ra, n u cức l nh ph thu c l n nhau,
toàn b transaction có th đ c rolled back
setAutoCommit()
N u thi t l p là true, t t c cức l nh th c thi (executed
statement) s đ c commit ngay l p t c
commit()
Ch h p l khi đã thi t l p setAutoCommit(false)
Commit t t c cức thao tức đ c th c hi n, t lúc m
m t Connection ho c t l i g i commit() ho c rollback()
g n nh t
ng th c trong JDBC Transaction
rollback()
Ch h p l khi đã thi t l p setAutoCommit(false)
H y t t c cức thao tức v a th c hi n
37
38
Ví d v Transactions
Ví d v Transactions (2)
Connection connection = null;
int [][] arrValueToUpdate =
try {
connection =
DriverManager.getConnection("jdbc:oracle:thin:@machinename:1521:db
name","username","password");
connection.setAutoCommit(false);
{ {123, 500} ,
{124, 250},
{125, 10},
{126, 350} };
int iRecordsUpdate = 0;
for ( int items=0 ; items < arrValueToUpdate.length ; items++) {
PreparedStatement updateQty =
connection.prepareStatement("UPDATE STORE_SALES SET QTY = ?
WHERE ITEM_CODE = ? ");
int itemCode = arrValueToUpdate[items][0];
int qty = arrValueToUpdate[items][1];
40
39
Ví d v Transactions (3)
Ví d v Transactions (4)
updateQty.setInt(1,qty);
updateQty.setInt(2,itemCode);
iRecordsUpdate += updateQty.executeUpdate();
try {
connection.rollback();
} catch(SQLException sqleRollback) {
System.out.println("" + sqleRollback);
}
}
finally {
try {
connection.close();
}
catch(SQLException sqleClose) {
System.out.println("" + sqleClose);
}
}
}
connection.commit();
System.out.println(iRecordsUpdate +
" record(s) have been updated");
} catch(SQLException sqle) {
System.out.println("" + sqle);
41
42
7
1/29/2012
nh ngh a?
5. Prepared &
Callable Statements
PreparedStatement
Câu l nh SQL đ c g i đ n CSDL, đ
ho c đ c chu n b tr c
c biên d ch
CallableStatement
Th c thi cức SQL Stored Procedures
44
43
PreparedStatement
Cức b
ôi khi, nhi u câu l nh có c u trúc t ng t
nhau, ch có giứ tr là thay đ i
PreparedStatement có th đ c s d ng đ
so n tr c câu l nh có c u trúc c n thi t
PreparedStatement có th nh n cức tham s
VÀO, ho t đ ng t ng t cức đ i s cho m t
ph ng th c
c làm vi c v i PreparedStatement
B1: T o DB connection nh bình th ng
B2: T o đ i t ng prepared statement t
connection
PreparedStatement updateSales = con.prepareStatement(“UPDATE
OFFER_TBL SET QUANTITY = ? WHERE ORDER_NUM = ? ");
// “?” are referred to as Parameter Markers
// Parameter Markers are referred to by number,
//
starting from 1, in left to right order.
// PreparedStatement's setXXX() methods are used to set
//
the IN parameters, which remain set until changed.
45
Cức b
c làm vi c v i PreparedStatement (2)
Cức b
B3. Truy n vào cức đ i s theo đúng v trí
updateSales.setInt(1, 75);
updateSales.setInt(2, 10398001);
46
B4. Th c thi prepared statement
int iUpdatedRecords =
updateSales.executeUpdate();
c làm vi c v i PreparedStatement (3)
N u thu c tính AutoCommit là true, khi th c
thi câu l nh, thay đ i s đ c commit. T đó
v sau, có th s d ng l i đ i t ng
Prepared Statement này.
updateSales.setInt(1, 150);
updateSales.setInt(2,10398002);
47
48
8
1/29/2012
PreparedStatement
CallableStatement
N u đ i t ng prepared statement có ki u là câu
l nh select, sau khi th c thi và l y v k t qu , ti n
hành duy t trên ResultSet nh ph n tr c
PreparedStatement itemsSold =
con.prepareStatement("select o.order_num,
o.customer_num, c.name, o.quantity from order_tbl
o, customer_tbl c where o.customer_num =
c.customer_num and o.customer_num = ?;");
itemsSold.setInt(1,10398001);
ResultSet rsItemsSold = itemsSold.executeQuery();
while (rsItemsSold.next()){
System.out.println( rsItemsSold.getString(“NAME")
+ " sold "+ rsItemsSold.getString(“QUANTITY") + "
unit(s)");
49
}
Là giao di n đ c s d ng đ th c thi cức
SQL stored procedures
M t stored procedure là m t nhóm cức câu
l nh SQL th c hi n m t công vi c nào đó
Stored procedures đ c s d ng đ đóng gói
m t t p cức thao tức ho c truy v n trên m t
database server.
50
Ví d CallableStatement
CallableStatement (2)
M t đ i t ng CallableStatement ch a l i g i
đ n m t stored procedure; nó không ch a
chính stored procedure này.
Ví d : g i đ n stored procedure
SHOW_SUPPLIERS s d ng connection con
và tr v ResultSet
CallableStatement cs = con.prepareCall("{call
SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();
51
Ví d s d ng cức tham s IN, OUT và
INOUT
// set int IN parameter
cstmt.setInt( 1, 333 );
// register int OUT parameter
cstmt.registerOutParameter( 2, Types.INTEGER );
// set int INOUT parameter
cstmt.setInt( 3, 666 );
// register int INOUT parameter
cstmt.registerOutParameter( 3, Types.INTEGER );
//You then execute the statement with no return value
cstmt.execute(); // could use executeUpdate()
// get int OUT and INOUT
int iOUT = cstmt.getInt( 2 );
int iINOUT = cstmt.getInt( 3 );
Ví d v i Oracle DB
Ví d Stored Procedure
FUNCTION event_list (appl_id_in
dow_in
event_type_in
status_in
RETURN ref_cur;
52
VARCHAR2,
VARCHAR2,
VARCHAR2 OUT,
VARCHAR2 INOUT)
try {
Connection connection = DriverManager.getConnection("");
CallableStatement queryreport = connection.prepareCall("{
? = call SRO21208_PKG.QUEUE_REPORT ( ? , ? , ? , ? , ?
, ? ) }");
queryreport.registerOutParameter(1,OracleTypes.CURSOR);
queryreport.setInt(2,10);
queryreport.setString(3, "000004357");
queryreport.setString(4, "01/07/2003");
queryreport.setString(5, "N");
queryreport.setString(6, "N");
queryreport.setString(7, "N");
queryreport.setInt(8, 2);
53
54
9
1/29/2012
Ví d v i Oracle DB
queryreport.execute();
ResultSet resultset = (ResultSet)queryreport.getObject(1);
while (resultset.next())
{
System.out.println("" + resultset.getString(1) + " "
+ resultset.getString(2));
}
}
catch( SQLException sqle){
System.out.println("" + sqle);
}
55
10