Lập trình cơ sở dữ liệu

21 390 1
Lập trình cơ sở dữ liệu

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trang 143 Chng 7 LP TRÌNH C S D LIU I. Tng quan t ha hn ln ca java là kh nng xây dng các ng dng CSDL c lp vi h n, công ngh này c bit n vi cái tên JDBC (Java Database Connectivity), JDBC c thit k tng i n gin. Mô hình JDBC a ra mt tp các lp và các phng thc  giao tip vi ngn d liu. JDBC API c tích hp vào ngay nn java nên bn không cn phi cài t gì thêm khi truy cp CSDL. II. Các ku trình u khin JDBC Các trình u khin JDBC th phân thành 4 kiu sau ph thuc vào cách thc hot ng, cách kt ni vi CSDL. Kiu 1 : JDBC s dng cu ni ODBC (JDBC-ODBC Bridge ) ODBC là mt công ngh ca Microsoft dùng  kt ni n các h c s d liu thông qua trình u khin Driver ca h c s d liu ó. Mi h c s d liu cung p mt trình u khin (Driver) kh nng làm vic (c, cp nht, ) c c s  liu ca chúng . Trình u khin này sc ng ký vi b qun lý ODBC . ODBC API là mt tp các hàm API  truy cp vào CSDL thông qua các trình u khin, ngi lp trình s s dng các hàm API trong giao din này  truy cp vào CSDL. u ni JDBC – ODBC là mt trình u khin s dng mã java  gi li các hàm trong JDBC API. Bng cách này bn th kt ni c vi nhiu h qun tr c s  liu khác nhau.  th kt ni vào mt h CSDL c th nào ó (chng hn nh: Access, SQL Server, MySQL…) s dng cu ni JDBC-ODBC bn cn phi có: - Trình u khin (Driver) ca dùng  truy cp vào h CSDL ó. Thông thng trình u khin này c cung cp bi chính các hãng sn xut h CSDL và nó thng c cài t vào trong máy khi bn cài t h qun tr CSDL. - Cu ni JDBC-ODBC, ây là trình u khin c cung cp min phí bi hãng Sun và nó c cài t tng khi bn cài t JDK. Trang 144 Vì rng trình u khin ODBC phi c cài t vào trong máy trc khi bn th  dng nên nó ch thích hp cho các ng dng máy n, hoc c chy trên máy ch trong mô hình nhiu tng (Multi - tier), không thích hp cho các ng dng chy trên máy khách nh: Aplet, Fat Client. Kiu 2 : JDBC kt ni trc tip vi các trình u khin c s d liu . Kiu kt ni này s dng mã java trc tip gi các hàm trong trình u khin c thù ca mi h c s d liu mà không phi qua trung gian ODBC . Do vy kiu kt i này nhanh và hiu qu hn cu ni JDBC – ODBC, nhng phi trình u khin c sc thù do nhà phát trin cung cp hoc ca mt hãng th ba nào ó. Java Application , Applet , Servlet JDBC Driver ODBC Database driver Database Mã JAVA Mã Native { { { Mô hình truy cp CSDL qua cu ni JDBC Trang 145 Kiu 3 : JDBC kt ni thông qua các ng dng mng trung gian i kiu kt ni này, máy ch s chu trách nhim kt ni vi c s d liu . Máy khách ch s dng nhng trình u khin gn nh (thin) kh nng giao tip i ng dng trung gian thông qua mng  truy vn d liu . Kiu 4 : JDBC kt ni thông qua các trình u khin hoàn toàn mã java Java Application , Applet , Servlet JDBC Driver Database driver Mã JAVA Mã Native { { Database Mô hình kt ni trc tip Java Application , Applet , Servlet JDBC Driver Java Middle Ware Java Native driver Database Mã JAVA Mã JAVA { { M¹ng Trang 146 Kiu này cho phép máy khách s dng trình u khin gn nh ni kt trc tip vào trình u khin c s d liu c thù trên máy ch xa thông qua mng Internet . III. Các lp trong JDBC API dùng  truy cp CSDL JDBC API bao gm các lp và các giao din c cha trong hai gói: java.sql và javax.sql. Gói java.sql cha các giao din và gói cho phép ta thc hin các thao tác c bn i vi CSDL, gói javax.sql cha các lp và giao din giúp ta thc hin các tính nng cao p. 1. Mt s giao din và lp trong gói java.sql a) Mt s giao din Tên giao din Mô t ý ngha CallableStatement Giao din cha các phng thc cho phép ta làm vic vi th c lu tr ni DatabaseMetaData Cho phép ta xem các thông tin v CSDL PreparedStatement Giao din này cho phép ta thc thi các câu lnh SQL cha tham s ResultSetMetaData Connection Th hin mt kt ni n CSDL Driver Giao din mà mi trình u khin phi cài t ResultSet Th hin mt tp các bn ghi ly v t CSDL Statement Giao din cho phép ta thc hin các phát biu SQL Java Application , Applet , Servlet JDBC Driver Java Native driver CSDL Mã JAVA Mã JAVA { { Internet Trang 147 b) Mét s lp Tên lp Ý ngha Date p biu din kiu DATE DriverPropertyInfo Cha các thuc tính ca trình u khin ã np Timestamp Lp biu din cho SQL TimeTemp DriverManager Lp qun lý các trình u khên Time p biu din kiu DATE Types p nh ngha các hng tng ng vi các kiu d liu SQL, hay còn gi là kiu d liu JDBC 2. Mt s lp và giao din trong gói javax.sql Tham kho tài liu v JDBC IV. Kt ni CSDL vi JDBC   th làm vic vi CSDL, mt chng trình java (hay bt c chng trình vit ng ngôn ng nào khác) phi tuân theo các bc sau:  kt ni n CSDL. Thc hin các lnh làm vic vi CSDL nh: truy vn, cp nht… óng kt ni, gii phóng tài nguyên. Các bc  xây dng mt ng dng CSDL vi JDBC: 1. Chun b a) Cài t JDBC và trình u khin: Mt ng java ch th kt ni và làm vic c vi d liu trong CSDL thông qua các trình u khin và các th vin JDBC API. Trc khi truy cp vào h CSDL nào bn phi trong tay trình u khin tng ng vi h CSDL ó. Bn th download các trình u khin cho mt s h CSDL quen thuc ta ch java.sun.com/jdbc b) Cài t CSDL Bn cn la chn và cài t mt h qun tr CSDL,  qun tr phn d liu ca chng trình. ây là la chn ca bn tu theo tính cht ca d liu trong chng trình ng nh mc tin bn  th mua c h qun tró. Sau khi bn la chn c h qun tr CSDL phù hp bn tin hành cài t CSDL: o bng, view, th tc lu tr Chú ý:  th truy cp vào CSDL ca h qun tr CSDL nào thì bn phi trong tay trình u khên tng ng. 2. Thit lp kt ni ây là bc quan trng nht bao gm hai bc: Trang 148 a) Np trình u khin JDBC s dng mt b trình qun lý u kin (DiverManager), mi trình u khin (Driver) cho phép ta làm vic vi mt CSDL c th, cho nên nu bn 3 CSDL do 3 nhà cung cp khác nhau cung cp thì bn cn phi 3 trình u khin khác nhau.  np và ng ký trình u khin bn s dng lnh Class.forName(URL) Trong ó URL là mt chui mô t các thông tin v tên ca trình u khin dùng kt i vi c s d liu, chng hn lnh Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); dùng  np trình u khin JDBC-ODBC Chú ý: Vi mi trình u khin khác nhau thì URL ca phng thc Class.forName()  khác nhau. Nên  th np úng trình u khin bn nên thao kho tài liu i kèm a các trình u khin,  bit c URL tng ng. b) To mt kt ni c tip theo bn to mt kt ni n CSDL thông qua trình u khin mà bn a np  bc trên. n mã dùng  to mt kt ni thông thng nh sau: Connection con = DriverManager.getConnection(url, "myLogin", "myPassword"); Trong ó : - url là chui cha thông tin kt ni n CSDL, nu bn s dng cu ni JDBC-ODBC thì url là “jdbc:odbc:DataSourceName”, chng hn tôi ã to mt DNS tên là TestDB vi tên truy cp là theht, mt khu truy cp là theht thì câu lnh kt ni n CSDL là Connection con = DriverManager. getConnection(“jdbc:odbc:TestDB”,"theht", "theht"); - myLogin là tên truy cp, nu mt không mt khu bn th truyn cho nó mt xâu ng - myPassword là mt khu truy cp, nu mt không mt khu bn th truyn cho nó t xâu rng Chú ý: Thông thng chui URL nh dng nh sau: jdbc:subprotocol:subname Trong ó: subprotocol là giao thc con tng ng vi loi CSDL subname là tên ca ngun d liu (Thông thng nó là tên ca CSDL) t vài ví du: Ví d 1: Np trình u khên và kt ni n CSDL ca MySQL Trang 149 Trình u khên  tury cp vào CSDL ca MySQL, bn th download ti a ch MySQL.com, sau khi download bn mt tp tin duy nht ã c nén theo chun jar, t classpath trn tp tin này - Np tình u khin ca MySQL Class.forName("com.mysql.jdbc.Driver"); - Kt ni n CSDL Connection conn = DriverManager.getConnection( "jdbc:mysql://ServrName/DBName?user=UserName&password=Pass"); - ServerName: là tên ca máy ch CSDL - DBName: là tên ca CSDL - UserName: là tên truy cp CSDL - Pass: là mt khu truy cp Ví d 2: Np trình u khên và kt ni n CSDL ca SQL Server 7.0, 2000 rt nhiu trình u khin cho MS SQL Server, a phn các trình u khin u là các n phm thng mi, mt trình u khin mà ta nên s dng ó là trình u khin do chính hãng Microsoft cung cp, trình u khin này hoàn toàn Free và h try  các tính nng ca Sql Server. - a ch download www.microsoft.com - Sau khi download và tin hành cài t bn s 3 tp tin trong th mc cài t: install_dir/lib/msbase.jar install_dir/lib/msutil.jar install_dir/lib/mssqlserver.jar install_dir: là th mc cài t - t classpath trn 3 tp tin trên - Np trình u khin Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); - Kt ni n CSDL Connection conn = DriverManager.getConnection( " jdbc:microsoft:sqlserver://ServerName:ServerPort;DatabaseName=DBName", "UserName","Password"); hoc Connection conn = DriverManager.getConnection "jdbc:microsoft:sqlserver://ServerName:ServerPort;User=UserName;Password=Pass word;DatabaseName=DBName"); Trang 150 + ServerName: Là tên ca máy ch SQL + ServerPort:  hiu cng ca SQL, nu trong quá trình cài t mà bn không t i thì giá tr này là 1433 + UserName: Tài khon ng nhp vào SQL + Password: t khu tng ng vi tài khon ng nhp - Chuyn CSDL làm vic conn.setCatalog("DBName"); +DBName: là tên CSDL Ví d hoàn chnh import java.sql.*; class Test{ public static void main(String[] args) { try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection conn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://theht:1433;DatabaseName=AA;user=sa;password="); Statement st=conn.createStatement(); ResultSet rs=st.executeQuery("Select * from t"); while(rs.next()) System.out.println(rs.getString("a")+ rs.getString("b")); } catch (SQLException ex) {} } catch (ClassNotFoundException ex) { } } Ví d 3: Np trình u khên và kt ni n CSDL ca Access vi cu ni JDBC-ODBC a Sun System  truy cp vào CSDL ca Access ta không cn phi ti xung và cài t vào máy driver nào c vì nó c tích hp vào Java, trình u khin này do sun cung cp nó tên là cu i JDBC-ODBC - Np trình u khin Class.forName("sun.jdbc.odbc. JdbcOdbcDriver "); - M kt ni bng cách s dng DataSource Name + Vào control panel chy chng trình ODBC DataSource 32 bit + To mt DataSource Name tên là MyDB Connection conn = DriverManager.getConnection(" jdbc:odbc:MyDB"); - M kt ni bng cách s dng File DataSource Connection conn = DriverManager.getConnection(“jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Path/DatabaseName.mdb";”) MyDB: tên ca DataSource Name mà bn ã to Path: ng dn n CSDL Trang 151 DatabaseName: tên CSDL Ví d hoàn chnh import java.sql.*; import java.util.*; class Test { public static void main(String a[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Properties props = new Properties(); //Charset  làm vic vi Unicode props.put("charSet", "UTF8"); props.put("user", "guest"); props.put("password", "guest"); String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/MyDB.mdb"; Connection con = DriverManager.getConnection(url, props); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); //To bng stmt.executeUpdate("Create Table tbl(a text(50), b text(50))"); //Chèn 1 bn ghi vào CSDL stmt.execute("Insert Into tbl values('Xin chào','Toi là Access')"); ResultSet rs = stmt.executeQuery("Select * from tbl"); if (rs.next()) { System.out.println(rs.getString("a") + "\t" + rs.getString("b")); } } catch (Exception ex) { ex.printStackTrace(); } } } Ví d 4: p trình u khên và kt ni n CSDL ca Oracle 8i, 9i Trình u khên  tury cp vào CSDL ca Oracle, bn th tìm thy nó trong th mc %ORACLE_HOME%/JDBC/lib Class.forName("oracle.jdbc.OracleDriver "); // Ly v kt ni n CSDL Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@theht", "theht","abc"); - @theht là tên ca máy ch CSDL - theht là tên truy cp CSDL - abc là mt khu truy cp Trang 152 V. Tng tác vi CSDL Tt c các lnh mà ta dùng  tác ng lên CSDL u th thc hin thông qua t trong ba i tng sau: i tng Mô t Satement Dùng  thc thi các lnh SQL không tham s PreparedStatement Dùng  thc thi các lnh SQL cha tham s CallableStatement Dùng  làm vic vi th tc lu tr ni 1. To ra mt JDBC Statements t i tng Statements s giúp bn gi mt lnh SQL n h qun tr CSDL, sau khi to i tng Statements bn th thc hin các lnh SQL nh SELECT  ly  d liu hay UPDATE  cp nht d liu,  to i tng Statements bn s ng phng thc createStatement ca i tng connection mà bn va to ra trong bc II. Statement stmt = con.createStatement(); i thi m này bn cha phát biu SQL nào  truyn n CSDL, bây gi chúng ta s s dng phng thc execute ca i tng này  thc thi mt lnh SQL, chng hn nhn lnh sau s dng phng thc executeUpdate  thc thi t câu lnh truy vn cp nht stmt.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " + "SALES INTEGER, TOTAL INTEGER)"); Trong java 2 bn th to ra các tp kt qu th cp nht và th cun con tr theo c hai chiu,  to ra tp kt qu th cp nht c và cho phép cun c hai chiu n s dng mu sau: Statement stmt = con.createStatement(ResultSetType, ConcurencyType); Trong ó : Tham s ResultSetType cho bit tp kt qu (ResultSet) nhn c khi thc thi câu lnh executeQuery() cun c hay không. Tham s ConcurencyType tính cht ca tp kt qu (ResultSet) nhn c khi thc thi câu lnh executeQuery() cho phép cp nht hay không. Thc ra vic cp nht c hay không còn ph thuc vào trình u khên và h qun tr h tr cp nht hay không. Sau ây là bng các giá tr mà tham s ResultSetType th nhn [...]... tensv=\”Nguy n V n B\” WHERE masv=01”); p nh t l i d li u c p nh t l i d li u b n s d ng m nh qua ph UPDATE SQL, th c thi chúng thông ng th c executeUpdate Ví d 4: b n mu n c ng thêm ph c p cho t t c các ng i trình i h c lên 10 ng n làm stmt.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE td=’dh’”); Thêm b n ghi vào b ng CSDL chèn d li u vào b ng b n s d ng ph ng th c executeUpdate c a i t ng Statement,... Sau khi ch c ch n r ng các giá tr thêm vào là úng Ta g i ph xác nh n vi c thêm m i b n ghi vào b ng và ResultSet Ví d : Thêm b n ghi vào ResultSet Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // N p trình ng th c insertRow() u kh ên Connection cn=DriverManager.getConnection("jdbc:odbc:t"); // L y v k t n i Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);... s d ng các l nh SQL-DML, b n th th c hi n vi c này b ng các ph ng th c c a i t ng ResultSet Các b c xoá m t b n ghi kh i ResultSet Trang 158 Di chuy n con tr i ph ng th c deleteRow(); Chú ý: Tu vào trình xoá n b n ghi c n xoá u kh ên mà vi c xoá c th c hi n ngay hay ch là ánh d u bi t ch c ch n b n nên tham kh o tài li u i kèm v i Driver b n s d ng Ví d : Xoá b n ghi rs.first(); rs.deleteRow(); rs.absolute(3); . trình u khên tng ng. 2. Thit lp kt ni ây là bc quan trng nht bao gm hai bc: Trang 148 a) Np trình u khin JDBC s dng mt b trình. cp Ví d 2: Np trình u khên và kt ni n CSDL ca SQL Server 7.0, 2000 Có rt nhiu trình u khin cho MS SQL Server, a phn các trình u khin

Ngày đăng: 29/09/2013, 09:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan