《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第4版)》課件chapter14 JDBC技術(shù)和數(shù)據(jù)庫(kù)開發(fā)應(yīng)用_第1頁(yè)
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第4版)》課件chapter14 JDBC技術(shù)和數(shù)據(jù)庫(kù)開發(fā)應(yīng)用_第2頁(yè)
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第4版)》課件chapter14 JDBC技術(shù)和數(shù)據(jù)庫(kù)開發(fā)應(yīng)用_第3頁(yè)
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第4版)》課件chapter14 JDBC技術(shù)和數(shù)據(jù)庫(kù)開發(fā)應(yīng)用_第4頁(yè)
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第4版)》課件chapter14 JDBC技術(shù)和數(shù)據(jù)庫(kù)開發(fā)應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

教學(xué)目標(biāo)14.1JDBC技術(shù)JDBC的體系結(jié)構(gòu)JDBCAPI的主要類和接口簡(jiǎn)介14.2創(chuàng)建MySQL的數(shù)據(jù)庫(kù)MySQL的安裝和配置創(chuàng)建數(shù)據(jù)庫(kù)study14.3Java應(yīng)用程序通過JDBC存取數(shù)據(jù)庫(kù)的過程應(yīng)用JDBC存取數(shù)據(jù)庫(kù)的步驟創(chuàng)建MyEclipse的項(xiàng)目實(shí)例:完成JDBC訪問MySQL數(shù)據(jù)庫(kù)study教學(xué)目標(biāo)(續(xù))14.4JDBC中的主要接口和類DriverManager類連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例Connection接口Statement接口PreparedStatement接口CallableStatement

接口與Java執(zhí)行MySQL存儲(chǔ)過程的程序舉例Java數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系ResultSet接口ResultSetMetaData接口DatabaseMetaData接口教學(xué)目標(biāo)(續(xù))14.5基于C/S模式的學(xué)生信息數(shù)據(jù)庫(kù)管理系統(tǒng)的開發(fā)創(chuàng)建實(shí)體層Bean創(chuàng)建數(shù)據(jù)庫(kù)訪問層:插入、修改、刪除和瀏覽創(chuàng)建用戶圖形界面層14.6JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫(kù)內(nèi)容14.1JDBC技術(shù)Java程序使用JDBC(JavaDatabaseConnectivity)API與數(shù)據(jù)庫(kù)進(jìn)行通信14.1.1JDBC的體系結(jié)構(gòu)Java應(yīng)用程序JDBCAPIJDBCDriverManager數(shù)據(jù)庫(kù)驅(qū)動(dòng)器Java應(yīng)用程序數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)Java應(yīng)用程序圖14-1JDBC的體系結(jié)構(gòu)14.1.2JDBC驅(qū)動(dòng)程序類型1.JDBC-ODBCbridgeplusODBCdriver(類型1):JDBC-ODBC橋接驅(qū)動(dòng)程序。其底層通過ODBC(OpendatabasConnectivity)驅(qū)動(dòng)程序來連接數(shù)據(jù)庫(kù)。2.Native-APIpartly-Javadriver(類型2):本地API-部份用Java來編寫的驅(qū)動(dòng)程序。此種方式先將JDBC函數(shù)調(diào)用轉(zhuǎn)換成數(shù)據(jù)庫(kù)客戶端函數(shù)庫(kù)的API(位于客戶端計(jì)算機(jī)),然后與數(shù)據(jù)庫(kù)相連。3.JDBC-NetpureJavadriver(類型3):JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序。首先JDBC驅(qū)動(dòng)程序會(huì)將JDBC函數(shù)調(diào)用解釋成與數(shù)據(jù)庫(kù)無關(guān)的網(wǎng)絡(luò)通信協(xié)議,經(jīng)過中介服務(wù)器的第二次解析,最后才轉(zhuǎn)換成相對(duì)應(yīng)的數(shù)據(jù)庫(kù)通信協(xié)議.4.Native-protocolpureJavadriver(類型4)本地協(xié)議純Java驅(qū)動(dòng)程序。這種驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。14.1.3JDBCAPI的主要類和接口簡(jiǎn)介JDBCAPI由一系列與數(shù)據(jù)庫(kù)訪問有關(guān)的類和接口組成,它們放在java.sql子包中。其中主要的類和接口有:DriverManager類:

Connection接口

Statement接口、與子類PreparedStatement、CallableStatement;ResultSet;CallableStatement接口

14.2創(chuàng)建MySQL的數(shù)據(jù)庫(kù)MySQL的特點(diǎn):最受歡迎的開源關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQLAB公司開發(fā),目前屬于Oracle公司。MySQL被廣泛地應(yīng)用在Internet的中小型網(wǎng)站,具備體積小、速度快、總體擁有成本低,開放源碼MySQL使用結(jié)構(gòu)化查詢語(yǔ)言SQL進(jìn)行數(shù)據(jù)庫(kù)管理和操作。免費(fèi)下載網(wǎng)址:/downloads/14.2.1MySQL的安裝和配置

1.下載Windows版的安裝軟件包:(1)MySql數(shù)據(jù)庫(kù)管理軟件:

mysql-essential-5.1.68-win32.msi(必備)(2)mysql的JDBC驅(qū)動(dòng)程序:

mysql-connector-java.jar(必備)(3)mysql的圖形化管理界面軟件:

mysql-gui-tools-5.0-r17-win32.msi(可選)14.2.1MySQL的安裝和配置

2.安裝和配置MySQL軟件(1)雙擊mysql-essential-5.1.68-win32.msi,將進(jìn)入安裝界面不斷點(diǎn)擊[Next],點(diǎn)擊[Finish]后,開始配置服務(wù)器,在配置過程中:選擇[StandardConfiguration]選項(xiàng);[CharacterSet]選擇字符集為[utf8]或[GBK];[ModifySecuitySetings]中,設(shè)置root賬號(hào)的用戶口令,如為root;其他選項(xiàng)選擇默認(rèn)值則可,直到最后點(diǎn)擊[Execute]完成服務(wù)器配置。14.2.1MySQL的安裝和配置

2.安裝和配置MySql軟件(2)MySQL安裝完成后,在Windows桌面出現(xiàn)程序項(xiàng):

“MySQL->MySqlServer5.1->MySQLCommandLineClient”

雙擊“MySQLCommandLineClient”,打開MySql的SQL命令行處理窗口:mysql-essential-5.1.68-win32.msi安裝完成后,只能以DOS命令行方式使用。

14.2.1MySQL的安裝和配置

2.安裝和配置MySql軟件(3)安裝mysql-gui-tools-5.0-r17-win32.msi,安裝完成后程序項(xiàng)出現(xiàn):

單擊“MySqlAdministrator”,將進(jìn)入MySQL的圖形化管理界面14.2.1MySQL的安裝和配置

2.安裝和配置MySql軟件

單擊“MySqlAdministrator”,將進(jìn)入MySQL的圖形化管理界面:14.2.1MySQL的安裝和配置

2.安裝和配置MySql軟件

單擊“MySqlAdministrator”,將進(jìn)入MySQL的圖形化管理界面:14.2.2創(chuàng)建數(shù)據(jù)庫(kù)study

數(shù)據(jù)庫(kù)Study存放著三張表student,course,sc:學(xué)生的基本信息student:學(xué)號(hào)、姓名、性別、年齡和所在系各字段組成;課程情況表course:課程號(hào)、課程名和學(xué)分各字段組成;學(xué)生學(xué)習(xí)各門課程的學(xué)習(xí)成績(jī)sc:學(xué)號(hào)、課程號(hào)和學(xué)習(xí)成績(jī)各字段組成。createdatabasestudy;usestudy;CREATETABLEcourse( cnochar(2), cnamechar(16), creditdecimal(2,1));insertintocoursevalues('c1','數(shù)據(jù)庫(kù)',4);insertintocoursevalues('c2','數(shù)學(xué)', 2.5);insertintocoursevalues('c3','信息系統(tǒng)',4);insertintocoursevalues('c4','英語(yǔ)', 3);CREATETABLEstudent( snochar(5), snamechar(10), ssexchar(2), sageint, sdeptchar(20));insertintostudentvalues('20001','張小明','女',23,'信息系');insertintostudentvalues('20002','李強(qiáng)','男', 21,'計(jì)算機(jī)系');insertintostudentvalues('20003','王方','女',28,'信息系');insertintostudentvalues('20004','劉晨','男',18,'計(jì)算機(jī)系');CREATETABLESC(

Snochar(5),Cnochar(2),Gradedecimal(3,0)

);insertintoSCvalues('20001','c1',91);insertintoSCvalues('20001','c2',92);insertintoSCvalues('20001','c3',93);insertintoSCvalues('20001','C4',94);insertintoSCvalues('20002','c2',81);insertintoSCvalues('20002','c3',80);insertintoSCvalues('20004','C1',70);insertintoSCvalues('20004','C2',71);insertintoSCvalues('20004','C3',72);14.2.2創(chuàng)建數(shù)據(jù)庫(kù)study

將study.sql文件拷貝到C盤根目錄下,打開MySQLCommandLineClient,運(yùn)行腳本命令:

sourcec:\study.sql14.3Java應(yīng)用程序通過JDBC存取數(shù)據(jù)庫(kù)的過程

本節(jié)首先介紹通過JDBC存取數(shù)據(jù)庫(kù)的步驟,然后通過一個(gè)簡(jiǎn)單實(shí)例演示整個(gè)過程。14.3.1應(yīng)用JDBC存取數(shù)據(jù)庫(kù)的步驟Java應(yīng)用程序通過JDBC存取數(shù)據(jù)庫(kù)的步驟:

1.加載JDBC驅(qū)動(dòng)程序,建立數(shù)據(jù)庫(kù)連接

2.建立與執(zhí)行SQL語(yǔ)句

3.處理結(jié)果集

4.關(guān)閉數(shù)據(jù)庫(kù)連接1.加載JDBC驅(qū)動(dòng)程序,建立數(shù)據(jù)庫(kù)連接。加載JDBC驅(qū)動(dòng)程序,語(yǔ)句格式:

Class.forName(Stringjdbc_driver);

例如:加載MySQL驅(qū)動(dòng)程序的語(yǔ)句:

Class.forName("com.mysql.jdbc.Driver");使用DriverManger.getConnection(),建立一個(gè)新的數(shù)據(jù)庫(kù)連接。方法格式:

ConnnetiongetConnection(StringconnURl,

StringloginName,Stringpassword);返回連接到特定數(shù)據(jù)庫(kù)的Connnetion對(duì)象。connURl用來定義連接數(shù)據(jù)庫(kù)的參數(shù)。

1.加載JDBC驅(qū)動(dòng)程序,建立數(shù)據(jù)庫(kù)連接。例14-1連接MySQL的數(shù)據(jù)庫(kù)Study,用戶名為”root”,口令為“root”。則建立數(shù)據(jù)庫(kù)連接代碼:try{

Class.forName("com.mysql.jdbc.Driver"); Stringurl="jdbc:mysql://localhost:3306/study";Stringlogin="root",password=="root";

Connectionconn=DriverManager.getConnection(url,login,password)}catch(ClassNotFoundExceptione){//輸出捕獲到的異常信息

e.printStackTrace();}catch(SQLExceptionsqlException){e.printStackTrace();}

2.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢

建立新數(shù)據(jù)庫(kù)連接以后,必須先建立一個(gè)Statement對(duì)象才能執(zhí)行SQL語(yǔ)句。

3種類型的Statememt:Statement、PreparedStatement和CallableStatement。

(1)使用Statement。示例如下:

StatementStmt=conn.createStatement();StringsqlQuery=“select*fromEmployee”;

ResultSetrs=Stmt.executeQuery(sqlQuery);2.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢(續(xù))(2)使用PreparedStatement

用于處理預(yù)編譯的SQL語(yǔ)句,可重復(fù)執(zhí)行。

PreparedStatementprepStmt=

conn.prepareStatement("SELECT*FROMEmployee");

ResultSet

rs=prepStmt.executeQuery();

用WHERE限制SELECT語(yǔ)句的查詢結(jié)果:

PreparedStatementprepStmt=conn.prepareStatement("SELECT*FROMEmployeeWHEREename=?")

prepStmt.setString(1,"SCOTT");

ResultSetrset=prepStmt.executeQuery();

3.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢(續(xù))執(zhí)行帶2個(gè)參數(shù)的UPDATE語(yǔ)句,示例如下:

PreparedStatementprepStmt=conn.prepareStatement("UPDATEempSETsal=?WHEREename=?");prepStmt.setInt(1,100000);prepStmt.setString(2,"Rich");

prepStmt.executeUpdate();3.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢(續(xù))(3)CallableStatement:調(diào)用數(shù)據(jù)庫(kù)的存儲(chǔ)過程,語(yǔ)法:

CallableStatement變量名=conn.prepareCall(“call存儲(chǔ)過程名稱”);示例:

CallableStatementcallStmt=conn.prepareCall("callupdate_salary(?,?)");

callStmt.setInt(1,7788);//設(shè)置要傳入的第一個(gè)輸入?yún)?shù)(?)值是7788callStmt.setInt(2,10000);

//設(shè)置要傳入的第二個(gè)輸入?yún)?shù)(?)值是10000

callStmt.execute();2.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢(續(xù))

建立了Statement或PreparedStatement或CallableStatement對(duì)象之后,3種方法執(zhí)行SQL語(yǔ)句:

executeQuery():執(zhí)行select的SQL查詢語(yǔ)句

executeUpdate():執(zhí)行insert、delete、update更新語(yǔ)句,以及DDL語(yǔ)句。

execute():執(zhí)行SQL語(yǔ)句。2.建立SQL語(yǔ)句對(duì)象,執(zhí)行查詢(續(xù))//SQL查詢語(yǔ)句ResultSetrset=stmt.executeQuery(SELECT*FROMemp);

//update語(yǔ)句stmt.executeUpdate("updateempsetage=age+1");//delete語(yǔ)句stmt.executeUpdate("deleteempforage=20");//DDL語(yǔ)句stmt.execute("CREATETABLEtable“+"(noCHAR(10),nameCHAR(10))");3.處理結(jié)果集可用while循環(huán)打印出ResultSet記錄集內(nèi)所有記錄。

