You are on page 1of 17

Chng 9

X l c s d liu trong Java


Cc ng dng Internet ngy nay thng c da trn cc c s d liu ln c ci t bng cch s dng cng ngh c s d liu quan h. K t khi xut hin t nm 1995, Java c yu cu cn cung cp kh nng kt ni vi cc c s d liu quan h hin c nh Ingres, Oracle, Access, v SQL Server,Cc tin ch cho php truy xut c s d liu nm trong gi java.sql. Ngy nay cc thng tin vi dung lng ln u c lu tr trong cc kho d liu ln. Kh nng truy xut ti cc c s d liu l iu khng th thiu i vi cc ng dng. iu ny li cng ng vi cc ng dng chy trn mng my tnh ni chung v Internet ni ring. Trong chng ny chng ta s i vo tm hiu giao din lp trnh ng dng JDBC ca Java v cch thc kt ni vi mt c s d liu t mt ng dng Java thng qua JDBC.

1. JDBC Java Database Connectivity API


SUN pht trin mt giao din lp trnh ng dng API truy xut c s d liuJDBC. Mc tiu t ra ca SUN l: JDBC l mt giao din lp trnh ng dng mc SQL. JDBC cn c c nhng kinh nghim lm vic vi cc API c s d liu hin c. JDBC cn n gin

Giao din lp trnh ng dng mc SQL ngha l JDBC cho php ta xy dng cc lnh SQL v nhng cc lnh SQL bn trong cc li gi Java API. Ni tm li, v c bn ta vn s dng SQL nhng JDBC cho php ta dch mt cch tri chy gia th gii c s d liu v th gii ng dng Java. Kt qu ca bn t c s d liu, c tr v di dng cc i tng Java v nu c vn khi truy xut n s a ra cc ngoi l. JDBC API chun ha: Cch thit lp ti c s d liu Cch tip cn khi to cc truy vn Cch thc to ra cc truy vn c tham s Chun ha cu trc d liu ca kt qu truy vn o Xc nh s ct

o Tra tm cc metadata.
JDBC API cha chun ha c php SQL. JDBC khng phi l SQL nhng. Lp JDBC nm trong gi java.sql. N bao gm hai phn: JDBC API l mt giao din lp trnh ng dng vit bng ngn ng Java thun ty. Trnh qun l Driver JDBC truyn tin vi cc trnh iu khin c th ca nh sn xut, cc trnh iu khin c s d liu ca nh sn xut truyn tin vi c s d liu.

2. Cu trc ca JDBC
JDBC thc hin cc mc tiu ca n thng qua mt tp hp cc giao tip JDBC, mi giao tip thc c thc hin bi tng nh sn xut. Tp hp cc lp thc thi cc giao tip JDBC cho mt m t c s d liu c th c gi l mt trnh iu khin JDBC. Khi xy dng mt ng dng c s d liu, ta khng phi xem xt n tt c cc lp c s. JDBC che du cc chi tit ca tng c s d liu v nh vy ta ch cn quan tm n ng dng ca mnh.

Hnh 9.1 Cc c s d liu v cc trnh iu khin

Hnh 9.2 2.1. Kiu 1 Cc trnh iu khin ny s dng mt cng ngh cu ni truy xut ti mt c s d liu. Cu ni JDBC-ODBC c bt u a vo t JDK 1.2 l mt v d in hnh cho kiu driver ny. N cung cp mt gateway ti API ODBC. Ci t ca API ny thc hin truy xut ti c s d liu thc t. Gii php cu ni thng yu cu phn mm phi c ci t trn h thng client, ngha l chng khng phi l cc gii php tt cho cc ng dng m khng cho php ci t phn mm trn client. Cu ni JDBC-ODBC cung cp cch truy xut thng qua mt hay nhiu trnh iu khin ODBC. u im: y l mt cch tip cn tt hc JDBC. Hu ch cho cc cng ty ci t trnh iu khin ODBC trn tng my client. o y l cch duy nht truy xut c ti cc c s d liu trn my tnh bn mc thp. Nhc im: o o o Khng ph hp vi cc ng dng quy m ln. Hiu nng thp v c cn nhiu cng on cn thc hin chuyn t JDBC sang ODBC. o Khng h tr tt c cc c trng ca Java. o Ngi s dng b hn ch bi chc nng do trnh iu khin ODBC cung cp. 2.2. Kiu 2 Cc trnh iu khin kiu 2 l cc trnh iu khin API-trnh iu khin gc. iu ny ngha l m Java gi cc phng thc C hoc C++ c cung cp bi tng nh sn

xut h qun tr c s d liu thc hin truy xut ti c s d liu. Gii php ny vn yu cu phi c phn mm trn h thng client. JDBC chuyn cc li gi ti JDBC API thnh cc li gi kt ni vi giao din lp trnh ng dng ca my khc cho mt c s d liu c th nh IBM, Informix, Oracle, hoc Sybase. u im: Hiu nng tt hn kiu 1, v trnh iu khin kiu 2 cha cc m lnh c bin dch c ti u ha cho h iu hnh ca server c s d liu hot ng ch hu trng, Nhc im o o o 2.3. Kiu 3 Cc trnh iu khin kiu 3 cung cp cho client mt API mng chung, API ny sau chuyn thnh thao tc truy xut c s d liu mc server. Mt khc, trnh iu khin JDBC trn client s dng cc socket gi mt ng dng trung gian (middleware) trn server chuyn cc yu cu ca client thnh mt API c th i vi tng server. Kt qu l trnh iu khin ny c bit linh hot, v n khng cn phi c phn mm ci t trn client v mt trnh iu khin c th cung cp kh nng truy xut ti nhiu c s d liu. Java Middleware thun tu Trnh iu khin Java thun ty cho cc chng trnh trung gian c s d liu dch cc li gi JDBC cho giao thc ca nh sn xut phn mm trung gian, trnh iu khin ny sau c chuyn cho mt giao thc gn vi c s d liu c th bi phn mm server trung gian. u im: o o o c s dng khi mt cng ty c nhiu c s d liu v mun s dng mt trnh iu khin JDVC kt ni vi tt c cc c s d liu. Trnh iu khin nm trn server, v th khng cn trnh iu khin JDBC trn tng my client Thnh phn server c ti u ha cho h iu hnh ang chy ch hu trng Cn m lnh cho c s d liu c th trn server trung gian Ngi s dng cn m bo rng trnh iu khin JDBC ca nh sn xut c s d liu c trn tng my khch. Phi c chng trnh c bin dch cho mi h iu hnh m ng dng s chy. Ch s dng c hiu qu trong cc mi trng c kim sot nh mt mng intranet

Nhc im: o

2.4. Kiu 4 S dng cc giao thc mng c tch hp sn vo engine c s d liu, cc driver kiu 4 truyn tin trc tip vi c s d liu bng cch s dng socket Java. y l trnh iu khin Java thun ty nht. Kiu trnh iu khin ny thng do nh sn xut c s d liu cung cp. Trnh iu khin Java thun ty ti kt ni trc tip vi c s d liu chuyn cc li gi JDBC thnh cc gi tin c truyn i trn mng theo mt khun dng c s dng bi c s d liu c th. Cho php mt li gi trc tip t my client ti c s d liu. u im:

Khng cn ci phn mm c bit no trn client hoc server. C th c ti v mt cch linh hot

Nhc im o Khng ti u cho h iu hnh server v vy trnh iu khin khng th tn dng cc c trng u vit ca h iu hnh

3. Kt ni c s d liu

Hnh 10.3 Hnh v trn cho thy cch thc m mt ng dng JDBC truyn tin vi mt hoc nhiu c s d liu m khng cn bit n cc chi tit c lin quan n ci t driver cho c s d liu . Mt ng dng s dng JDBC nh l mt giao tip, thng qua n truyn tt c cc yu cu lin quan n c s d liu ca n. Khi ta vit cc applet hay ng dng c s d liu, ta c th cung cp cc thng tin c th v trnh iu khin JDBC l URL c s d liu. Thm ch ta c th nhp vo URL c s d liu cho ng dng v applet vo thi gian chy di dng cc tham s. JDBC l gi kt ni c s d liu bao gm giao din lp trnh ng dng cn bn Java API. Java cung cp mt interface c lp vi c s d liu m mt kt ni ti c s d liu, bng cch pht ra cc li gi SQL ti c s d liu v nhn v kt qu l mt tp hp cc d liu. gc k thut, JDBC ng vai tr nh l mt chng trnh ci t giao tip mc li gi SQL c nh ngha bi X/Open v c h tr bi hu ht cc nh cung cp c s d liu quan h. thc hin giao tc vi mt kiu c s d liu c th, ta cn phi c mt trnh iu khin JDBC ng vai tr nh l mt cu ni gia cc li gi phng thc JDBC v interface c s s liu. 3.1. DriverManager DriverManager cung cp phng tin np cc trnh iu khin c s d liu vo mt ng dng Java hoc mt applet; n chnh l cch JDBC thit lp mt lin kt vi c s d liu. ng dng Java, trc tin to mt i tng DriverManager, kt ni vi c s d liu bng cch gi phng thc tnh getConnection() ca lp DriverManager, vi tham chiu truyn vo ging nh mt URL c gi l URL c s d liu. DriverManager tm kim mt driver h tr vic kt ni trong tp hp cc driver hin c. Nu tm thy driver n truyn a ch c s d liu cho driver v yu cu driver to ra mt kt ni. Kt ni ti c s d liu c tr v di dng mt i tng Connection. Tt c cc driver JDBC cung cp mt ci t giao tip java.sql.Driver. Khi mt DriverManager c to ra, n ti mt tp hp cc driver c xc nh bi thuc tnh ca java.sql.Driver. Driver c np vo thi gian chy Java, n c nhim v to ra mt i tng v ng k i tng vi DriverManager. Cc driver cn cho ng dng c th c np bi phng thc Class.forName()

Driver myDriver=(Driver)Class.forName(specialdb.Driver); 3.2. Connection Mi khi cc driver cn thit c np bi DriverManager, s c mt lin kt vi mt c s d liu c to ra nh phng thc getConnection() ca lp DriverManager. C s d liu cn lm vic c xc nh thng qua mt tham s String ng vai tr nh l a ch tham chiu ti c s d liu. Khng c mt khun dng chun no cho a ch xu c s d liu; DriverManager truyn xu a ch cho tng driver JDBC c np v xem n c hiu v h tr kiu c s d liu c xc nh. Jdbc:odbc:financedata Trong financedata l ngun c s d liu cc b. truy xut ti mt c s d liu t xa t mt my client ta c th dng c php sau: Jdbc:odbc:drvr://dataserver.foobar.com:500/financedata. c t JDBC API khuyn co mt URL c s d liu nn c dng nh sau: Jdbc:<sub-protocol>:<sub-name> Trong <sub-protocol> xc nh dch v kt ni c s d liu v <sub-name> cung cp tt c cc thng tin cn thit dch v tm c s d liu v kt ni ti n. Phng thc getConnection() trn DriverManager hoc l tr v mt i tng Connection biu din lin kt ti c s d liu c ch ra, hoc l a ra ngoi l nu lin kt khng c thit lp. 3.3. Statement Giao tip Connection cho php ngi s dng to ra mt cu lnh truy vn ti c s d liu. Cc lnh truy vn c biu din di dng cc i tng Statement hoc cc lp con ca n. Giao tip Connection cung cp ba phng thc to ra cc lnh truy vn c s d liu l: createStatement(), prepareStatement(), v precpareCall(). createStatement() c s dng cho cc lnh SQL n gin khng lin quan n cc tham s. Phng thc ny tr v mt i tng Statement c s dng pht tra cc truy vn SQL ti c s d liu, bng cch s dng phng thc executeQuery(). Phng thc ny chp nhn mt lnh SQL nh l mt xu v cc kt qu tr v l di dng mt i tng ResultSet. Cc phng thc khc c trong giao tip Statement pht ra cc lnh SQL ti cc c s d liu l phng thc execute(), phng thc ny c s dng cho cc truy vn SQL v tr v nhiu resultset v phng thc executeUpdate() c s dng pht ra cc lnh INSERT, UPDATE, hoc DELETE. Ngoi giao tip Statement c bn, mt i tng Connection c th c s dng to ra mt i tng PreparedStatement v cc CallableStatement biu din cc th tc stored procedure trong c s d liu. Mt lnh SQL c th lin quan n nhiu tham s u vo, hoc mt lnh m ta mun x l nhiu ln, c th c to ra bng cch s dng lnh prepareStatement() trn i tng Connection, phng thc ny tr v i tng PreparedStatement. Lnh SQL c truyn cho phng thc prepareStatement() l mt lnh c bin dch trc v vy vic x l nhiu ln mt lnh s hiu qu hn. Lp con ca lp Statement h tr vic thit lp cc gi tr ca cc tham s u vo c bin dch trc thng qua cc phng thc setXXX(). i tng PreparedStatement c phng thc executeQuery() khng cn tham s, thay vo n x l cc lnh SQL c bin dch trc trn c s d liu. Ch rng khng phi tt c cc nh sn xut c s d iu hoc cc driver JDBC u h tr cc lnh c bin dch trc. 3.4. ResultSet Cc dng d liu c tr v t vic x l mt lnh c biu din bng mt ResultSet trong JDBC. V d, phng thc executeQuery() ca Statement tr v mt i tng ResultSet. i tng ResultSet cung cp cc cch duyt qua cc dng d liu c tr v t vic x l cu lnh truy vn SQL thng qua phng thc next() ca n; cc trng d liu trong mi hng c th c tm kim thng qua cc tn hoc ch mc ct bng cch s dng phng thc getXXX(). Ngi dng cn phi bit kiu d liu

trong mi ct d liu c tr v, v mi mc d liu c tm kim thng qua cc phng thc getXXX() c kiu c th. Ty thuc vo kiu trnh iu khin JDBC c ci t, vic duyt qua cc hng d liu trong i tng ResultSet c th to ra hiu ng ly d liu t c s d liu, hoc ng gin l tr v tng hng d liu t cache. Nu hiu nng ca cc giao dch l vn i vi ng dng, ta cn xc nh d liu tr v c qun l nh th no bi cc trnh iu khin ca nh sn xut. Lu : Gi tr tr li ca hm getXXX(args) l d liu ca trng c tn l args ca cc dng d liu c chn ra. Ngoi ra cng cn phn bit cc kiu ca Java vi cc kiu d liu ca SQL. Bng di y m t cc kiu d liu tng ng ca Java, SQL v cc hm getXXX(). Kiu ca SQL CHAR VARCHAR LONGVARCHAR NUMBERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP Kiu ca Java String String String java.math.BigDecimal java.math.BigDecimal Boolean (boolean) Integer (byte) Integer (short) Integer (int) Long (long) Float (float) Double (double) Double (double) byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Timestamp Bng 10.1 Hm getXXX() getString() getString() getString() getBigDecimal() getBigDecimal() getBoolean() getByte() getShort() getInt() getLong() getFloat() getDouble() getDouble() getBytes() getBytes() getBytes() getDate() getTime() getTimestamp()

4. Lp DatabaseMetaData
Mun x l tt cc d liu ca mt CSDL th chng ta phi bit c nhng thng tin chung v cu trc ca CSDL nh: h QTCSDL, tn ca cc bng d liu, tn gi ca cc trng d liu, v.v . bit c nhng thng tin chung v cu trc ca mt h CSDL, chng ta c th s dng giao din java.sql.DatabaseMetaData thng qua hm getMetaData(). DatabaseMetaData dbmeta = con.getMetaData(); trong , con l i tng kt ni c to ra bi lp Connection. Lp DatabaseMetaData cung cp mt s hm c np chng xc nh c nhng thng tin v cu hnh ca mt CSDL. Mt s hm cho li i tng ca String (getURL()), mt s tr li gi tr logic (nullsAreSortedHigh()) hay tr li gi tr nguyn nh

hm getMaxConnection()). Nhng hm khc cho li kt qu l cc i tng ca ResultSet nh: getColumns(), getTableType(), getPrivileges(), v.v.

5. Lp ResultSetMetaData
Giao din ResultSetMetaData cung cp cc thng tin v cu trc c th ca ResultSet, bao gm c s ct, tn v gi tr ca chng. V d sau l mt chng trnh hin th cc kiu v gi tr ca tng trng ca mt bng d liu. V d 9.3 Chng trnh hin th mt bng d liu. import java.sql.*; import java.util.StringTokenizer; public class TableViewer { final static String jdbcURL = "jdbc:odbc:StudentDB"; final static String jdbcDriver = "sun.jdbc:odbc:JdbcOdbcDriver"; final static String table = "STUDENT"; public static void main(java.lang.String[]args) { System.out.println("---Table Viewer ---"); try { Class.forName(jdbcDriver); Connection con = DriverManager.getConnection(jdbcURL, "", ""); Statement stmt = con.createStatement(); // c ra c bng Student v a vo i tng rs ResultSet rs = stmt.executeQuery("SELECT * FROM " + table); // c ra cc thng tin v rs ResultSetMetaData rsmd = rs.getMetaData(); // Xc nh s ct ca rsmd int colCount = rsmd.getColumnCount(); for(int col = 1; col <= colCount; col++) { // In ra tn v kiu ca tng trng d liu trong rsmd System.out.print(rsmd.getColumnLabel(col)); System.out.print(" (" + rsmd.getColumnTypeName(col) + ")"); if(col < colCount) System.out.print(", "); } System.out.println(); while(rs.next()){ // In ra dng d liu trong rsmd for(int col = 1; col <= colCount; col++)

{ System.out.print(rs.getString(col)); if(col < colCount) System.out.print(" "); } System.out.println(); } rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("Unable to load database driver class"); } catch (SQLException se) { System.out.println("SQL Exception: " + se.getMessage()); } } }

