




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《Java教程數(shù)據(jù)庫(kù)》PPT課件本課件僅供大家學(xué)習(xí)學(xué)習(xí)學(xué)習(xí)完畢請(qǐng)自覺刪除謝謝本課件僅供大家學(xué)習(xí)學(xué)習(xí)學(xué)習(xí)完畢請(qǐng)自覺刪除謝謝《Java教程數(shù)據(jù)庫(kù)》PPT課件本課件僅供大家學(xué)習(xí)學(xué)Java入門Java入門24Java數(shù)據(jù)庫(kù)技術(shù)4.1MySQL和JDBC4.2
使用JDBC4.3
實(shí)例4Java數(shù)據(jù)庫(kù)技術(shù)4.1MySQL和JDB34.1MySQL和JDBC概述MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQLAB公司開發(fā),目前屬于
Oracle
旗下公司。MySQL最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一,對(duì)于一般的個(gè)人使用者和中小型企業(yè)來說,MySQL提供的功能綽綽有余。4.1MySQL和JDBC概述MySQL是一個(gè)關(guān)系型數(shù)據(jù)4創(chuàng)建數(shù)據(jù)庫(kù)test:createdatabasetest創(chuàng)建表hero:CREATETABLEhero(idint(11)AUTO_INCREMENT,namevarchar(30),hpfloat,damageint(11),PRIMARYKEY(id))DEFAULTCHARSET=utf8;插入一條記錄蓋倫到表中:insertintoherovalues(null,'蓋倫',616,100)查詢所有數(shù)據(jù):select*fromhero統(tǒng)計(jì)表中有多少條數(shù)據(jù):selectcount(*)fromhero顯示前5條數(shù)據(jù):select*fromherolimit0,5修改:updateherosethp=818whereid=1刪除:deletefromherowhereid=1操作語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)test:createdatabasetes54.1MySQL和JDBCJDBC(JavaDatabaseConnection,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI(應(yīng)用程序設(shè)計(jì)接口),它由一些Java語(yǔ)言寫的類和界面組成。JDBC提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使得開發(fā)人員使用Java語(yǔ)言開發(fā)完整的數(shù)據(jù)庫(kù)應(yīng)用程序變得極為簡(jiǎn)單。通過JDBC,開發(fā)人員幾乎可以將SQL語(yǔ)句傳遞給任何一種數(shù)據(jù)庫(kù),而無需為各種數(shù)據(jù)庫(kù)編寫單獨(dú)的訪問程序。JDBC可以自動(dòng)將SQL語(yǔ)句傳遞給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)。4.1MySQL和JDBCJDBC(Ja6訪問MySQL數(shù)據(jù)庫(kù)需要用到第三方的類,這些第三方的類,都被壓縮在一個(gè)叫做Jar的文件里。
為了代碼能夠使用第三方的類,需要為項(xiàng)目導(dǎo)入mysql的專用Jar包。
通常都會(huì)把項(xiàng)目用到的jar包統(tǒng)一放在項(xiàng)目的lib目錄下導(dǎo)包步驟:右鍵project->property->javabuildpath->libaries->addexternaljars訪問MySQL數(shù)據(jù)庫(kù)需要用到第三方的類,這些第三方的類,都被7packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){ //初始化驅(qū)動(dòng)
try{//驅(qū)動(dòng)類//就在中
//如果忘記了第一個(gè)步驟的導(dǎo)包,就會(huì)拋出ClassNotFoundException
數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功!");
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}初始化驅(qū)動(dòng)通過Class.forName初始化驅(qū)動(dòng)類
就在中packagejdbc;初始化驅(qū)動(dòng)8JDBC擴(kuò)展了Java的功能,例如在Applet中應(yīng)用JDBC,可以實(shí)現(xiàn)與遠(yuǎn)程數(shù)據(jù)庫(kù)的連接,實(shí)現(xiàn)不同平臺(tái)數(shù)據(jù)庫(kù)之間的對(duì)話。簡(jiǎn)單地說,JDBC完成下面三個(gè)操作:(1)與一個(gè)數(shù)據(jù)庫(kù)建立連接。Connectioncon=DriverManager.getConnection("jdbc:odbc:CallCenter","sa","");(2)向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。stmt=con.createStatement();rs=stmt.executeQuery("SELECTCID,CPinfromtCustomerWHERECID='z1'");JDBC擴(kuò)展了Java的功能,例如在Appl9(3)處理數(shù)據(jù)庫(kù)返回的結(jié)果。while(rs.next()){ StringtheInt=rs.getString("CID"); Stringstr=rs.getString("CPin"); ...}(3)處理數(shù)據(jù)庫(kù)返回的結(jié)果。104.2使用JDBCJDBC的接口分為兩個(gè)層次:一個(gè)是面向程序開發(fā)人員的JDBCAPI;另外一個(gè)是底層的JDBCDriverAPI。JDBCAPI被描述成為一組抽象的Java接口,應(yīng)用程序可以對(duì)某個(gè)數(shù)據(jù)庫(kù)打開連接,執(zhí)行SQL語(yǔ)句并且處理結(jié)果。最重要的接口如下::處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫(kù)連接提供支持。:代表對(duì)特定數(shù)據(jù)庫(kù)的連接。:代表一個(gè)特定的容器,以對(duì)一個(gè)特定的數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句。:控制對(duì)一個(gè)特定語(yǔ)句的行數(shù)據(jù)的存取。4.2使用JDBCJDBC的接口分為兩11
其中又有兩個(gè)子類型::用于執(zhí)行預(yù)編譯的SQL語(yǔ)句。:用于執(zhí)行對(duì)一個(gè)數(shù)據(jù)庫(kù)內(nèi)嵌過程的調(diào)用。JDBCDriverAPI是指接口,封裝了不同數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序(像Access、Foxpro、SQLServer等)。由于它是數(shù)據(jù)庫(kù)底層處理,所以必須提供對(duì)、java.sql.Statement、和的實(shí)現(xiàn)。其中又有兩個(gè)子類型:12packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){ try{
//建立與數(shù)據(jù)庫(kù)的Connection連接
//這里需要提供:
//數(shù)據(jù)庫(kù)所處于的本機(jī))//數(shù)據(jù)庫(kù)的端口號(hào):3306(mysql專用端口號(hào))
//數(shù)據(jù)庫(kù)名稱how2java//編碼方式UTF-8//賬號(hào)root//密碼admin
連接數(shù)據(jù)庫(kù)packagejdbc;連接數(shù)據(jù)庫(kù)13//接上面的代碼Connectionc=DriverManager.getConnection("root","admin");
連接成功,獲取連接對(duì)象:"+c);
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}//接上面的代碼14packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{
Statement是用于執(zhí)行SQL語(yǔ)句的,比如增加,刪除packagejdbc;Statement是用于執(zhí)行S15Connectionc=DriverManager.getConnection("root","admin");
//注意:使用的是//不要不小心使用到:Statements=c.createStatement();
獲取Statement對(duì)象:"+s);
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}《Java教程數(shù)據(jù)庫(kù)》課件16packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{
Connectionc=DriverManager.getConnection("root","admin");
s.execute執(zhí)行sql語(yǔ)句
執(zhí)行成功后,用mysql-front進(jìn)行查看,明確插入成功packagejdbc;s.execute執(zhí)行sql語(yǔ)17Statements=c.createStatement();
//準(zhǔn)備sql語(yǔ)句
//注意:字符串要用單引號(hào)'Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";s.execute(sql);
執(zhí)行插入語(yǔ)句成功");
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}執(zhí)行SQL語(yǔ)句之前要確保數(shù)據(jù)庫(kù)test中有表hero的存在,如果沒有,需要事先創(chuàng)建表執(zhí)行SQL語(yǔ)句之前要確保數(shù)據(jù)庫(kù)test中有表hero的存在,18在回收垃圾語(yǔ)句后面加上下面語(yǔ)句finally{//數(shù)據(jù)庫(kù)的連接時(shí)有限資源,相關(guān)操作結(jié)束后,養(yǎng)成關(guān)閉數(shù)據(jù)庫(kù)的好習(xí)慣
//先關(guān)閉Statementif(s!=null)try{s.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}//后關(guān)閉Connectionif(c!=null)try{c.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}數(shù)據(jù)庫(kù)的連接是有限資源,相關(guān)操作結(jié)束后,養(yǎng)成關(guān)閉數(shù)據(jù)庫(kù)的好習(xí)慣
先關(guān)閉Statement
后關(guān)閉Connection在回收垃圾語(yǔ)句后面加上下面語(yǔ)句數(shù)據(jù)庫(kù)的連接是有限資源,相關(guān)操19packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
使用try-with-resource的方式自動(dòng)關(guān)閉連接packagejdbc;使用try-with-resour20try("root","admin");Statements=c.createStatement();){Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";s.execute(sql);
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}《Java教程數(shù)據(jù)庫(kù)》課件21Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";Stringsql="deletefromherowhereid=5";Stringsql="updateherosetname='name5'whereid=3";增、刪、改語(yǔ)句Stringsql="insertintohero22packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
"root","admin");Statements=c.createStatement();){
executeQuery執(zhí)行SQL查詢語(yǔ)句packagejdbc;executeQuery執(zhí)行SQ23Stringsql="select*fromhero";
//執(zhí)行查詢語(yǔ)句,并把結(jié)果集返回給ResultSetResultSetrs=s.executeQuery(sql);while(rs.next()){intid=rs.getInt("id");//可以使用字段名
Stringname=rs.getString(2);//也可以使用字段的順序
floathp=rs.getFloat("hp");intdamage=rs.getInt(4);}//不一定要在這里關(guān)閉ReultSet,因?yàn)镾tatement關(guān)閉的時(shí)候,會(huì)自動(dòng)關(guān)閉ResultSet//rs.close();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}在取第二列的數(shù)據(jù)的時(shí)候,用的是rs.get(2),而不是get(1).這個(gè)是整個(gè)Java自帶的api里唯二的地方在取第二列的數(shù)據(jù)的時(shí)候,用的是rs.get(2),而不是g24packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
PreparedStatement也是用來執(zhí)行sql語(yǔ)句的與創(chuàng)建Statement不同的是,需要根據(jù)sql語(yǔ)句創(chuàng)建PreparedStatement除此之外,還能能夠通過設(shè)置參數(shù),指定相應(yīng)的值,而不是Statement那樣使用字符串拼接packagejdbc;PreparedStatement25
Stringsql="insertintoherovalues(null,?,?,?)";//根據(jù)sql語(yǔ)句創(chuàng)建PreparedStatementPreparedStatementps=c.prepareStatement(sql);){
//設(shè)置參數(shù)
ps.setString(1,"提莫");ps.setFloat(2,313.0f);ps.setInt(3,50);//執(zhí)行
ps.execute();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}使用參數(shù)設(shè)置,可讀性好,不易犯錯(cuò)有預(yù)編譯機(jī)制,性能比Statement更快防止SQL注入式攻擊使用參數(shù)設(shè)置,可讀性好,不易犯錯(cuò)26packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}Statements=c.createStatement();){//有事務(wù)的前提下
//在事務(wù)中的多個(gè)操作,要么都成功,要么都失敗
使用事務(wù)在事務(wù)中的多個(gè)操作,要么都成功,要么都失敗
通過c.setAutoCommit(false);關(guān)閉自動(dòng)提交
使用mit();進(jìn)行手動(dòng)提交packagejdbc;使用事務(wù)27
c.setAutoCommit(false);
//加血的SQLStringsql1="updateherosethp=hp+1whereid=22";s.execute(sql1);
//減血的SQL//不小心寫錯(cuò)寫成了updata(而非update)
Stringsql2="updataherosethp=hp-1whereid=22";s.execute(sql2);
//手動(dòng)提交
mit();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}
28packagecharactor;publicclassHero{//增加id屬性
publicintid;publicStringname;publicfloathp;publicintdamage;}ORM=ObjectRelationshipDatabaseMapping
對(duì)象和關(guān)系數(shù)據(jù)庫(kù)的映射
簡(jiǎn)單說,一個(gè)對(duì)象,對(duì)應(yīng)數(shù)據(jù)庫(kù)里的一條記錄例:根據(jù)id返回一個(gè)Hero對(duì)象先構(gòu)建一個(gè)Hero類packagecharactor;ORM=ObjectR29packagejdbc;
importcharactor.Hero;
publicclassTestJDBC{publicstaticHeroget(intid){Herohero=null;}catch(ClassNotFoundExceptione){e.printStackTrace();}Statements=c.createStatement();){
Stringsql="select*fromherowhereid="+id;
packagejdbc;30
ResultSetrs=s.executeQuery(sql);
//因?yàn)閕d是唯一的,ResultSet最多只能有一條記錄
//所以使用if代替whileif(rs.next()){hero=newHero();Stringname=rs.getString(2);floathp=rs.getFloat("hp");intdamage=rs.getInt(4);=name;hero.hp=hp;hero.damage=damage;hero.id=id;}}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnhero;}publicstaticvoidmain(String[]args){Heroh=get(22);}
31packagejdbc;
publicinterfaceDAO<T>{//增加
publicvoidadd(Tt);//修改
publicvoidupdate(Tt);//刪除
publicvoiddelete(intid);//獲取
publicTget(intid);//查詢
publicList<T>list();//分頁(yè)查詢
publicList<T>list(intstart,intcount);}DAO=Database
Access
Object
數(shù)據(jù)庫(kù)訪問對(duì)象
實(shí)際上就是運(yùn)用了練習(xí)-ORM中的思路,把數(shù)據(jù)庫(kù)相關(guān)的操作都封裝在這個(gè)類里面,其他地方看不到JDBC的代碼packagejdbc;DAO=Database
Acce32packagejdbc;
importcharactor.Hero;
publicclassHeroDAO{
把驅(qū)動(dòng)的初始化放在了構(gòu)造方法HeroDAO里:因?yàn)轵?qū)動(dòng)初始化值需要執(zhí)行一次,所以放在這里更合適,其他方法里也不需要寫了,代碼更簡(jiǎn)潔。提供了一個(gè)getConnection方法返回連接,所有的數(shù)據(jù)庫(kù)操作都需要事先拿到一個(gè)數(shù)據(jù)庫(kù)連接Connection,以前的做法每個(gè)方法里都會(huì)寫一個(gè),如果要改動(dòng)密碼,那么每個(gè)地方都需要修改。通過這種方式,只需要修改這一個(gè)地方就可以了。代碼變得更容易維護(hù),而且也更加簡(jiǎn)潔。packagejdbc;把驅(qū)動(dòng)的初始化放在了構(gòu)造方法Her33publicHeroDAO(){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}}
publicConnectiongetConnection()throwsSQLException{"admin");}
publicHeroDAO(){34publicintgetTotal(){inttotal=0;try(Connectionc=getConnection();Statements=c.createStatement();){
Stringsql="selectcount(*)fromhero";
ResultSetrs=s.executeQuery(sql);while(rs.next()){total=rs.getInt(1);}
}catch(SQLExceptione){
e.printStackTrace();}returntotal;}
publicintgetTotal(){35publicvoidadd(Herohero){Stringsql="insertintoherovalues(null,?,?,?)";try(Connectionc=getConnection();PreparedStatementps=c.prepareStatement(sql);){ps.setString(1,);ps.setFloat(2,hero.hp);ps.setInt(3,hero.damage);ps.execute(); ResultSetrs=ps.getGeneratedKeys();if(rs.next()){intid=rs.getInt(1);hero.id=id;}}catch(SQLExceptione){e.printStackTrace();}}publicvoidupdate(Herohero){
Stringsql="updateherosetname=?,hp=?,damage=?whereid=?";try(Connectionc=getConnection();PreparedStatementps=c.prepareStatement(sql);){ps.setString(1,);ps.setFloat(2,hero.hp);ps.setInt(3,hero.damage);ps.setInt(4,hero.id);ps.execute();}catch(SQLExceptione){e.printStackTrace();}}
《Java教程數(shù)據(jù)庫(kù)》課件36《Java教程數(shù)據(jù)庫(kù)》PPT課件本課件僅供大家學(xué)習(xí)學(xué)習(xí)學(xué)習(xí)完畢請(qǐng)自覺刪除謝謝本課件僅供大家學(xué)習(xí)學(xué)習(xí)學(xué)習(xí)完畢請(qǐng)自覺刪除謝謝《Java教程數(shù)據(jù)庫(kù)》PPT課件本課件僅供大家學(xué)習(xí)學(xué)Java入門Java入門384Java數(shù)據(jù)庫(kù)技術(shù)4.1MySQL和JDBC4.2
使用JDBC4.3
實(shí)例4Java數(shù)據(jù)庫(kù)技術(shù)4.1MySQL和JDB394.1MySQL和JDBC概述MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQLAB公司開發(fā),目前屬于
Oracle
旗下公司。MySQL最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一,對(duì)于一般的個(gè)人使用者和中小型企業(yè)來說,MySQL提供的功能綽綽有余。4.1MySQL和JDBC概述MySQL是一個(gè)關(guān)系型數(shù)據(jù)40創(chuàng)建數(shù)據(jù)庫(kù)test:createdatabasetest創(chuàng)建表hero:CREATETABLEhero(idint(11)AUTO_INCREMENT,namevarchar(30),hpfloat,damageint(11),PRIMARYKEY(id))DEFAULTCHARSET=utf8;插入一條記錄蓋倫到表中:insertintoherovalues(null,'蓋倫',616,100)查詢所有數(shù)據(jù):select*fromhero統(tǒng)計(jì)表中有多少條數(shù)據(jù):selectcount(*)fromhero顯示前5條數(shù)據(jù):select*fromherolimit0,5修改:updateherosethp=818whereid=1刪除:deletefromherowhereid=1操作語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)test:createdatabasetes414.1MySQL和JDBCJDBC(JavaDatabaseConnection,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI(應(yīng)用程序設(shè)計(jì)接口),它由一些Java語(yǔ)言寫的類和界面組成。JDBC提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使得開發(fā)人員使用Java語(yǔ)言開發(fā)完整的數(shù)據(jù)庫(kù)應(yīng)用程序變得極為簡(jiǎn)單。通過JDBC,開發(fā)人員幾乎可以將SQL語(yǔ)句傳遞給任何一種數(shù)據(jù)庫(kù),而無需為各種數(shù)據(jù)庫(kù)編寫單獨(dú)的訪問程序。JDBC可以自動(dòng)將SQL語(yǔ)句傳遞給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)。4.1MySQL和JDBCJDBC(Ja42訪問MySQL數(shù)據(jù)庫(kù)需要用到第三方的類,這些第三方的類,都被壓縮在一個(gè)叫做Jar的文件里。
為了代碼能夠使用第三方的類,需要為項(xiàng)目導(dǎo)入mysql的專用Jar包。
通常都會(huì)把項(xiàng)目用到的jar包統(tǒng)一放在項(xiàng)目的lib目錄下導(dǎo)包步驟:右鍵project->property->javabuildpath->libaries->addexternaljars訪問MySQL數(shù)據(jù)庫(kù)需要用到第三方的類,這些第三方的類,都被43packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){ //初始化驅(qū)動(dòng)
try{//驅(qū)動(dòng)類//就在中
//如果忘記了第一個(gè)步驟的導(dǎo)包,就會(huì)拋出ClassNotFoundException
數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功!");
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}初始化驅(qū)動(dòng)通過Class.forName初始化驅(qū)動(dòng)類
就在中packagejdbc;初始化驅(qū)動(dòng)44JDBC擴(kuò)展了Java的功能,例如在Applet中應(yīng)用JDBC,可以實(shí)現(xiàn)與遠(yuǎn)程數(shù)據(jù)庫(kù)的連接,實(shí)現(xiàn)不同平臺(tái)數(shù)據(jù)庫(kù)之間的對(duì)話。簡(jiǎn)單地說,JDBC完成下面三個(gè)操作:(1)與一個(gè)數(shù)據(jù)庫(kù)建立連接。Connectioncon=DriverManager.getConnection("jdbc:odbc:CallCenter","sa","");(2)向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。stmt=con.createStatement();rs=stmt.executeQuery("SELECTCID,CPinfromtCustomerWHERECID='z1'");JDBC擴(kuò)展了Java的功能,例如在Appl45(3)處理數(shù)據(jù)庫(kù)返回的結(jié)果。while(rs.next()){ StringtheInt=rs.getString("CID"); Stringstr=rs.getString("CPin"); ...}(3)處理數(shù)據(jù)庫(kù)返回的結(jié)果。464.2使用JDBCJDBC的接口分為兩個(gè)層次:一個(gè)是面向程序開發(fā)人員的JDBCAPI;另外一個(gè)是底層的JDBCDriverAPI。JDBCAPI被描述成為一組抽象的Java接口,應(yīng)用程序可以對(duì)某個(gè)數(shù)據(jù)庫(kù)打開連接,執(zhí)行SQL語(yǔ)句并且處理結(jié)果。最重要的接口如下::處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫(kù)連接提供支持。:代表對(duì)特定數(shù)據(jù)庫(kù)的連接。:代表一個(gè)特定的容器,以對(duì)一個(gè)特定的數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句。:控制對(duì)一個(gè)特定語(yǔ)句的行數(shù)據(jù)的存取。4.2使用JDBCJDBC的接口分為兩47
其中又有兩個(gè)子類型::用于執(zhí)行預(yù)編譯的SQL語(yǔ)句。:用于執(zhí)行對(duì)一個(gè)數(shù)據(jù)庫(kù)內(nèi)嵌過程的調(diào)用。JDBCDriverAPI是指接口,封裝了不同數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序(像Access、Foxpro、SQLServer等)。由于它是數(shù)據(jù)庫(kù)底層處理,所以必須提供對(duì)、java.sql.Statement、和的實(shí)現(xiàn)。其中又有兩個(gè)子類型:48packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){ try{
//建立與數(shù)據(jù)庫(kù)的Connection連接
//這里需要提供:
//數(shù)據(jù)庫(kù)所處于的本機(jī))//數(shù)據(jù)庫(kù)的端口號(hào):3306(mysql專用端口號(hào))
//數(shù)據(jù)庫(kù)名稱how2java//編碼方式UTF-8//賬號(hào)root//密碼admin
連接數(shù)據(jù)庫(kù)packagejdbc;連接數(shù)據(jù)庫(kù)49//接上面的代碼Connectionc=DriverManager.getConnection("root","admin");
連接成功,獲取連接對(duì)象:"+c);
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}//接上面的代碼50packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{
Statement是用于執(zhí)行SQL語(yǔ)句的,比如增加,刪除packagejdbc;Statement是用于執(zhí)行S51Connectionc=DriverManager.getConnection("root","admin");
//注意:使用的是//不要不小心使用到:Statements=c.createStatement();
獲取Statement對(duì)象:"+s);
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}《Java教程數(shù)據(jù)庫(kù)》課件52packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{
Connectionc=DriverManager.getConnection("root","admin");
s.execute執(zhí)行sql語(yǔ)句
執(zhí)行成功后,用mysql-front進(jìn)行查看,明確插入成功packagejdbc;s.execute執(zhí)行sql語(yǔ)53Statements=c.createStatement();
//準(zhǔn)備sql語(yǔ)句
//注意:字符串要用單引號(hào)'Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";s.execute(sql);
執(zhí)行插入語(yǔ)句成功");
}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}執(zhí)行SQL語(yǔ)句之前要確保數(shù)據(jù)庫(kù)test中有表hero的存在,如果沒有,需要事先創(chuàng)建表執(zhí)行SQL語(yǔ)句之前要確保數(shù)據(jù)庫(kù)test中有表hero的存在,54在回收垃圾語(yǔ)句后面加上下面語(yǔ)句finally{//數(shù)據(jù)庫(kù)的連接時(shí)有限資源,相關(guān)操作結(jié)束后,養(yǎng)成關(guān)閉數(shù)據(jù)庫(kù)的好習(xí)慣
//先關(guān)閉Statementif(s!=null)try{s.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}//后關(guān)閉Connectionif(c!=null)try{c.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}數(shù)據(jù)庫(kù)的連接是有限資源,相關(guān)操作結(jié)束后,養(yǎng)成關(guān)閉數(shù)據(jù)庫(kù)的好習(xí)慣
先關(guān)閉Statement
后關(guān)閉Connection在回收垃圾語(yǔ)句后面加上下面語(yǔ)句數(shù)據(jù)庫(kù)的連接是有限資源,相關(guān)操55packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){
try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
使用try-with-resource的方式自動(dòng)關(guān)閉連接packagejdbc;使用try-with-resour56try("root","admin");Statements=c.createStatement();){Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";s.execute(sql);
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}《Java教程數(shù)據(jù)庫(kù)》課件57Stringsql="insertintoherovalues(null,"+"'提莫'"+","+313.0f+","+50+")";Stringsql="deletefromherowhereid=5";Stringsql="updateherosetname='name5'whereid=3";增、刪、改語(yǔ)句Stringsql="insertintohero58packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
"root","admin");Statements=c.createStatement();){
executeQuery執(zhí)行SQL查詢語(yǔ)句packagejdbc;executeQuery執(zhí)行SQ59Stringsql="select*fromhero";
//執(zhí)行查詢語(yǔ)句,并把結(jié)果集返回給ResultSetResultSetrs=s.executeQuery(sql);while(rs.next()){intid=rs.getInt("id");//可以使用字段名
Stringname=rs.getString(2);//也可以使用字段的順序
floathp=rs.getFloat("hp");intdamage=rs.getInt(4);}//不一定要在這里關(guān)閉ReultSet,因?yàn)镾tatement關(guān)閉的時(shí)候,會(huì)自動(dòng)關(guān)閉ResultSet//rs.close();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}在取第二列的數(shù)據(jù)的時(shí)候,用的是rs.get(2),而不是get(1).這個(gè)是整個(gè)Java自帶的api里唯二的地方在取第二列的數(shù)據(jù)的時(shí)候,用的是rs.get(2),而不是g60packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}
PreparedStatement也是用來執(zhí)行sql語(yǔ)句的與創(chuàng)建Statement不同的是,需要根據(jù)sql語(yǔ)句創(chuàng)建PreparedStatement除此之外,還能能夠通過設(shè)置參數(shù),指定相應(yīng)的值,而不是Statement那樣使用字符串拼接packagejdbc;PreparedStatement61
Stringsql="insertintoherovalues(null,?,?,?)";//根據(jù)sql語(yǔ)句創(chuàng)建PreparedStatementPreparedStatementps=c.prepareStatement(sql);){
//設(shè)置參數(shù)
ps.setString(1,"提莫");ps.setFloat(2,313.0f);ps.setInt(3,50);//執(zhí)行
ps.execute();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}使用參數(shù)設(shè)置,可讀性好,不易犯錯(cuò)有預(yù)編譯機(jī)制,性能比Statement更快防止SQL注入式攻擊使用參數(shù)設(shè)置,可讀性好,不易犯錯(cuò)62packagejdbc;
publicclassTestJDBC{publicstaticvoidmain(String[]args){try{}catch(ClassNotFoundExceptione){e.printStackTrace();}Statements=c.createStatement();){//有事務(wù)的前提下
//在事務(wù)中的多個(gè)操作,要么都成功,要么都失敗
使用事務(wù)在事務(wù)中的多個(gè)操作,要么都成功,要么都失敗
通過c.setAutoCommit(false);關(guān)閉自動(dòng)提交
使用mit();進(jìn)行手動(dòng)提交packagejdbc;使用事務(wù)63
c.setAutoCommit(false);
//加血的SQLStringsql1="updateherosethp=hp+1whereid=22";s.execute(sql1);
//減血的SQL//不小心寫錯(cuò)寫成了updata(而非update)
Stringsql2="updataherosethp=hp-1whereid=22";s.execute(sql2);
//手動(dòng)提交
mit();
}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}
}}
64packagecharactor;publicclassHero{//增加id屬性
publicintid;publicStringname;publicfloathp;publicintdamage;}ORM=ObjectRelationshipDatabaseMapping
對(duì)象和關(guān)系數(shù)據(jù)庫(kù)的映射
簡(jiǎn)單說,一個(gè)對(duì)象,對(duì)應(yīng)數(shù)據(jù)庫(kù)里的一條記錄例:根據(jù)id返回一個(gè)Hero對(duì)象先構(gòu)建一個(gè)Hero類packagecharactor;ORM=ObjectR65packagejdbc;
importcharactor.Hero;
publicclassTestJDBC{publicstaticHeroget(intid){Herohero=null;}catch(ClassNotFoundExceptione){e.printStackTrace();}Statements=c.createStatement();){
Stringsql="select*fromherowhereid="+id;
packagejdbc;66
ResultSetrs=s.executeQuery(sql);
//因?yàn)閕d是唯一的,ResultSet最多只能有一條記錄
//所以使用if代替whileif(rs.next()){hero=newHero();Stringname=rs.getString(2);floathp=rs.getFloat("hp");intdamage=rs.getInt(4);=name;hero.hp=hp;hero.damage=damage;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省泰州市2025屆高三第一次調(diào)研測(cè)試數(shù)學(xué)試題(解析版)
- 美國(guó)稅人心得體會(huì)
- 室內(nèi)設(shè)計(jì)的發(fā)展方向
- 招標(biāo)代理委托居間合同
- 辦公區(qū)域大型活動(dòng)策劃方案與指南
- 工業(yè)污水處理可行性報(bào)告
- 中醫(yī)護(hù)理學(xué)(第5版)課件 望診1
- 食品行業(yè)質(zhì)量安全追溯與智能倉(cāng)儲(chǔ)管理方案
- 二零二五年度辦公室新風(fēng)系統(tǒng)智能化升級(jí)改造合同
- 工作效率提升策略實(shí)施計(jì)劃
- 四川省2023年普通高等學(xué)校高職教育單獨(dú)招生文化考試(中職類)數(shù)學(xué)試題(原卷版)
- 水力機(jī)械原理與設(shè)計(jì)課件
- 江蘇電子信息職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 充電樁采購(gòu)安裝投標(biāo)方案(技術(shù)方案)
- 7.1開放是當(dāng)代中國(guó)的鮮明標(biāo)識(shí)課件-高中政治選擇性必修一當(dāng)代國(guó)際政治與經(jīng)濟(jì)(1)2
- 2024年浙江首考英語(yǔ)聽力原文解惑課件
- 民族團(tuán)結(jié)教材
- 煤礦頂板管理技術(shù)培訓(xùn)課件
- 紀(jì)念中國(guó)人民抗日戰(zhàn)爭(zhēng)暨世界反法西斯戰(zhàn)爭(zhēng)勝利周年大合唱比賽
- 生化檢驗(yàn)質(zhì)控及失控分析
- 2023年重慶市大渡口區(qū)春暉路街道陽(yáng)光社區(qū)工作人員考試模擬試題及答案
評(píng)論
0/150
提交評(píng)論