亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

jsp中的數據庫編程

2024-09-05 00:19:23
字體:
來源:轉載
供稿:網友


一,sql復習
1,sql語句分為兩類:ddl(data definition language)和dml(dat manipulation languge,數據操作語言)。前者主要是定義數據邏輯結構,包括定義表、視圖和索引;dml主要是對數據庫進行查詢和更新操作。
2,create table(ddl):
create table tabname(
colname1 coltype1 [else],
colname2 coltype2 [else],
...,
colnamen coltypen [else]
);
例如:cteate table pjoiner(
pno char(6) not null,
eno char(6) nut null
);
char int varchar等等都是用來定義列數據類型的保留字,其中varchar表示可變字符類型。
3,select <col1>,<col2>,...,<coln>
from <tab1>,<tab2>,...,<tabm>
[where<條件>]

條件中的子查詢:
where not exists(
select * from tab2 where col1=col2
)//當查詢結果為空時,條件為真。

4,insert into <tab1> values(<col1>, ...<coln>)
5,delete from <tab1> [where<條件>]
6,update <tab1>
set <tab1>=<vlu1>
...
<tabn>=<vlun>
[where<條件>]
例如:
update exployee
set age=27
where name='趙一'
二,jdbc 主要接口:
java.sql.drivermanager類用于處理驅動程序的調入并且對新的數據庫連接提供支持。
java.sql.connection,指應用程序與特定數據庫的連接。
java.sql.statement,用于一般sql語句的執行(可以是查詢、更新甚至可以創建數據庫的執行過程)
java.sql.resultset,查詢所返回的結果保存在此對象中,用它可以瀏覽和存取數據庫內的記錄。

1,通過jdbc-odbc橋使用odbc數據庫(并不需要jdbc drivers)

先在odbc dsn(data source name)設置處設置pubs sysdsn,sa為username,密碼為空
class.forname("sun.jdbc.odbc.jdbcodbcdriver");//加載驅動程序
con=drivermanager.getconnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs
con.close();
//應當catch classnotfoundexception和sqlexception

connection的getwarning方法返回一個sqlwarning對象,在連接之前應當先檢查。
使用jdbc-odbc的最大好處是:免費的。但是性能受odbc的限制,而且一般odbc驅動比較昂貴。
2,使用專門的jdbc驅動程序。//此處是mm jdbc driver
先將jar文件放在classpath里面。
class.forname("org.gjt.mm.mysql.driver");
con=drivermanager.getconnection("jdbc:mysql://localhost:3306/dbname","root","");
con.close();

可見使用何種方式連接何種數據庫與數據庫的操作和連接數據庫是無關的。
三,查詢數據庫
statement stmt=con.createstatement();
stmt.setmaxrows()可以控制輸出記錄最大數量;
resultset rs=stmt.executequery("select .....");

resultset指向當前記錄:
int userid=rs.getint("userid");
string username=rs.getstring("username");
...或者用序號(從1開始的)
int userid=rs.getint(1);
stirng username=rs.getstring(2);

classnotfoundexception是由于class.forname()無法載入jdbc驅動程序觸發的
sqlexception是jdbc在執行過程中發生問題時產生。有一個額外的方法getnextexception()
catch(sqlexception e){
out.println(e.getmessage());
while(e=e.getnextexception()){
out.println(e.getmessage());
}
}

一般來說并不建議在jsp中編寫數據庫的訪問程序,可以將數據庫的訪問封裝在一個javabean中。
四,resultset深入
1,resultsetmetadata
resultset rs=stmt.executequery("select....");
resultsetmetadata rsmd=rs.getmetadata(); //獲取resultsetmatedata對象
int numberofcolumns=rsmd.getcolumncount();//返回列數
boolean b=rsmd.issearchable(int i);//返回第i列是否可以用于where子句
string c=rsmd.getcolumnlabel(int i);//獲取第i列的列標
objcet obj=rs.getobject();
if(obj!=null)out.println(obj.tostring());
else println("");
2,sql類型與resultset的getobject返回類型及對應的xxx getxxx()方法
sql類型 jsp類型 對應的getxxx()方法
————————————————————————————————————————————
char string string getstring()
varchar string string getstring()
longvarchar string inputstream getasciistream()/getunicodestream()
numeric java.math.bigdecimal java.math.bigdecimal getbigdecimal()
decimal 同上
bit boolean boolean getboolean()
tinyint integer byte getbyte()
smallint integer short getshort()
integer integer int getint()
bigint long long getlong()
real float float getfloat()
float double double getdouble()
double double double getdouble()
binary byte[] byte[] getbytes()
varbinary byte[] byte[] getbytes()
longvarbinary byte[] inputstream getbinarystream()
date java.sql.date java.sql.date getdate()
time java.sql.time java.sql.time gettime()
timestamp java.sql.timestamp java.sql.timestamp gettimestamp()