6. Cc bc c bn kt ni vi c s d liu t mt ng dng Java


Bc 1: Np trnh iu khin try{ Class.forName(oracle.jdbc.driver.OracleDriver); } catch(ClassNotFoundException e) { System.out.println(Loi nap trinh dieu khien:+e); } Bc 2: Xc nh URL c s d liu String host=dbhost.yourcompany.com; String dbName=someName; int port=1234; String oracaleURL=jdbc:oracle:thin:@+host+:+port+dbName; Bc 3: Thit lp lin kt String username=hoan_td2001; String password=topsecret; Connection con=DriverManager.getConnecton(oracleURL,username,password);

Bc 4: To ra mt i tng Statement Statement s=con.createStatement(); Bc 5: X l truy vn String q=Select col1, col2, col3 from sometable; ResultSet rs=s.executeQuery(q);

Bc 6: X l kt qu while(rs.next()) System.out.println(rs.getString(1)+ + rs.getString(2)+ + rs.getString(3)); } Ct u tin c ch mc l 1 ch khng phi l 0.

Bc 7: ng lin kt con.close(); Cc v d v kt ni c s d liu t ng dng Java.

V d v kt ni kiu 1: import java.sql.*; class DBOracle1 { public static SQLException { try{

void

main(String

args[])throws

ClassNotFoundException,

//Co the dung lenh nay de tai driver Class.forName("oracle.jdbc.OracleDriver"); DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); //Lien ket toi co so du lieu Connection conn DriverManager.getConnection("jdbc:oracle:oci8:@HOAN", "scott", "tiger"); Statement stmt = conn.createStatement( ); ResultSet rset = stmt.executeQuery("select empno, ename from emp"); ResultSetMetaData rst=rset.getMetaData(); int numcol=rst.getColumnCount(); System.out.println("So cot cua bang la:"+numcol); System.out.println("Schema Name:" + rst.getTableName(1)); for(int i=1;i<numcol+1;i++)

System.out.println(rst.getColumnName(i)+" "+rst.getColumnTypeName(i)); while(rset.next( )) { System.out.println(rset.getString("empno")); System.out.println(rset.getString("ename")); } rset.close( ); stmt.close( ); conn.close( ); } catch(Exception e) { System.err.println("Ex : "+e); } } } V d v kt ni kiu 2: import java.io.*; import java.sql.*; import java.text.*; public class DBOracle2 { Connection conn; public DBOracle2( ) { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@HOAN", "scott", "tiger"); } catch (SQLException e) { System.err.println(e.getMessage( )); e.printStackTrace( ); } } public static void main(String[] args)throws Exception, IOException

10

{ new DBOracle2().process( ); } public void process( ) throws IOException, SQLException { int rows = 0; ResultSet rslt = null; PreparedStatement pstmt = null; String insert ="insert into EMP " +"( EMPNO, ENAME,JOB) " +"values " +"( ?, ?, ?)"; try { System.out.println(insert); pstmt = conn.prepareStatement(insert); pstmt.setString( 1, "EMPNO" ); pstmt.setString( 2, "ENAME" ); pstmt.setString( 3,"JOB" ); rows = pstmt.executeUpdate( ); pstmt.close( ); pstmt = null; System.out.println(rows + " rows inserted"); System.out.println(""); } catch (SQLException e) { System.err.println(e.getMessage( )); } finally { if (pstmt != null) try { pstmt.close( ); } catch(SQLException ignore) { } }

11

protected void finalize( )throws Throwable { if (conn != null) try { conn.close( ); } catch (SQLException ignore) { } super.finalize( ); } } V d v kt ni kiu 4: //Type 4 Driver import java.sql.*; import java.util.*; class DBOracle4 { public static SQLException { try{ //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Enumeration drivers = DriverManager.getDrivers(); while(drivers.hasMoreElements()) { Driver driver = (Driver)drivers.nextElement(); System.out.println("Registered Driver:"+driver.getClass().getName()); } void main(String args[])throws ClassNotFoundException,

//Lien ket toi co so du lieu Connection conn DriverManager.getConnection("jdbc:Oracle:thin:@neworacle02:1521:HOAN", "tiger"); DatabaseMetaData dbmd=conn.getMetaData(); System.out.println(dbmd.getDatabaseProductName()); System.out.println(dbmd.getDatabaseProductVersion()); Statement stmt = conn.createStatement( ); = "scott",

12

ResultSet rset = stmt.executeQuery("select empno, ename from emp"); ResultSetMetaData rst=rset.getMetaData(); int numcol=rst.getColumnCount(); System.out.println("So cot cua bang la:"+numcol); System.out.println(rst.getTableName(1)); for(int i=1;i<numcol+1;i++) System.out.println(rst.getColumnName(i)+" "+rst.getColumnTypeName(i)); while(rset.next( )) { System.out.println(rset.getString("empno")+" "+rset.getString("ename")); } rset.close( ); stmt.close( ); conn.close( ); } catch(Exception e) { System.err.println("Ex : "+e); } } }