while(rs.next()){

System.out.println(rs.getInt(1));

System.out.println(rs.getString(2));}其中:1、2…表示結(jié)果集中的各字段相對(duì)位置。例如:

rs.getInt(1)

將讀取結(jié)果集中第1個(gè)整型字段的的內(nèi)容,也可以通過字段名讀取內(nèi)容,寫成:

rs.getInt(“sno”)4.關(guān)閉數(shù)據(jù)庫(kù)連接通過JDBC存取數(shù)據(jù)庫(kù)時(shí)最后一個(gè)操作是關(guān)閉Connection、Statement、ResultSet等對(duì)象.rs.close();

stmt.close();con.close();14.3.2創(chuàng)建MyEclipse的項(xiàng)目實(shí)例:

完成JDBC訪問MySQL數(shù)據(jù)庫(kù)study

例14-2通過JDBC存取study數(shù)據(jù)庫(kù)的course表。//JdbcExample.javaimportjava.sql.*;classJdbcExample1{publicstaticvoidmain(Stringargs[]){StringdriverClassName="com.mysql.jdbc.Driver";Stringurl= "jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=UTF-8";Stringusername="root";Stringpassword="root";Connectionconn=null;try{ Class.forName(driverClassName);//加載JDBC驅(qū)動(dòng)程序 //通過數(shù)據(jù)庫(kù)連接

conn=DriverManager.getConnection(url,username,password); //建立SQL語(yǔ)句對(duì)象

Statementstatement=conn.createStatement(); StringsqlQuery="select*fromcourse"; ResultSetrs=statement.executeQuery(sqlQuery);//執(zhí)行查詢

while(rs.next()){//處理結(jié)果集

System.out.print(rs.getString(1)+","); System.out.print(rs.getString(2)+","); System.out.println(rs.getInt(3)); }

//關(guān)閉數(shù)據(jù)庫(kù)連接

statement.close();conn.close();}//捕獲異常

catch(SQLExceptionsqlException){JOptionPane.showMessageDialog(null,sqlException.getMessage(),"DatabaseError",JOptionPane.ERROR_MESSAGE);System.exit(1);}//detectproblemsloadingdatabasedrivercatch(ClassNotFoundExceptionclassNotFound){JOptionPane.showMessageDialog(null,classNotFound.getMessage(),"DriverNotFound",JOptionPane.ERROR_MESSAGE);System.exit(1);}}//endofmain}//endofclassc1,數(shù)據(jù)庫(kù),4c2,數(shù)學(xué),2.5c3,信息系統(tǒng),4c4,英語(yǔ),314.3.2創(chuàng)建MyEclipse的項(xiàng)目實(shí)例:

完成JDBC訪問MySQL數(shù)據(jù)庫(kù)study在MyEclipse環(huán)境下,項(xiàng)目ch14的創(chuàng)建過程:(1)在MyEclipse環(huán)境下,創(chuàng)建JavaProject,起名為ch14。(2)為項(xiàng)目ch14的庫(kù)文件[libraries]添加MySQL的JDBC驅(qū)動(dòng)程序包:mysql-connector-java.jar;(3)在項(xiàng)目ch14中,創(chuàng)建類文件JdbcExample.java,輸入正確的文件內(nèi)容.(4)運(yùn)行項(xiàng)目的Java應(yīng)用程序。得到運(yùn)行結(jié)果14.4JDBC中的主要接口和類Java應(yīng)用程序訪問數(shù)據(jù)庫(kù)主要是通過JDBCAPI實(shí)現(xiàn)的,通過下面幾個(gè)重要接口和類:

DriverManager類

連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例

Connection接口

Statement接口

PreparedStatement接口

CallableStatement接口

ResultSet接口

ResultSetMetaData接口

DatabaseMetaData接口

Java的基本數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系。14.4.1DriverManager類DriverManager類在包java.sql,用于數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序管理的類,在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接,也處理諸如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等事務(wù)。

DriverManager類的主要成員方法:

static

Connection

getConnection(String

url);static

Connection

getConnection(String

url,String

user,String

password):14.4.2連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例

例14-3

通過創(chuàng)建好的數(shù)據(jù)源名studyDSN,連接MicrosoftSQLServer2008或SQLServer2008express的數(shù)據(jù)庫(kù)。創(chuàng)建ODBC數(shù)據(jù)源:用window控制面板中數(shù)據(jù)源“ODBC”管理器,創(chuàng)建一個(gè)連接到SQLServer的數(shù)據(jù)源,名稱為studyDSN,連接的數(shù)據(jù)庫(kù)是study,用戶為sa,口令為sa。創(chuàng)建好的數(shù)據(jù)源名studyDSN在下列程序中使用:14.4.2連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例

例14-3

實(shí)現(xiàn)代碼如下:try{Stringurl="jdbc:odbc:studyDSN";Stringlogin="sa";Stringpassword="sa";

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

Connectionconn=DriverManager.getConnection(url,login,password);}catch(SQLExceptionsqlException){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}14.4.2連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例

