2018年暑假android培訓(xùn)第13章jdbc技術(shù)_第1頁(yè)
2018年暑假android培訓(xùn)第13章jdbc技術(shù)_第2頁(yè)
2018年暑假android培訓(xùn)第13章jdbc技術(shù)_第3頁(yè)
2018年暑假android培訓(xùn)第13章jdbc技術(shù)_第4頁(yè)
2018年暑假android培訓(xùn)第13章jdbc技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第13JDBCJDBCWebJava語(yǔ)言中提供對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的支持,SUN1996JavaJDBCJDBCAPI、JDBC連接數(shù)據(jù)庫(kù)的步驟、JDBC基本操作、批處理和大數(shù)據(jù)處理等展開(kāi)詳細(xì)地講解。需要注SQLJDBC編程的前提,因此在開(kāi)啟本章內(nèi)容之前,JDBCJDBCJava數(shù)據(jù)庫(kù)連接(JavaDatabaseConnectivity)SQLJavaAPIAPISQL語(yǔ)句來(lái)完成對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的查詢、更JDBC13-1所示。圖13-1JDBC13-1JDBC訪問(wèn)特定的數(shù)據(jù)庫(kù)時(shí),需要與不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)進(jìn)行連API,還需要封裝與各種數(shù)據(jù)庫(kù)服務(wù)器通信的細(xì)節(jié)。JDBC驅(qū)動(dòng)管理器:DriverManagerOracle的JDBCMySQLJDBC驅(qū)動(dòng)管理器:DriverManagerOracle的JDBCMySQL的JDBCSQLServer的JDBCJDBC驅(qū)動(dòng)器API:DriverJDBCJava JDBC實(shí)現(xiàn)細(xì)節(jié)從圖13-2中可以看出,JDBC的實(shí)現(xiàn)包括三部分,具體如下:JDBCJDBCjava.sql.DriverManagerJDBCAPISUNjava.sql.DriverJDBCJDBC驅(qū)動(dòng)程序。JDBC驅(qū)動(dòng)JDBCAPI,負(fù)責(zé)與特定的數(shù)據(jù)庫(kù)連接,以及處理通信細(xì)節(jié)。JDBCJDBCJDBCAPI。JDBCAPIjava.sql包中,該包定義1DriverDriverJDBCJDBCclasspath2DriverManagerDriverManagerJDBCDriverManager類中,定義了兩13-1所示。表13-1DriverManagerregisterDriver(DriverDriverManagerJDBCgetConnection(Stringuser,StringConnection3ConnectionConnectionJavaConnection接口中,定義了一系列方法,具體如13-2所示。表13- Connection接口的方StatementSQLprepareStatement(StringPreparedStatementSQLprepareCall(StringCallableStatement4StatementStatementSQLStatement3SQL語(yǔ)句的方13-3所示。表13- Statement接口的方execute(String果為true,表示所執(zhí)行的SQL語(yǔ)句具備查詢結(jié)果,可通過(guò)Statement的getResultSet()executeUpdate(StringSQLinsert、updatedeleteintSQLexecuteQuery(StringSQLselectResultSet5PreparedStatementPreparedStatementStatementSQLPreparedStatement接口13-4所示。表13- PreparedStatement接口的方PreparedStatementSQL語(yǔ)句,該語(yǔ)句必須DMLSQL語(yǔ)句,比如DDLPreparedStatementSQLResultSetsetInt(intparameterIndex,intintsetFloat(intparameterIndex,floatfloatsetString(intparameterIndex,StringStringsetDate(intparameterIndex,DateDatePreparedStatementsetCharacterStream(parameterIndex,setBinaryStream(parameterIndex,x,6CallableStatementCallableStatementPreparedStatementSQLCallableStatement接口13-5所示。表13- CallableStatement接口的方registerOutParameter(intintOUTSQL類型parameterIndex表示順序位置,sqlTypeSQLsetNull(StringparameterName,intSQLsetString(StringparameterName,StringJavaString查詢最后一個(gè)讀取的OUT參數(shù)是否為SQL類型的值getInt(intJavaintINTEGERCallableStatementPreparedStatement,PreparedStatement接口又繼承7ResultSetResultSetselectResultSet接ResultSet接口中的常用方法。表13- ResultSet接口的方getString(intStringcolumnIndex引getString(StringStringcolumnName稱getInt(intintcolumnIndexgetInt(StringintcolumnNamegetDate(intDatecolumnIndexgetDate(StringDatecolumnName稱absolute(intResultSetResultSetResultSetResultSetResultSet13-6可以看出,ResultSetgetXxx()getXxx()方法取決于字1開(kāi)始編號(hào)的。JDBCAPIJDBC編程,JDBC編程大致按照以下幾個(gè)步驟進(jìn)行:DriverManagerConnectionConnectionconn=DriverManager.getConnection(Stringurl,Stringuser,String從上述方式可以看出,getConnection()3url、登錄數(shù)據(jù)庫(kù)的用url通常遵循如下形式的寫法:urljdbc部分是固定的,subprotocolsubname部urlMySQLurl為Connection對(duì)象獲取Statement對(duì)象。ConnectionStatementcreateStatement()StatementprepareStatementPreparedStatementStatementstmt=prepareCall()Statementstmt=StatementSQLStatementSQLexecute()SQLexecuteQuery()ResultSetexecuteUpdateDMLDDLDMLINSERT、UPDATEDELETESQLDDL0。//SQL//SQLResultSetResultSetrsstmt.executeQuery(sql);ResultSetSQLResultSet對(duì)象,SQLResultSet對(duì)象來(lái)取出查詢結(jié)果。ResultSetJDBCusers表中讀取數(shù)據(jù),并將結(jié)果打印在控制臺(tái),具體步驟如下所CREATEDATABASECREATEDATABASEUSEUSECREATETABLEidINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(40),passwordVARCHAR(40),emailVARCHAR(60),birthday)CHARACTERSETutf8COLLATEusers3條數(shù)據(jù),SQLINSERTINTOusers(NAME,PASSWORD,email,birthday)INSERTINTOusers(NAME,PASSWORD,email,birthday)INSERTINTOusers(NAME,PASSWORD,email,birthday)INSERTINTOusers(NAME,PASSWORD,email,birthday)SELECTusersmysql>mysql>SELECT*FROM |id| |password| |birthday |1| | | |1980-12-04|2| | |lisi@|1981-12-04|3|wangwu|123456|wangwu@|1979-12-04 3rowsinset(0.03Javachapter13classpath中。由于應(yīng)用程序訪問(wèn)的是MySQLMySQLmysql-connector-java-5.0.8-bin.jar添加到classpath中即可。JDBCchapter13JavaExample01users表,并將結(jié)果輸出,13-1所示。packageimportpackageimportimport9publicstaticvoidmain(String[]args)throwsSQLException145678classExample012.DriverManagerStringurl=Stringusername=Stringpassword=Connectionconn=DriverManager.getConnection(url,username,3.ConnectionStatementStatementstmt=4.StatementSQLStringsql="select*fromResultSetrs=5操作ResultSetSystem.out.println("id|name|password|email|while(rs.next())intidrs.getInt("id")Stringname=Stringpsw=Stringemail=Datebirthday=System.out.println(id+"|"+name+"|"+psw+"|"++"|"+}6.}}users13-3圖13-313-1JDBCMySQL的數(shù)據(jù)庫(kù)驅(qū)動(dòng)器類,通過(guò)DriverManagerConnectionConnectionStatement對(duì)象,StatementexecuteQuery()SQLResultSet對(duì)象。最后,通過(guò)遍ResultSet對(duì)象便可得到最終的查詢結(jié)果。JDBCDriverManage.registerDrivwcom.mysl.jdbc.Driver())方法可以完成,vr類的源碼中,已經(jīng)在靜態(tài)代碼塊中完成了數(shù)據(jù)庫(kù)驅(qū)動(dòng)的注冊(cè)。所以,為了避免數(shù)據(jù)庫(kù)驅(qū)動(dòng)被重復(fù)注冊(cè),我們只需要在程序中加載驅(qū)動(dòng)類即可,具體加載方式如下所示: if(rs!=null){try{}catch(SQLExceptionif(rs!=null){try{}catch(SQLExceptione){}rs=}if(stmt!=null){try{}catch(SQLExceptione){}stmt=}if(conn!=null){try{}catch(SQLExceptione){}conn=}PreparedStatementSQL語(yǔ)句執(zhí)行多次時(shí),Statement對(duì)象就會(huì)使數(shù)據(jù)庫(kù)頻繁編譯相同的SQL語(yǔ)句,從而降低數(shù)據(jù)庫(kù)的訪問(wèn)效率。為了解決上述問(wèn)題,StatementPreparedStatement。PreparedStatement對(duì)象可以對(duì)SQLSQL語(yǔ)句再次執(zhí)行時(shí),數(shù)據(jù)庫(kù)只需使用緩沖區(qū)中的數(shù)據(jù),而SQLPreparedStatement對(duì)象13-2所示。例13- 1package234java.sql.PreparedStatement56classExample02publicstaticvoidmain(String[]args)throwsSQLExceptionConnectionconn=PreparedStatementpreStmt=tryStringurl=Stringusername=Stringpassword=Connectionconn=DriverManager.getConnection(url,username,SQLStringsql="INSERTINTO +SQLPreparedStatementpreStmt=preStmt.setString(1,preStmt.setString(2,preStmt.setString(3,}catch(ClassNotFoundExceptione)finally if(preStmt!=null)try}catch(SQLExceptione) preStmt= if(conn!=null)try}catch(SQLExceptione)}conn=}}}4913-2PreparedStatementSQLConnection對(duì)象的prepareStatement()PreparedStatementPreparedStatementsetXxx()方法,SQLexecuteUpdate()SQL語(yǔ)句。13-2chapter13的usersMySQLusersmysql>mysql>select*from |id|name|password| |birthday ||||1| || |1980-12-042||||1981-12-043|wangwu||wangwu@|1979-12-044||||1789-12-23 4rowsinset(0.00從上述結(jié)果可以看出,usersPreparedStatement對(duì)象可以成功執(zhí)行對(duì)數(shù)據(jù)庫(kù){?=call<procedure-name>[(<arg1>,<arg2>,{call<procedure-name>[(<arg1>,<arg2>,CallableStatementSQL{?=call<procedure-name>[(<arg1>,<arg2>,{call<procedure-name>[(<arg1>,<arg2>,在上述語(yǔ)法格式中,其中的參數(shù)(<arg1>,<arg2INOUTIN、OUTOUT參數(shù)。其他參數(shù)可用于輸入、輸出或同時(shí)用于二者。參數(shù)是根據(jù)編號(hào)按順序引用的,第一個(gè)參數(shù)的編號(hào)是1。INPreparedStatementsetXxx()方法設(shè)置的。在執(zhí)行存儲(chǔ)過(guò)程之前,必須注冊(cè)O(shè)UTgetXxx()方法獲取的。CallableStatementResultSetResultSetResultSetStatementSQLchapter13DELIMITERDELIMITERCREATEPROCEDUREadd_pro(aINT,bINT,OUTSUMSETSUM=a+bEND//DELIMITER;add_pro3個(gè)參數(shù):a、b是默認(rèn)參數(shù),即傳入?yún)umout修飾,是傳出參數(shù)。CallableStatementcstmt=CallableStatementcstmt=conn.prepareCall("{call在上述示例代碼中,?IN、OUTINOUTadd_pro。Java程序必須為這些參數(shù)傳入CallableStatementsetXxx()JavaCallableStatementexecute()方法來(lái)執(zhí)行存儲(chǔ)過(guò)程了,執(zhí)行結(jié)束后通CallableStatementgetXxx(intindex)方法來(lái)獲取指定傳出參數(shù)的值。為了讓大家掌握如何調(diào)用存13-3所示。例13- packagepackageimportimportimportimportpublicclassExample03publicstaticvoidmain(String[]args)throwsExceptionCallableStatementcstmt=Connectionconn=tryStringurl=Stringusername=Stringpassword=conn=DriverManager.getConnection(url,username,cstmt=conn.prepareCall("callcstmt.setInt(1,cstmt.setInt(2,37System.out.println("執(zhí)行結(jié)果是:}finallyif(cstmt!=null){}if(conn!=null){}}}4513-4圖13-413-413-311~17行代碼實(shí)現(xiàn)了注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)和獲取數(shù)據(jù)19~23CallableStatement對(duì)象用來(lái)調(diào)用數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程add_pro45,第三個(gè)為輸出參registerOutParameter()int25execute()方26行代碼用于輸出該存儲(chǔ)過(guò)程執(zhí)行后的結(jié)果,即第一、二個(gè)參數(shù)相加之和。ResultSetStatementst=conn.createStatement(ResultSet.TYPE_SCROLL_INSENITIVE,ResultSetrs=Statementst=conn.createStatement(ResultSet.TYPE_SCROLL_INSENITIVE,ResultSetrs=ResultSetResultSet對(duì)象滾13-4所示。例13- packagepackageimportimport4567classExample04publicstaticvoidmain(String[]args)Connectionconn=Statementstmt=tryStringurl=Stringusername=Stringpassword=conn=DriverManager.getConnection(url,username,Stringsql="select*fromStatementstResultSetrs= }catch(Exceptione)finallyif(stmt!=null)try}catch(SQLExceptione) stmt= if(conn!=null)try}catch(SQLExceptione)}conn=}}}5413-5圖13- 運(yùn)行結(jié)13-5ResultSet對(duì)象處理結(jié)果集JDBCJDBC連SQL語(yǔ)句,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的基本操作,接下來(lái),本節(jié)將通過(guò)一個(gè)具體的案例詳細(xì)講JDBCusers表,具體步驟如下:在工程chapter13cn.itcast.jdbc.example.domain,并在該包下創(chuàng)建一個(gè)用于保存用User類,User13-5所示。例13- packagepackageimportpublicclassUserprivateintprivateStringprivateStringprivateStringprivateDatepublicintgetId()return publicvoidsetId(intid)this.id= publicStringgetUsername()return publicvoidsetUsername(Stringusername)this.username=}publicStringgetPassword()return}publicvoidsetPassword(Stringpassword)this.password=}publicStringgetEmail()return}publicvoidsetEmail(Stringemail)this.email=}publicDategetBirthday()return}publicvoidsetBirthday(Datebirthday)this.birthday=}}JDBCUtils,JDBCUtils13-6所示。例13- packagepackageimportimportimportimportimportpublicclassJDBCUtilspublicstaticConnectiongetConnection()throwsClassNotFoundExceptionStringurl=Stringusername=Stringpassword=Connectionconn=DriverManager.getConnection(url,username,return publicstaticvoidrelease(Statementstmt,Connectionconn)(stmt!=null)try}catch(SQLExceptione)}stmt=}(conn!=null)try}catch(SQLExceptione)}conn=}} publicstaticvoidrelease(ResultSetrs,Statementstmt,Connectionconn) if(rs!=null) try }catch(SQLExceptione) rs= release(stmt, 48cn.itcast.jdbc.example.daoUsersDaousers的13-7所示。例13- packagepackageimportimportimportimportimportimportimportpublicclassUsersDaopublicbooleaninsert(Useruser)Connectionconn=Statementstmt=ResultSetrs=tryconn=Statementstmt=SQLSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-Stringbirthday=Stringsql="INSERTINTO+++++++++birthday+intnum=if(num>0)return}return}catch(Exceptione)}finallyJDBCUtils.release(rs,stmt,}return}UserpublicArrayList<User>findAll()Connectionconn=Statementstmt=ResultSetrs=ArrayList<User>list=newtryconn=Statementstmt=SQLStringsql="SELECT*FROMrs=while(rs.next())Useruser=new return}catch(Exceptione)}finallyJDBCUtils.release(rs,stmt, return idpublicUserfind(intid)Connectionconn=Statementstmt=ResultSetrs=tryconn=Statementstmt=SQLStringsql="SELECT*FROMusersWHEREid="+rs=while(rs.next())Useruser=newreturn}return}catch(Exceptione)}finallyJDBCUtils.release(rs,stmt,}return}publicbooleandelete(intid)Connectionconn=Statementstmt=ResultSetrs=tryconn=Statementstmt=SQLStringsql="DELETEFROMusersWHEREid="+intnum=if(num>0)return}return}catch(Exceptione)}finallyJDBCUtils.release(rs,stmt,}return}publicbooleanupdate(Useruser)Connectionconn=Statementstmt=ResultSetrs=tryconn=Statementstmt=SQLSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-Stringbirthday=Stringsql="UPDATEuserssetname='"++"',password='"+user.getPassword()++user.getEmail()+"',birthday='"++"'WHEREid="+intnum=if(num>0)return}return}catch(Exceptione)}finallyJDBCUtils.release(rs,stmt,}return}}Example05,實(shí)現(xiàn)向User13-8例13- packagepackageimportimportimportpublicclasspublicstaticvoidmain(String[]args)usersUsersDaoud=newUseruser=newuser.setBirthday(newboolean 18MySQLSELECTusers表,SQL語(yǔ)句的執(zhí)行結(jié)果如下所示:mysql>mysql>select*from |id|name|password| |birthday ||||||1| || |1980-12-042||||1981-12-043|wangwu||wangwu@|1979-12-04|||||||1789-12-23|2015-04-18 5rowsinset(0.00從上述結(jié)果可以看出,users13-8Example06users13-9例13- packagepackageimportimportimportpublicclassExample06publicstaticvoidmain(String[]args)UsersDaoud=newArrayList<User>list=for(inti=0;i<list.size();i++)System.out.println("第i1username值為 + 14username13-6圖13-6Example07users13-10例13-10packagepackageimportimportpublicclassExample07publicstaticvoidmain(String[]args)UsersDaoud=newUseruser= 1010id1的Username13-7圖13-7Example08User13-11例13-1111package2345class6publicstaticvoidmain(String[]args)7User8UsersDaoud=new9Useruser=newuser.setBirthday(newbooleanb=}}mysql>select*from mysql>select*from |id| |password| |birthday 5rowsinset(0.00|1||||1980-12-04|2||||1981-12-04|3||||1979-12-04|4|zhaoxiaoliu||zhaoxiaoliu@|2015-04-18|5| || |2015-04-18從上述結(jié)果可以看出,id4UserExample09users13-12packageimportpackageimportpublicclasspublicstaticvoidmain(String[]args)1056UsersDaoud=new7booleanb=89}mysql>select*frommysql>select*from |id|name|password| |birthday ||||1| || |1980-12-042||||1981-12-043|wangwu||wangwu@|1979-12-045||||2015-04-18 4rowsinset(0.00從上述結(jié)果可以看出,usersid4UserJDBCSQLSQL語(yǔ)句,效率會(huì)很低。為此,JDBCSQL語(yǔ)句。StatementPreparedStatement都實(shí)StatementSQLStatement實(shí)現(xiàn)批處理。StatementSQLexecuteBatch()SQLStatement13-13所例13-13 package2345classExample1066789publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt=null;try{stmt=conn.createStatement();SQLStringsql1="DROPTABLEIFEXISTSStringsql2"CREATETABLEschool(idint,namevarchar(20))";Stringsql3="INSERTINTOschoolVALUES(2,'傳智播客')";Stringsql4="UPDATEschoolSETid=1";}catch(Exceptione){finallyJDBCUtils.release(null,stmt,}}}程序運(yùn)行過(guò)程中,Statement4SQL13-13MySQLSELECTschool表,SQLmysql>mysql>select*from |id| 1| 1rowinset(0.00從上述結(jié)果可以看出,schoolid1PreparedStatementStatementSQL語(yǔ)句,這時(shí),為了避PreparedStatementStatement相比,PreparedStatement靈活SQLSQLSQL,其具體PreparedStatement實(shí)現(xiàn)批處理,接下來(lái),通過(guò)一個(gè)案例來(lái)演示,13-14所示。例13-1411package234java.sql.PreparedStatement56classExample117publicstaticvoidmain(String[]args)8Connectionconn=9PreparedStatementpreStmt=tryStringsql="INSERTINTO+preStmt=for(inti=0;i<5;i++)preStmt.setString(1,"name"+preStmt.setString(2,"password"+preStmt.setString(3,"email"+i+}}catch(Exceptione)finallyJDBCUtils.release(null,preStmt,}}}mysql>select*frommysql>select*from |id|name|password| |birthday |||||||1| |2||| |1980-12-04| |1981-12-043|wangwu||wangwu@|1979-12-04|||||||2015-04-18|password0|email0@|1989-02-19|password1|email1@|1989-02-19|password2|email2@|1989-02-19||9|name3|password3|email3@|1989-02-19|10|name4|password4|email4@|1989-02-19 9rowsinset(0.00從上述結(jié)果可以看出,Example115條數(shù)據(jù)。由此可見(jiàn),當(dāng)向同一個(gè)表中批量添加或者更PreparedStatement比較方便。intSQL語(yǔ)句。CLOBBLOB類型數(shù)據(jù)的操作。在應(yīng)用程序中,要想操作這兩種數(shù)據(jù)類PreparedStatementIO流的形式進(jìn)行存放和讀取。本節(jié)將針對(duì)CLOBBLOB數(shù)據(jù)的處理方式進(jìn)行詳細(xì)地講解。CLOB在實(shí)際開(kāi)發(fā)中,CLOBMySQLTEXTJDBCCLOB數(shù)據(jù)的處理方式,接下來(lái),通過(guò)一個(gè)案例來(lái)演示,具chapter13testclobSQLcreatecreatetableidintprimarykeyauto_increment,resumetext在工程chapter13CLOBDemo01,該類實(shí)現(xiàn)了向數(shù)據(jù)庫(kù)寫入大文本數(shù)據(jù)的功能,CLOBDemo0113-15所示。packageimportpackageimportimportimportjava.sql.PreparedStatementimportconn=Stringsql="insertintotestclobvalues(?,?)";preStmt=conn.prepareStatement(sql);6classCLOBDemo017staticvoidmain(String[]args)8Connectionconn=9PreparedStatementpreStmt=try27Filefile=newFile("D:\\itcast.txt");Readerreader=newInputStreamReader(newFileInputStream(file),"utf-8");preStmt.setInt(1,1);preStmt.setCharacterStream(2,reader,(int)file.length());}catch(Exceptione){}finallyJDBCUtils.release(null,preStmt,}}13-15FileInputStreamPreparedStatementtestclobresume在工程chapter13CLOBDemo02testclobCLOBDemo213-16例13-16packagepackageimportimportimportjava.sql.PreparedStatementimportimportpublicclassCLOBDemo02publicstaticvoidmain(String[]args)Connectionconn=PreparedStatementpreStmt=ResultSetrs=tryconn=Stringsql="select*frompreStmt=rs=if(rs.next())Readerreader=Writerout=newintwhile((temp=reader.read())!=-1) }}catch(Exceptione)}finallyJDBCUtils.release(rs,preStmt,}}3413-16PreparedStatementResultSet中,然后通過(guò)循環(huán)的方式不resume.txtchapter13的根目錄下發(fā)現(xiàn)resume.txt文件。BLOBBLOBCLOBBLOB專門用于存放二進(jìn)制數(shù)據(jù),如圖片、電影等。為了大chapter13testblobSQLcreatecreatetableidintprimarykeyauto_increment,imgblob在工程chapter13BLOBDemo01testblobBLOBDemo0113-17例13- packagepackageimportimportimportjava.sql.PreparedStatementimportpublicclassBLOBDemo01publicstaticvoidmain(String[]args)Connectionconn=PreparedStatementprestmt=tryconn=Stringsql="insertintotestblobprestmt=prestmt.setInt(1,Filefile=newInputStreamin=newprestmt.setBinaryStream(2,in,(int)file.length());}catch(Exceptione)}finallyJDBCUtils.release(null,prestmt,}}27testblobSELECT語(yǔ)句查看testblob中的數(shù)據(jù),則只能顯示一些二進(jìn)制數(shù)據(jù),圖片是無(wú)法顯示的。在工程chapter13BLOBDemo02,該類用于從數(shù)據(jù)庫(kù)中讀取要獲取的圖片,BLOBDemo0213-18所示。例13- packagepackageimportimportimportjava.sql.PreparedStatementimportimportpublicclassBLOBDemo02publicstaticvoidmain(String[]args)Connectionconn=PreparedStatementstmt=ResultSetrs=tryconn=Stringsql="select*fromtestblobwhereid=stmt=rs=if(rs.next())InputStreamin=newOutputStreamout=newnewintwhile((temp=in.read())!=-1) }catch(Exceptione)}finallyJDBCUtils.release(rs,stmt,}}3513-18PreparedStatement對(duì)象讀取數(shù)據(jù)庫(kù)中所存儲(chǔ)的圖片,由于讀取出來(lái)的圖片無(wú)法顯img.jpgchapter13的根img.jpg圖片。MyBatisapacheiBatis,2010apachesoftwarefoundationgooglecodeMyBatis。201311Github,網(wǎng)址:iBATIS一詞來(lái)源于“internet”和“abatis”Java的持久層框架。iBATIS提供的持久SQLMaps和DataAccessObjects(DAO)MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatisXML或注解用于配置和原始映射,將接口和JavaPOJOs(PlainOldJavaObjects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。MyBatisSqlSessionFactorySqlSessionFactory實(shí)例可以通過(guò)SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilderxml配置文件或者一個(gè)預(yù)定義的配置1 在工程的scr目錄下建立一個(gè)“perties”配置文件說(shuō)明:basebatis.xmldriverClass、jdbcUrl、user、passworddriverClassSQLServermysql的驅(qū)jdbcUrlSQLServer的url格式。jdbc:serversql驅(qū)動(dòng),//ip地址,即表示訪問(wèn)本地機(jī)器上的SQLServer數(shù)據(jù)庫(kù)服務(wù)器,也可用//localhost代替,:51284SQLServer的端口號(hào)。注意,不同的SQL2008SQLServer的端口:SQLServer配置管理器:SQLServerSQLServerSQL2008IPALLTCP51284。當(dāng)然你也可以改成別的。一般選擇14331434。SQLServerurl的其余部分為要鏈接的數(shù)據(jù)庫(kù),和游標(biāo)。關(guān)于什么叫游標(biāo)及其功能請(qǐng)大家自己查閱SQLServer數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)連接不上,毛病SQLServerSQLServer的密碼會(huì)隨機(jī)修改(老師沒(méi)有玩過(guò),url<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDConfig<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDConfig3.0//EN"<properties<package<environments<environment<transactionManagertype="JDBC"<dataSource<propertyname="driver"value="${base.driverClass}"<property<propertyname="url"value="${base.jdbcUrl}"<propertyname="username"value="${base.user}"<propertyname="password"value="${base.password}"<propertyname="poolMaximumActiveConnections"value="1"<propertyname="poolMaximumIdleConnections"value="1"<propertyname="poolMaximumCheckoutTime"<propertyname="poolTimeToWait"<mapperresource="cn/edu/hbmy/taotao/sqlxml/Dmxb.xml"configuration項(xiàng)為配置項(xiàng),configuration<propertiesresource="perties"/>,我們看到了“perties“,多么熟悉啊,這不是加載jdbc屬性文件嗎?不用解釋了吧?<package用于配置類型的別名,解釋一下,mybatis會(huì)將查詢的結(jié)果直接映射到一個(gè)數(shù)據(jù)類型上,并根據(jù)查詢StudentTeacher等。早期沒(méi)有采用注解時(shí)我們必須這樣定義:<package<typeAlias<package<typeAliasalias="BaseData"type=".hbmy.jwc.model.BaseData"<typeAliasalias="BaseData2"type=".hbmy.jwc.model.BaseData2"<typeAliasalias="College"type=".hbmy.jwc.model.College"<typeAliasalias="Course"type=".hbmy.jwc.model.Course"<typeAliasalias="CourseGroup"type=".hbmy.jwc.model.CourseGroup"<typeAliasalias="CourseGroupPoJo"type=".hbmy.jwc.pojo.CourseGroupPoJo"<typeAlias<typeAliasalias="Classes"<typeAliasalias="ChooseCourse"<typeAliasalias="TestCourse"<typeAliasalias="ClassRoomPojo"<typeAliasalias="ExamClass"package.hbmy.taotao.pojo;importpackage.hbmy.taotao.pojo;importorg.apache.ibatis.type.Alias;publicclassDm_xb{privateStringdm;//性別代碼privateStringmc;性別名稱privateStringsrm;privateStringbz;publicStringgetDm()return}publicvoidsetDm(Stringdm){this.dm=dm;}publicStringgetMc(){returnmc;}publicvoidsetMc(Stringmc){this.mc=mc;}publicStringgetSrm(){returnsrm;}publicvoidsetSrm(Stringsrm){this.srm=srm;}publicStringgetBz(){returnbz;}publicvoidsetBz(Stringbz){this.bz=bz;}}perties文件中的值設(shè)置數(shù)據(jù)庫(kù)運(yùn)行的環(huán)境,<mapperresource="cn/edu/hbmy/taotao/sqlxml/Dmxb.xml"<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEmapperPUBLIC"-////DTDMapper<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN"<mapper<selectid="queryXbinfo" resultType="Dm_xb">select*fromdm_xbxml文件中的<mappernamespace屬性是將該文件的內(nèi)容映射到一個(gè)名字空間中。以sql語(yǔ)句時(shí)可以采用:名字空間.idid即為<select>、<insert>、<update>、<delete>mapperid號(hào)。其中<select>表示執(zhí)行一個(gè)查詢語(yǔ)句,<insert>表示插入一條記錄、update執(zhí)行一個(gè)更新語(yǔ)句、delete執(zhí)行一個(gè)刪除語(yǔ)句。<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEmapper<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN"<mapper<selectid="selectConfigData"resultType="ConfigData">select*fromConfig<updateid="updateChooseConfig"updateConfigsetChooseYear=#{chooseYear},ChooseTerm=<insertid="saveConfig"insertintoConfig(OpenYear,OpenTerm,ChooseYear,ChooseTerm,ExamYear,ExamTerm)values(#{openYear},#{openTerm},#{chooseYear},#{chooseTerm},#{examYear},#{examTerm})其中:parameterTypeSQL3 封裝一個(gè)MyBatisUtil類,通過(guò)配置文件“batis.xml”,獲取一個(gè)mybatisSqlSessionFactorymybatisSqlSession類中。insert、update、delete、select、selectOne、selectList、commit提交insert、update、deletecommit才能提交給數(shù)據(jù)SqlSessionmybatisMyBatisUtilmybatisimportorg.apache.ibatis.io.ResourcesgetResourceAsReaderimportorg.apache.ibatis.session.SqlSessionFactoryBuilderbuild函數(shù)創(chuàng)建會(huì)話注意:MyBatisU.hbmy.taotao.util;importjava.io.IOException;importjava.io.Reader;.hbmy.taotao.util;importjava.io.IOException;importjava.io.Reader;importimportimport@author?publicclass{privatestaticStringresource=privatestaticSqlSessionFactorybaseSessionFactory=publicstaticsynchronizedSqlSessionFactory{{Readerreader;try{readerResources.getResourceAsReader(resource);//baseSessionFactory=new}catch(IOExceptione)//TODOAuto-generatedca

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論