3,null
int i=rs.getint("age");
if(!rs.wasnull())....//recordset::wasnull()用來檢查null
4,存取大字符串和二進制文本
對于數據庫中longvarchar和langvarbinary進行流操作
resultset rs=stmt.executequerystring("select ...");
bufferedreader br=new bufferedreader(new inputstream(rs.getasciistream("vol1")));//長文本串
bufferedreader br=new bufferedreader(new inputstream(rs.getunicodestream("vol1")));
bufferedreader br=new bufferedreader(new inputstream(rs.getbinarystream("vol2")));//長二進制文本
//取數據必須在rs.getasciistream(), rs.getunicodestream(), rs.getbinarystream()等之后馬上進行


五,瀏覽resultset
1,jdbc2.0提供了更多瀏覽resultset的方法
首先,確定你的jdbc驅動程序支持jdbc2.0
其次,由connection生成statement時要指定參數
statement stmt=con.getstatement("游標類型", "記錄更新權限");
游標類型:
resultset.type_forword_only:只可以向前移動
resultset.type_scroll_insensitive:可卷動。但是不受其他用戶對數據庫更改的影響。
resultset.type_scroll_sensitive:可卷動。當其他用戶更改數據庫時這個記錄也會改變。
記錄更新權限:
resultset.concur_read_only,只讀
resultset.concur_updatable,可更新

getstatement()缺省參數:getstatement(resultset.type_forword_only, resultset.concur_read_only)
2,如果resultset是可卷動的,以下函數可以使用:
rs.absolute()//絕對位置,負數表示從后面數
rs.first()第一條
rs.last()最后一條
rs.previoust()前一條
rs.next()后一條
rs.beforefirst()第一條之前
rs.afterlast()最后之后
rs.isfirst(),rs.islast(),rs.isbeforefirst(),rs.isafterlast
注意,剛打開的時候是處于第一條記錄之前的

六,更新數據庫
1,stmt.executeupdate("strsql"),strsql是一條sql更新語句。update,insert,delete返回影響到的條數
2,stmt.execute()方法在不知道sql語句是查詢還是更新的時候用。如果產生一條以上的對象時,返回true,此時可用 stmt.getresultset()和stmt.getupdatecount()來獲取execute結果,如果不返回resultset對象則返回false.
3,除了statement的executeupdate之外還可以用resultset:
rs.updateint(1,10);
rs.updatestring(2,"sfafd");
rs.updaterow();

七,使用預編譯preparedstatement
preparedstatement對象和statement對象類似,都可以用來執行sql語句。不同在于,數據庫會對preparedstatement的sql語句進行預編譯,而且仍舊能輸入參數并重復執行編譯好的查詢速度比未編譯的要快。
preparedstatement stmt=con.preparedstatement("insert into users(userid, username) values(?,?)");
stmt.clearparameters();
stmt.setint(1,2);
stmt.setstring(2,"big");
stmt.executeupdate();