例14-4通過JDBC-ODBC驅(qū)動(dòng)程序連接SQLServer2008express版本。但不必事先建立ODBC的數(shù)據(jù)源名。省略了try-catch的主要代碼如下:

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

Stringurl="jdbc:odbc:Driver={SQLServer};Server=machineName"+"\\"+"SQLEXPRESS;Database=study;uid=sa;pwd=sa";Connectionconn=DriverManager.getConnection(connURL);其中:machineName是機(jī)器名或IP地址14.4.2連接SQLServer、Oracle和Access數(shù)據(jù)庫(kù)的程序舉例

例14-5從網(wǎng)站下載SQLServer2005或SQLServer2008的sqljdbc_2.0驅(qū)動(dòng)程序包sqljdbc4.jar,并將此包放在用戶應(yīng)用能訪問的類路徑或項(xiàng)目的庫(kù)路徑中。機(jī)器名為localhost(本地機(jī)器),端口號(hào)為1030,數(shù)據(jù)庫(kù)為study.

省略了try-catch的主要代碼如下:

Stringurl="jdbc:sqlserver://localhost:1030;DatabaseName=study";Stringuser="sa", pwd="sa";Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(url,user,password);14.4.2連接SQLServer、Oracle

和Access數(shù)據(jù)庫(kù)的程序舉例

例14-6連接Oracle數(shù)據(jù)庫(kù)。從網(wǎng)站下載Oracle驅(qū)動(dòng)程序包c(diǎn)lasses12.zip,并將此包的路徑放在classpath環(huán)境變量中或放在項(xiàng)目的庫(kù)路徑中。連接數(shù)據(jù)庫(kù)ORCL,機(jī)器的ip為0,端口號(hào)為1521.省略了try-catch的主要代碼如下:Stringurl="jdbc:oracle:thin:@0:1521:ORCL";Class.forName("oracle.jdbc.driver.OracleDriver");Connectionconn=DriverManager.getConnection(url,user,password);14.4.1DriverManager類例14-7通過JDBC-ODBC連接access的數(shù)據(jù)庫(kù)study.mdb。省略了try-catch的主要代碼如下:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Stringurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=study.mdb";Connectionconn=DriverManager.getConnection(url);14.4.3Connection接口Connection接口是用來表示數(shù)據(jù)庫(kù)連接的對(duì)象,對(duì)數(shù)據(jù)庫(kù)的一切操作都是在這個(gè)連接的基礎(chǔ)上進(jìn)行的。Connection接口的成員常用方法:(1)StatementcreateStatement():創(chuàng)建一個(gè)statement對(duì)象;

(2)

PreparedStatement

prepareStatement(String

sql)

創(chuàng)建PreparedStatement類對(duì)象;

(3)

voidclose():

立即釋放連接對(duì)象的數(shù)據(jù)庫(kù)和JDBC資源;14.4.4Statement接口Statement接口用于在已經(jīng)建立的連接的基礎(chǔ)上向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的對(duì)象。3種類型的Statement對(duì)象:Statement對(duì)象用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句;PreparedStatement對(duì)象用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語(yǔ)句;CallableStatement對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)已存儲(chǔ)過程的調(diào)用。14.4.4Statement接口創(chuàng)建statement對(duì)象的方法如下:

Statementstmt=conn.createStatement();

Statement接口定義中包括的常用方法:

(1)ResultSet

executeQuery(String

sql)

使用SELECT命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢,返回結(jié)果集;

(2)

int

executeUpdate(String

sql):

使用INSERT、DELETE、UPDATE對(duì)數(shù)據(jù)庫(kù)進(jìn)行新增、刪除和修改記錄操作;

(3)booleanexecute(Stringsql):執(zhí)行SQL語(yǔ)句;

(4)void

close():結(jié)束Statement類對(duì)象對(duì)數(shù)據(jù)庫(kù)的聯(lián)機(jī);

14.4.5PreparedStatement接口

PreparedStatement接口和Statement類的不同之處在于PreparedStatement類對(duì)象會(huì)將傳入的SQL命令事先編好等待使用,當(dāng)有單一的SQL指令需多次執(zhí)行時(shí),用PreparedStatement會(huì)比Statement效率更高。

PreparedStatement接口的常用方法:

(1) ResultSetexecuteQuery():使用SELECT命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢;

(2) intexecuteUpdate()

:使用INSERT\DELETE\UPDATE對(duì)數(shù)據(jù)庫(kù)進(jìn)行新增、刪除和修改操作;

(3)voidsetXXX(intparameterIndex,XXXx):給PreparedStatement類對(duì)象的IN參數(shù)設(shè)定為XXX類型的值x。

14.4.5PreparedStatement接口

PreparedStatement對(duì)象的創(chuàng)建方法:

PreparedStatementpstmt=con.prepareStatement("updatetbl_Usersetreward=?whereuserId=?");

例如:

(1)如果想給第一個(gè)注冊(cè)的用戶獎(jiǎng)勵(lì)5000點(diǎn)(userId=1,reward=5000):pstmt.setInt(1,5000);pstmt.setInt(2,1);

(2)如果想給前50個(gè)注冊(cè)的用戶每人5000點(diǎn)獎(jiǎng)勵(lì):

pstmt.setInt(1,5000);for(inti=0;i<50;i++){pstmt.setInt(2,i);introwCount=pstmt.executeUpdate();} 14.4.6CallableStatement

接口

與Java執(zhí)行MySQL存儲(chǔ)過程的程序舉例CallableStatement接口用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)的存儲(chǔ)過程。創(chuàng)建

CallableStatement對(duì)象的方法如下:

CallableStatementcstmt=con.prepareCall("callprocedure_name(?,?,?,…)");

其中(?,?,?,…)定義了存儲(chǔ)過程的輸入?yún)?shù)和(或)輸出參數(shù)。setXXX方法:向存儲(chǔ)過程傳遞輸入?yún)?shù)(IN)值的。registerOutParameter方法:設(shè)置存儲(chǔ)過程的OUT(輸出)參數(shù),getXXX方法:獲取調(diào)用存儲(chǔ)過程后的輸出參數(shù)的值結(jié)果。

14.4.6CallableStatement

接口

與Java執(zhí)行MySQL存儲(chǔ)過程的程序舉例例14-8利用JDBC接口調(diào)用Mysql的存儲(chǔ)過程Query_Student和Query_Study1。打開MySQlCommandClientLine窗口,在數(shù)據(jù)庫(kù)study中創(chuàng)建存儲(chǔ)過程Query_Student和Query_Study1。定義不帶參數(shù)的存儲(chǔ)過程Query_Study1:usestudy;DELIMITER//CREATEPROCEDUREQuery_Study1()BEGINSELECTsname,sdept,sageFROMstudent;END//例14-8利用JDBC接口調(diào)用Mysql的存儲(chǔ)過程Query_Student和Query_Study1。創(chuàng)建存儲(chǔ)過程Query_Student的腳本內(nèi)容如下:DELIMITER//CREATEPROCEDUREQuery_Student(INp_nochar(6),OUTp_namechar(20),OUTp_deptchar(10))BEGINSELECTsname,sdeptintop_name,p_deptFROMstudentWHEREsno=p_no;END//JdbcCallProcedure.java的主要代碼:importjava.sql.*;importjavax.swing.*;classjdbcCallProcedure{publicstaticvoidmain(Stringargs[]){StringdriverClassName="com.mysql.jdbc.Driver";Stringurl= "jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=UTF-8";Stringusername="root";Stringpassword="root";try{ Class.forName(driverClassName).newInstance(); Connectionconn=DriverManager.getConnection(url+"&user="+username+"&password="+password);

JdbcCallProcedure.java的主要代碼:

//帶有入口參數(shù)和出口參數(shù)的存儲(chǔ)過程的調(diào)用,select的結(jié)果是單值

CallableStatementcallStmt=conn.prepareCall("{callQuery_Student(?,?,?)}");//設(shè)置要傳入的第一個(gè)輸入?yún)?shù)(?)值是20001callStmt.setString(1,"20001");//注冊(cè)輸出參數(shù)

callStmt.registerOutParameter(2,java.sql.Types.VARCHAR);callStmt.registerOutParameter(3,java.sql.Types.VARCHAR);

callStmt.execute();Stringb1=callStmt.getString(2);Stringb2=callStmt.getString(3);System.out.println("調(diào)用存儲(chǔ)過程Query_Student的結(jié)果:");System.out.println(b1+","+b2);

JdbcCallProcedure.java的主要代碼://存儲(chǔ)過程的調(diào)用,select的結(jié)果是結(jié)果集合

System.out.println("調(diào)用存儲(chǔ)過程Query_Study1的結(jié)果:");callStmt=conn.prepareCall("{callQuery_Study1}");

callStmt.execute();ResultSetrs=callStmt.getResultSet();while(rs.next()){System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getInt(3));}callStmt.close();conn.close();}//一定要捕獲異常

catch(SQLExceptione){ e.printStackTrace();}catch(Exceptione){ e.printStackTrace();}}//endofmain}例14-8利用JDBC接口調(diào)用Mysql的存儲(chǔ)過程Query_Student和Query_Study1。程序運(yùn)行的輸出結(jié)果如下:14.4.7Java數(shù)據(jù)類型

和SQL中支持的數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系Java的基本數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型有一定的對(duì)應(yīng)關(guān)系。這種對(duì)應(yīng)關(guān)系如表14-1所示(請(qǐng)參見本書)。14.4.8ResultSet接口

結(jié)果集(ResultSet):存儲(chǔ)SQL查詢結(jié)果的對(duì)象,通過維護(hù)記錄指針(Cursor)的移動(dòng),能操作結(jié)果集中的每一行記錄;提供一組方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行新增、刪除和修改操作。ResultSet接口常用方法:① booleannext()

:移動(dòng)記錄指針到結(jié)果集的下一條記錄,若移動(dòng)成功返回true;② 類型get類型(intcolumnIndex):讀取結(jié)果集中當(dāng)前行的指定字段的值;

類型get類型(StringcolumnName)③ booleanabsolute(introw):移動(dòng)記錄指針到結(jié)果集的指定的記錄;④ voidbeforeFirst()

:移動(dòng)記錄指針到結(jié)果集的第一條記錄之前;

⑤ voidafterLast()

:移動(dòng)記錄指針到結(jié)果集的最后一條記錄之后;14.4.8ResultSet接口ResultSet接口常用方法:⑥ booleanfirst():移動(dòng)記錄指針到結(jié)果集的第一條記錄;⑦ booleanlast():移動(dòng)記錄指針到結(jié)果集的最后一條記錄;⑧ booleanprevious():移動(dòng)記錄指針到結(jié)果集的上一條記錄;⑨ ResultSetMetaDatagetMetaData():取得ResultSetMetaData類對(duì)象。14.4.9ResultSetMetaData接口

ResultSetMetaData接口的對(duì)象保存了所有ResultSet類對(duì)象中關(guān)于字段的元信息,并提供許多方法來取得這些信息。

ResultSetMetaData接口中的方法(請(qǐng)參見本書)

14.4.10DatabaseMetaData接口DatabaseMetaData接口保存了數(shù)據(jù)庫(kù)的所有特性,并且提供許多方法來取得這些信息。

DatabaseMetaData類的主要方法(請(qǐng)參見本書)

14.5基于C/S模式的學(xué)生信息數(shù)據(jù)庫(kù)管理系統(tǒng)的開例14-9利用MySQl的數(shù)據(jù)庫(kù)Study,對(duì)數(shù)據(jù)庫(kù)中表student進(jìn)行插入、修改、刪除和瀏覽。分為三層結(jié)構(gòu)(從上層到下層):第1層:視圖層(用戶界面層):用于管理信息的顯示,是與用戶交互的圖形界面。第2層:數(shù)據(jù)庫(kù)訪問層:完成與數(shù)據(jù)庫(kù)的所有操作。第3層:實(shí)體層:對(duì)數(shù)據(jù)庫(kù)的每個(gè)對(duì)象基表,都定義了Java中對(duì)應(yīng)的實(shí)體類。14.5基于C/S模式的學(xué)生信息數(shù)據(jù)庫(kù)管理系統(tǒng)的開例14-9利用MySQl的數(shù)據(jù)庫(kù)Study,對(duì)數(shù)據(jù)庫(kù)中表student進(jìn)行插入、修改、刪除和瀏覽。14.5.1創(chuàng)建實(shí)體層Bean