7. S dng PreparedStatement i khi vic s dng mt i tng PreparedStatent hiu qu v tin li hn nhiu so vi vic s dng i tng Statement. Kiu lnh c bit ny l lp con ca lp Statement. Khi no cn s dng i tng PreparedStatement Nu ta mun x l mt i tng Statement nhiu ln, ta c th s dng i tng PreparedStatement gim thi gian x l. c trng chnh ca mt i tng PreparedStatement l n c cung cp trc mt lnh SQL trc khi to ra i tng. i tng PreparedStatement l mt lnh SQL c bin dch trc. iu ny ngha l khi i tng PreparedStatement c x l, h qun tr c s d liu ch cn x l lnh SQL ca PreparedStatement m khng phi bin dch n.

13

Mc d PreparedStatement c th c s dng vi cc lnh SQL khng c tham s nhng ta thng hay s dng cc lnh SQL c tham s. u im ca vic s dng lnh SQL c tham s l ta c th s dng cng mt lnh v cung cp cho n cc gi tr khc nhau mi khi x l. Ta s thy iu ny trong v d phn sau. To mt i tng PreparedStatement Ging nh cc i tng Statement, bn c c th to ra cc i tng PrepraredStatement vi mt phng thc Connection. S dng mt kt ni m trong v d trc l con, c th to ra i tng PreparedStatement nhn hai tham s u vo nh sau: PreparedStatement updateSales = con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?"); Cung cp cc gi tr cho cc tham s ca i tng PreparedStatement Ta cn cung cp cc gi tr c s dng thay cho v tr ca cc du hi nu c trc khi x l mt i tng PreparedStatement. Ta c th thc hin iu ny bng cch gi mt trong cc phng thc setXXX c nh ngha trong lp PreparedStatement. Nu gi tr ta mun thay th cho du hi (?) l kiu int trong Java, ta c th gi phng thc setInt. Nu gi tr ta mun thay th cho du (?) l kiu String trong Java, ta c th gi phng thc setString,Mt cch tng qut, ng vi mi kiu trong ngn ng lp trnh Java s c mt phng thc setXXX tng ng. V d: import java.sql.*; public class PreparedStmt{ public static void main(String args[]){ int empid; String LastName; String FirstName; String query = "SELECT * FROM Employees where EmployeeID=?;"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con =DriverManager.getConnection ("jdbc:odbc:MyData"); PreparedStatement pstmt = con.prepareStatement(query); pstmt.setInt(1,2); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { empid = rs.getInt("EmployeeID"); LastName = rs.getString("LastName"); FirstName = rs.getString("FirstName"); System.out.println(empid+", "+LastName+"\t"+FirstName+"\t"); } } catch(ClassNotFoundException e){ e.printStackTrace();

14

} catch(SQLException e){ e.printStackTrace(); } } } S dng mt vng lp thit lp cc gi tr Ta c th s dng vng lp thit lp cc gi tr cho cc tham s u vo. PreparedStatement updateSales; String updateString = "update COFFEES " + "set SALES = ? where COF_NAME like ?"; updateSales = con.prepareStatement(updateString); int [] salesForWeek = {175, 150, 60, 155, 90}; String [] coffees = {"Colombian", "French_Roast", "Espresso", "Colombian_Decaf", "French_Roast_Decaf"}; int len = coffees.length; for(int i = 0; i < len; i++) { updateSales.setInt(1, salesForWeek[i]); updateSales.setString(2, coffees[i]); updateSales.executeUpdate(); } Cc gi tr tr v ca phng thc executeUpdate Phng thc executeQuery tr v mt i tng ResultSet cha cc kt qu ca truy vn c gi ti h qun tr c s d liu, gi tr tr v khi x l phng thc executeUpdate l mt s nguyn int ch ra s hng trong bng c cp nht. updateSales.setInt(1, 50); updateSales.setString(2, "Espresso"); int n = updateSales.executeUpdate(); // n = 1 because one row had a change in it 8. S dng cc giao tc Qun l giao tc Mt giao tc l mt tp hp mt hoc nhiu lnh c x l cng vi nhau nh mt chnh th thng nht (n v). Khi x l mt giao tc hoc tt c cc lnh c x l hoc khng lnh no c x l. Nhiu trng hp ta khng mun mt lnh c hiu lc ngay nu lnh khc khng thnh cng. iu ny c th c thc hin nh phng thc setAutoCommit() ca i tng Connection. Phng thc ny nhn mt gi tr boolean lm tham s.. Ngn ch Auto-commit Khi mt lin kt c to ra, th lin kt ch auto-commit. Mi lnh SQL c xem nh l mt giao tc v s c t ng hon thnh ngay khi n c x l. Cch cho php hai hoc nhiu lnh c nhm cng vi nhau thnh mt giao tc l cm ch auto-commit. V d: con.setAutoCommit(false); Xc nhn hon thnh mt giao tc Mi khi ch auto-commit b cm, khng c lnh SQL no s c xc nhn hon thnh cho ti khi ta gi phng thc commit().

15

Ta c th thc hin iu ny bng cch gi phng thc commit() ca cc i tng lin kt. Nu ta c gng x l mt hay nhiu lnh trong mt giao tc v nhn c mt ngoi l SQLException, ta cn gi phng thc rollback() hy b giao tc v khi ng li ton b giao tc. con.setAutoCommit(false); PreparedStatement updateName =null; String query = null; Query="UPDATE license SET name = ? WHERE id = 126" updateName= con.prepareStatement(query); updateName.setString(1, name); updateName.executeUpdate(); PreparedStatement updateSex = null; query = "UPDATE test SET test_value =? updateSex = con.prepareStatement(query); updateSex.setString(1, "Male"); updateSex.executeUpdate(); con.commit(); con.setAutoCommit(true); V d: import java.sql.*; public class PreparedUpdate{ public static void main(String args[]) throws Exception{ int empid; int rows=0; String LastName; String FirstName; String query = "insert into EMP " +"(EmployeeID,LASTNAME,FIRSTNAME) " +"values " +"(?,?, ?)"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con =DriverManager.getConnection ("jdbc:odbc:MyData"); con.setAutoCommit(false); PreparedStatement pstmt = con.prepareStatement(query); pstmt.setInt(1,Integer.parseInt(args[0])); pstmt.setString(2,args[1]); pstmt.setString(3,args[2]); rows = pstmt.executeUpdate( ); pstmt.close( );

16

pstmt = null; System.out.println(rows + " rows inserted"); System.out.println(""); con.commit(); } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ e.printStackTrace(); } } }

8. S dng cc giao tc Sau thc hin cc lnh: Cc chng trnh Java ch thc hin c cc lnh trn CSDL thng qua i tng Statement. Cc cu lnh SQL c th c thc hin tc th thng qua i tng Statement, c th l mt cu lnh bin dch trc (i tng PreparedStatement) hay c th l mt lnh gi cc th tc ci sn (Stored Procedure) trong CSDL (i tng CallableStatement). Cc cu lnh SQL c th c thc hin thng qua phng thc executeQuery() kt qu l mt i tng ResultSet, hay phng thc executeUpdate() kt qu l mt s nguyn cho bit tng s cc record chu nh hng ca cu lnh va thc hin (thng l cc cu lnh sa i d liu Update Delete). Trong trng hp c s dng trnh qun l transaction, cc phng thc rollback() c dng phc hi trng thi trc v commit() xc nhn vic thc hin lnh. chm dt cn xa kt ni, xa cc i tng gii phng ti nguyn ca h thng.

17

You might also like