八,執行存儲過程
1,jdbc調用存儲過程,并使用存儲過程的返回值。這樣可以將處理工作分為服務端和客戶端兩部分,并大大加快系統的設計和開發的時間。比如可以重復使用服務器上的組件。使用存儲過程之后大量諸計算工作可以交給數據庫服務器來處理,這將降低web服務器的負載,從而提高整個系統的性能。
2,有兩個表usermain{userid,username,usertype},userref{brefid, userid, userbrief}
下面的存儲過程可以接受jdbc傳來的參數,新增內容到usermain和userref,并輸出一個outuserid.
create procedure ap_adduser
(
@outuserid int output, //此為輸出參數,output標記
@username varchar(25), //參數表示方法:"@xxx"為變量名,"變量名 類型 [output]"
@usertype tinyint,
@userbrief varchar(255),
)
as
declare @userid int //定義局部變量
insert into usermain(username, usertype)
values(@username,@usertype)
select @[email protected]@identity //賦值用select,此處自動獲得id
insert into userref(userid, userbrief)
select @[email protected]
go/*結束,基本結構:
create procedure procedurename(
parameters
)
as
actions
go
*/


jsp頁面中這樣使用:
callablestatement stmt=con.preparecall("{call ap_adduser(?,?,?,?)}");
stmt.registeroutparameter(1,types.integer,1);//注冊輸出變量
stmt.setstring(2,"edmund");
stmt.setint(3,1);
stmt.setstring(4,"description");
stmt.execute();
int userid=stmt.getint(1);
stmt.close()

八,使用事務
1,事務中的操作是一個整體,要么都執行成功要么都不成功:事務開始后,如果所有的改變都正確,則使用commit方法將這些動作全部存入數據庫,否則就使用rollback取消所有的改變動作,而這時數據庫中的數據和執行事務前的是相同的。
2,使用事務時應當先用 con.setautocommit(false),最后使用commit或者rollback
3,rollback一般在catch段執行
九,數據庫連接池
1,如果有一個數據庫連接請求并且連接中沒有連接,則生成一個新的連接。這個連接使用完之后并不關閉它,而是將它放入連接池。在這個過程中,還要判斷連接池中的連接是否超期。如果超期則將它關閉。
2,有很多已有的connection pool包可以使用。
3,一般將connection pool作為一個application作用域的變量使用
<jsp:usebean id="pool" scope="application" class="javastart.tools.connectionpool" />
<%@page import="java.sql.*"%>
<%@page import="javastart.tools.*"%>
<!--javastart.tools是你的connection pool所在的地方-->
dbconnection con=null;
try{
con=pool.getconnection("sun.jdbc.odbc.jdbcodbcdriver","jdbc:odbc:access","","");
statement stmt=con.createstatement();
stmt.setmaxrows(10);
string query=request.getparameter("quey");
resultset rs=stml.executequery(query);
resultsetmetadata rsmd=rs.getmetadata();
}
.....
finally{
pool.releaseconnection(con);
}