對(duì)Study數(shù)據(jù)庫(kù)中的表Student完成輸入、修改、刪除的Java程序。這三個(gè)程序有相似的GUI,因此聲明類StudentUI以封裝該GUI。例13-2對(duì)Study數(shù)據(jù)庫(kù)中的表Student完成增加記錄的程序設(shè)計(jì)。程序由兩個(gè)類AddStudentFrame和StudentUI組成。將StudentUI類放在子包UI中;在類AddStudentFrame中,用語(yǔ)句importUI.StudentUI;導(dǎo)入子包中類StudentUI。14.5.1創(chuàng)建實(shí)體層Bean對(duì)Study數(shù)據(jù)庫(kù)中的表student,編寫對(duì)應(yīng)的實(shí)體類Student.java:publicclassStudent{

privateStringsno; privateStringsname; privateStringssex; privateintsage;

privateStringSdept; publicStringgetSno(){ returnsno; } publicvoidsetSno(Stringsno){ this.sno=sno; }.......14.5.2創(chuàng)建數(shù)據(jù)庫(kù)訪問層:插入、修改、刪除和瀏覽

訪問數(shù)據(jù)庫(kù)層:由StudentManager.java和DBConnection.Java組成。

1.DBConnection類的設(shè)計(jì):定義了訪問MySql數(shù)據(jù)庫(kù)的打開連接和關(guān)閉操作,如果要連接其它類型的數(shù)據(jù)庫(kù),只要修改類的變量driverClassName和url的值,而不影響系統(tǒng)的其他代碼。14.5.2創(chuàng)建數(shù)據(jù)庫(kù)訪問層:插入、修改、刪除和瀏覽

2.StudentManager.java類的程序設(shè)計(jì):封裝了訪問student表的插入、修改、刪除和查詢操作。(1)繼承父類DBConnection:用于DB的連接和關(guān)閉(2)構(gòu)造方法中調(diào)用父類的連接方法,即在創(chuàng)建StudentManager對(duì)象時(shí)完成連接數(shù)據(jù)庫(kù)操作。類的域變量Connectionconn在各方法中共享。(3)方法intexecUpdate(Stringsql):定義了對(duì)Student表進(jìn)行更新操作,包括插入、修改、刪除。入口參數(shù)是SQL語(yǔ)句的字符串,返回更新操作的結(jié)果,返回結(jié)果大于0則更新成功,為0則更新不成功,并及時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接。(4)方法List<Student>Query(StringsqlString):定義了對(duì)Student表查詢的結(jié)果,并以List結(jié)構(gòu)返回查詢結(jié)果集,并及時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接。14.5.3創(chuàng)建用戶圖形界面層:主窗口、主菜單、插入、修改、刪除和瀏覽

圖形界面層GUI:主類Main.java、主窗口主菜單MainFrame.java:Main主類完成創(chuàng)建學(xué)生管理系統(tǒng)的主窗口對(duì)象,并使主窗口顯示在屏幕居中。MainFrame.java定義了主窗口,在主窗口中創(chuàng)建顯示主菜單,并給各菜單項(xiàng)注冊(cè)事件監(jiān)聽處理對(duì)象。插入記錄界面:AddStudentPanel.java修改記錄界面:UpdateStudentPanel刪除記錄界面:DeleteStudentPanel.java瀏覽學(xué)生信息界面:ListStudentsPanel.java公用界面StudentUI.java:定義了一個(gè)學(xué)生信息的顯示界面,可作為圖形組件被組合在插入、修改和刪除的圖形界面中。類StudentUI設(shè)計(jì)思路類StudentUI完成輸入記錄的畫面設(shè)計(jì),其設(shè)計(jì)思路如下:(1)調(diào)用者利用StudentUI類構(gòu)造方法的參數(shù)(字符型數(shù)組StringarrayString[]),傳遞輸入記錄畫面上一組列的標(biāo)題。在StudentUI類構(gòu)造方法中,從數(shù)組arrayString的實(shí)例變量arrayString.length中可得到列的個(gè)數(shù),并取出列的標(biāo)題放在labels數(shù)組。(2)定義一組文本字段fields[]用于編輯一張表的記錄各字段,并且調(diào)用者通過方法getFields()和setFields()可讀取和設(shè)置fields值。(3)類StudentUI界面上提供兩個(gè)通用Button按鈕doTask1、doTask2,按鈕的標(biāo)簽內(nèi)容和按鈕的事件處理過程,可通過調(diào)用者來設(shè)置。類StudentUI的程序代碼14.6JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫(kù)內(nèi)容

以二維表格形式表現(xiàn)查詢結(jié)果:利用JTable表格類和AbstractTableModel表格模型類JTable類:以二維表的形式顯示表格中的數(shù)據(jù)從表格模型AbstractTableModel類的對(duì)象中獲取。1.類JTable

JTable組件屬于javax.swing包,它能以二維表的形式顯示數(shù)據(jù)。類JTable在顯示數(shù)據(jù)時(shí)具有以下特點(diǎn):

(1)可定制性:可以定制數(shù)據(jù)的顯示方式和編輯狀態(tài);

(2)異構(gòu)性:可以顯示不同類型的數(shù)據(jù)對(duì)象,甚至包括顏色、圖標(biāo)等復(fù)雜對(duì)象;(3)簡(jiǎn)便性:可以以缺省方式輕松地建立起一個(gè)二維表。使用類JTable顯示數(shù)據(jù)之前,必須根據(jù)情況先生成定制的表格模型、單元繪制器或單元編輯器。類AbstractListModel用來定制用戶自己的表格模型。創(chuàng)建JTable的表格對(duì)象時(shí),將捆綁定制的表格模型。例如:

JTabletable=newJTable(dataModel);//dataModel是定制的表格模型對(duì)象

JScrollPanescrollpane=newJScrollPane(table);//將表格添加到可滾動(dòng)的面板2.類AbstractTableModel

類AbstractTableModel,提供了TableModel接口中絕大多數(shù)方法的缺省實(shí)現(xiàn)。類AbstractTableModel隸屬于javax.swing.table。該類是一個(gè)抽象類,沒有完全實(shí)現(xiàn),不能實(shí)例化,使用時(shí)必須在程序中實(shí)現(xiàn)方法。要想生成一個(gè)具體的TableModel作為AbstractTableMode的子類,至少必須實(shí)現(xiàn)下面以下三個(gè)方法:

publicintgetRowCount();//得到表格的行數(shù)

publicintgetColumnCount();//得到表格的行數(shù)

publicObjectgetValueAt(introw,intcolumn);//得到表格的第row行、第column列的單元值2.類AbstractTableModel(續(xù))例如,我們可以建立一個(gè)簡(jiǎn)單二維表(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論