也可以使用一個servlet初始化連接池

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久天天躁狠狠躁夜夜躁2014| 亚洲自拍av在线| 欧美成aaa人片免费看| 亚洲第一网站免费视频| 成人福利在线视频| 国产成人精品免高潮在线观看| 欧美黑人性猛交| 91亚洲国产成人精品性色| 欧美日产国产成人免费图片| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲精品永久免费精品| 97在线看免费观看视频在线观看| 久久人人97超碰精品888| 亚洲欧美日韩爽爽影院| 美女999久久久精品视频| 日韩美女在线观看一区| 久久亚洲精品一区二区| 国产精品高潮粉嫩av| 亚洲国产私拍精品国模在线观看| 91视频国产高清| 中文字幕日韩在线观看| 欧美乱大交做爰xxxⅹ性3| 国产成人精品久久| 疯狂欧美牲乱大交777| 亚洲桃花岛网站| 欧美亚洲视频在线观看| 欧美丰满少妇xxxxx| 国模视频一区二区| 97视频国产在线| 亚洲精品福利在线| 日韩小视频在线| 亚洲欧美综合另类中字| 欧美裸体xxxxx| 亚洲国产精久久久久久| 亚洲天堂av图片| 久久久国产精品一区| 欧美在线www| 亚洲精品视频网上网址在线观看| 日韩中文字幕在线看| 在线观看欧美成人| 国产精品白丝jk喷水视频一区| 国产成人av在线| 久久久久久高潮国产精品视| 欧美国产日韩一区二区三区| 欧美激情喷水视频| 国产精品亚洲综合天堂夜夜| 色婷婷亚洲mv天堂mv在影片| 久久精品青青大伊人av| 国产成人一区二区三区| 亚洲欧洲日产国产网站| 亚洲国产精品va在线观看黑人| 亚洲精品一区av在线播放| 日韩欧美亚洲范冰冰与中字| 国产精品网站入口| 91香蕉国产在线观看| 欧美在线精品免播放器视频| 成人疯狂猛交xxx| 亚洲最新av在线| 欧美在线影院在线视频| 欧美专区在线播放| 欧美激情一区二区三区在线视频观看| 国产福利精品av综合导导航| 精品国产一区二区在线| 国产成人啪精品视频免费网| 国产精品亚洲视频在线观看| 亚洲一区二区在线播放| 久久天天躁狠狠躁老女人| 国产精品欧美久久久| 亚洲福利视频网站| 日韩中文第一页| 日韩一区av在线| 日韩欧美精品中文字幕| 国产精品成人av性教育| 亚洲第五色综合网| 91精品视频免费看| 亚洲va国产va天堂va久久| 国产手机视频精品| 日韩欧美中文在线| 日韩在线www| 亚洲国产欧美在线成人app| 2019中文字幕全在线观看| 色婷婷av一区二区三区在线观看| 日韩性生活视频| 成人性生交大片免费看视频直播| 亚洲男人天堂视频| 久久久久国色av免费观看性色| 亚洲综合第一页| 色多多国产成人永久免费网站| 亚洲欧美日韩中文视频| 亚洲国产又黄又爽女人高潮的| 日韩av在线最新| 国产成人久久久精品一区| 91免费的视频在线播放| 啪一啪鲁一鲁2019在线视频| 亚洲xxxxx性| 97av在线播放| 尤物yw午夜国产精品视频| 国产91精品青草社区| 日韩av片免费在线观看| 欧美日韩亚洲视频一区| 色与欲影视天天看综合网| 色综合亚洲精品激情狠狠| 日韩成人激情在线| 亚洲欧美国产日韩天堂区| 日韩电影中文字幕在线| 亚洲第一视频网| 深夜福利日韩在线看| 国产精品久久久久久久app| 欧美亚洲在线播放| 91精品国产综合久久久久久久久| 欧美在线性爱视频| 国产久一一精品| 色无极亚洲影院| 日韩少妇与小伙激情| 国产精品一区二区三区在线播放| 国产精品无av码在线观看| 国产精品久久久久久久久久久新郎| 久久91超碰青草是什么| 91精品在线观看视频| 91精品国产综合久久久久久蜜臀| 欧洲精品在线视频| 欧美精品电影免费在线观看| 91免费的视频在线播放| 欧美午夜宅男影院在线观看| 亚洲福利在线视频| 久久久av一区| 亚洲综合成人婷婷小说| 国外成人在线播放| 亚洲精品午夜精品| 亚洲色图色老头| 日韩中文字幕免费| 欧美激情在线播放| 中文字幕亚洲综合久久筱田步美| 国产成人亚洲综合91| 亚洲欧美变态国产另类| 欧美成人在线影院| 欧美怡红院视频一区二区三区| 日本亚洲精品在线观看| 亚洲一区二区三区sesese| 2018中文字幕一区二区三区| 欧美电影免费在线观看| 视频一区视频二区国产精品| 日韩禁在线播放| 亚洲人午夜色婷婷| 国产剧情久久久久久| 欧美日韩国产精品| 国产美女精品免费电影| 亚洲精品一区二区三区婷婷月| 97香蕉超级碰碰久久免费软件| 欧美激情国产精品| 国产男人精品视频| 欧美日韩xxxxx| 欧美疯狂xxxx大交乱88av| 欧美亚洲另类在线| 亚洲毛片在线看| 国产精品久久久久91| 日韩视频在线观看免费| 久操成人在线视频| 国产精品视频网站| 欧美日韩一区二区免费在线观看| 国产精品入口日韩视频大尺度| 亚洲无av在线中文字幕| 中文字幕av一区| 亚洲国产91精品在线观看|