成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JSP編程技巧:數(shù)據(jù)庫(kù)的利用

開發(fā) 后端
本文將講解JSP編程技巧中的數(shù)據(jù)庫(kù)部分。Web開發(fā)中很重要的一條就是連接數(shù)據(jù)庫(kù),以及對(duì)數(shù)據(jù)庫(kù)盡可能高效的利用,JSP也不例外。

一,SQL復(fù)習(xí)

1,SQL語(yǔ)句分為兩類:DDL(Data Definition Language)和DML(Dat Manipulation Languge,數(shù)據(jù)操作語(yǔ)言)。前者主要是定義數(shù)據(jù)邏輯結(jié)構(gòu),包括定義表、視圖和索引;DML主要是對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢和更新操作。

2,Create Table(DDL):

  1. Create Table tabName(  
  2. colName1 colType1 [else],  
  3. colName2 colType2 [else],  
  4. ...,  
  5. colNamen colTypen [else]  
  6. );  
  7. 例如:Cteate Table pJoiner(  
  8. pno char(6) not null,  
  9. eno char(6) nut null 
  10. ); 

char int varchar等等都是用來(lái)定義列數(shù)據(jù)類型的保留字,其中varchar表示可變字符類型。

3,Select ,,...,From ,,...,[Where<條件>]

條件中的子查詢:

  1. Where Not Exists(  
  2. Select * From tab2 Where col1=col2  
  3. )//當(dāng)查詢結(jié)果為空時(shí),條件為真。 

4,INSERT INTO VALUES(, ...)

5,DELETE FROM [WHERE<條件>]

6,UPDATE

  1. SET =  
  2. ...  
  3. =  
  4. [WHERE<條件>]  
  5. 例如:  
  6. Update exployee  
  7. Set age=27  
  8. Where name=趙一 

二,JDBC 主要接口:

java.sql.DriverManager類用于處理驅(qū)動(dòng)程式的調(diào)入并且對(duì)新的數(shù)據(jù)庫(kù)連接提供支持。

java.sql.Connection,指應(yīng)用程式和特定數(shù)據(jù)庫(kù)的連接。

java.sql.Statement,用于一般sql語(yǔ)句的執(zhí)行(能是查詢、更新甚至能創(chuàng)建數(shù)據(jù)庫(kù)的執(zhí)行過(guò)程)

java.sql.ResultSet,查詢所返回的結(jié)果保存在此對(duì)象中,用他能瀏覽和存取數(shù)據(jù)庫(kù)內(nèi)的記錄。

1,通過(guò)jdbc-odbc橋使用odbc數(shù)據(jù)庫(kù)(并不必jdbc Drivers)

先在odbc DSN(Data Source Name)設(shè)置處設(shè)置pubs sysDSN,sa為username,密碼為空

  1. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載驅(qū)動(dòng)程式  
  2. con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs  
  3. con.close();  
  4. //應(yīng)當(dāng)catch ClassNotFoundException和SQLException 

Connection的getWarning方法返回一個(gè)SQLWarning對(duì)象,在連接之前應(yīng)當(dāng)先檢查。

使用jdbc-odbc的***好處是:免費(fèi)的。不過(guò)性能受odbc的限制,而且一般odbc驅(qū)動(dòng)比較昂貴。

2,使用專門的jdbc驅(qū)動(dòng)程式。//此處是mm jdbc Driver

先將jar文件放在ClassPath里面。

  1. Class.forName("org.gjt.mm.mysql.Driver");  
  2. con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");  
  3. con.close(); 

可見使用何種方式連接何種數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)的操作和連接數(shù)據(jù)庫(kù)是無(wú)關(guān)的。

三,查詢數(shù)據(jù)庫(kù)

Statement stmt=con.createStatement();

stmt.setMaxRows()能控制輸出記錄***數(shù)量;

ResultSet rs=stmt.executeQuery("select .....");

ResultSet指向當(dāng)前記錄:

int userId=rs.getInt("userid");

String userName=rs.getString("username");

...或用序號(hào)(從1開始的)

int userId=rs.getInt(1);

Stirng userName=rs.getString(2);

ClassNotFoundException是由于Class.forName()無(wú)法載入jdbc驅(qū)動(dòng)程式觸發(fā)的

SQLException是jdbc在執(zhí)行過(guò)程中發(fā)生問(wèn)題時(shí)產(chǎn)生。有一個(gè)額外的方法

  1. getNextException()  
  2. catch(SQLException e){  
  3. out.println(e.getMessage());  
  4. while(ee=e.getNextException()){  
  5. out.println(e.getMessage());  
  6. }  

一般來(lái)說(shuō)并不建議在jsp中編寫數(shù)據(jù)庫(kù)的訪問(wèn)程式,能將數(shù)據(jù)庫(kù)的訪問(wèn)封裝在一個(gè)javabean中。

四,ResultSet深入

1,ResultSetMetaData

ResultSet rs=stmt.executeQuery("select....");

ResultSetMetaData rsmd=rs.getMetaData(); //獲取ResultSetMateData對(duì)象

int numberOfColumns=rsmd.getColumnCount();//返回列數(shù)

boolean b=rsmd.isSearchable(int i);//返回第i列是否能用于where子句

String c=rsmd.getColumnLabel(int i);//獲取第i列的列標(biāo)

Objcet obj=rs.getObject();

if(obj!=null)out.println(obj.toString());

else println("");

2,SQL類型和ResultSet的getObject返回類型及對(duì)應(yīng)的XXX getXXX()方法

SQL類型 JSP類型 對(duì)應(yīng)的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()用來(lái)檢查null

4,存取大字符串和二進(jìn)制文本

對(duì)于數(shù)據(jù)庫(kù)中l(wèi)ongvarchar和langvarbinary進(jìn)行流操作

ResultSet rs=stmt.executeQueryString("select ...");

BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//長(zhǎng)文本串

BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));

BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//長(zhǎng)二進(jìn)制文本

//取數(shù)據(jù)必須在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后馬上進(jìn)行

五,瀏覽ResultSet

1,JDBC2.0提供了更多瀏覽ResultSet的方法

首先,確定你的jdbc驅(qū)動(dòng)程式支持jdbc2.0

其次,由Connection生成Statement時(shí)要指定參數(shù)

Statement stmt=con.getStatement("游標(biāo)類型", "記錄更新權(quán)限");

游標(biāo)類型:

ResultSet.TYPE_FORWORD_ONLY:只能向前移動(dòng)

ResultSet.TYPE_SCROLL_INSENSITIVE:可卷動(dòng)。不過(guò)不受其他用戶對(duì)數(shù)據(jù)庫(kù)更改的影響。

ResultSet.TYPE_SCROLL_SENSITIVE:可卷動(dòng)。當(dāng)其他用戶更改數(shù)據(jù)庫(kù)時(shí)這個(gè)記錄也會(huì)改動(dòng)。

記錄更新權(quán)限:

ResultSet.CONCUR_READ_ONLY,只讀

ResultSet.CONCUR_UPDATABLE,可更新

getStatement()缺省參數(shù):getStatement(ResultSet.TYPE_FORWORD_ONLY, ResultSet.CONCUR_READ_ONLY)

2,如果ResultSet是可卷動(dòng)的,以下函數(shù)能使用:

rs.absolute()//絕對(duì)位置,負(fù)數(shù)表示從后面數(shù)

rs.first()***條

rs.last()***一條

rs.previoust()前一條

rs.next()后一條

rs.beforeFirst()***條之前

rs.afterLast()***之后

rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLast

注意,剛打開的時(shí)候是處于***條記錄之前的

六,更新數(shù)據(jù)庫(kù)

1,stmt.executeUpdate("strSql"),strSql是一條sql更新語(yǔ)句。update,insert,delete返回影響到的條數(shù)

2,stmt.execute()方法在不知道sql語(yǔ)句是查詢還是更新的時(shí)候用。如果產(chǎn)生一條以上的對(duì)象時(shí),返回true,此時(shí)可用 stmt.getResultSet()和stmt.getUpdateCount()來(lái)獲取execute結(jié)果,如果不返回ResultSet對(duì)象則返回false.

3,除了Statement的executeUpdate之外還能用ResultSet:

rs.updateInt(1,10);

rs.updateString(2,"sfafd");

rs.updateRow();

七,使用預(yù)編譯PreparedStatement

PreparedStatement對(duì)象和Statement對(duì)象類似,都能用來(lái)執(zhí)行SQL語(yǔ)句。不同在于,數(shù)據(jù)庫(kù)會(huì)對(duì)PreparedStatement的SQL語(yǔ)句進(jìn)行預(yù)編譯,而且仍舊能輸入?yún)?shù)并重復(fù)執(zhí)行編譯好的查詢速度比未編譯的要快。

PreparedStatement stmt=con.preparedStatement("Insert Into users(userid, username) values(?,?)");

stmt.clearParameters();

stmt.setInt(1,2);

stmt.setString(2,"Big");

stmt.executeUpdate();

八,執(zhí)行存儲(chǔ)過(guò)程

1,JDBC調(diào)用存儲(chǔ)過(guò)程,并使用存儲(chǔ)過(guò)程的返回值。這樣能將處理工作分為服務(wù)端和客戶端兩部分,并大大加快系統(tǒng)的設(shè)計(jì)和研發(fā)的時(shí)間。比如能重復(fù)使用服務(wù)器上的組件。使用存儲(chǔ)過(guò)程之后大量諸計(jì)算工作能交給數(shù)據(jù)庫(kù)服務(wù)器來(lái)處理,這將降低Web服務(wù)器的負(fù)載,從而提高整個(gè)系統(tǒng)的性能。

2,有兩個(gè)表UserMain{UserID,UserName,UserType},UserRef{BrefID, UserID, UserBrief}

下面的存儲(chǔ)過(guò)程能接受jdbc傳來(lái)的參數(shù),新增內(nèi)容到UserMain和UserRef,并輸出一個(gè)OutUserID.

  1. CREATE PROCEDURE ap_adduser  
  2. (  
  3. @OutUserID int output, //此為輸出參數(shù),output標(biāo)記  
  4. @UserName varchar(25), //參數(shù)表示方法:"@XXX"為變量名,"變量名 類型 [output]" 
  5. @UserType tinyint,  
  6. @UserBrief varchar(255),  
  7. )  
  8. AS 
  9. Declare @UserID int //定義局部變量  
  10. insert into UserMain(UserName, UserType)  
  11. values(@UserName,@UserType)  
  12. select @UserID=@@IDENTITY //賦值用select,此處自動(dòng)獲得ID  
  13. insert into UserRef(UserID, UserBrief)  
  14. select @OutUserID=@UserID  
  15. GO/*結(jié)束,基本結(jié)構(gòu):  
  16. CREATE PROCEDURE procedureName(  
  17. parameters  
  18. )  
  19. AS 
  20. actions  
  21. GO  
  22. */ 

JSP頁(yè)面中這樣使用:

  1. CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");  
  2. stmt.registerOutParameter(1,Types.INTEGER,1);//注冊(cè)輸出變量  
  3. stmt.setString(2,"edmund");  
  4. stmt.setInt(3,1);  
  5. stmt.setString(4,"description");  
  6. stmt.execute();  
  7. int userid=stmt.getInt(1);  
  8. stmt.close() 

八,使用事務(wù)

1,事務(wù)中的操作是個(gè)整體,要么都執(zhí)行成功要么都不成功:事務(wù)開始后,如果所有的改動(dòng)都正確,則使用commit方法將這些動(dòng)作全部存入數(shù)據(jù)庫(kù),否則就使用rollback取消所有的改動(dòng)動(dòng)作,而這時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)和執(zhí)行事務(wù)前的是相同的。

2,使用事務(wù)時(shí)應(yīng)當(dāng)先用 con.setAutoCommit(false),***使用commit或rollback

3,rollback一般在catch段執(zhí)行

九,數(shù)據(jù)庫(kù)連接池

1,如果有一個(gè)數(shù)據(jù)庫(kù)連接請(qǐng)求并且連接中沒(méi)有連接,則生成一個(gè)新的連接。這個(gè)連接使用完之后并不關(guān)閉他,而是將他放入連接池。在這個(gè)過(guò)程中,還要判斷連接池中的連接是否超期。如果超期則將他關(guān)閉。

2,有非常多已有的Connection Pool包能使用。

3,一般將Connection Pool作為一個(gè)application作用域的變量使用

  1. DBConnection con=null;  
  2. try{  
  3. con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");  
  4. Statement stmt=con.createStatement();  
  5. stmt.setMaxRows(10);  
  6. String query=request.getParameter("quey");  
  7. ResultSet rs=stml.executeQuery(query);  
  8. ResultSetMetaData rsrsmd=rs.getMetaData();  
  9. }  
  10. .....  
  11. finally{  
  12. pool.releaseConnection(con);  

也能使用一個(gè)Servlet初始化連接池

【編輯推薦】

  1. JSP數(shù)據(jù)庫(kù)操作例程(JDBC-ODBC)
  2. Java Servlets(JSP)開發(fā)環(huán)境
  3. 開發(fā)JSP HTTP服務(wù)器
  4. 選擇JSP開發(fā)工具
  5. Servlet和JSP路徑詳細(xì)介紹
責(zé)任編輯:彭凡 來(lái)源: 百度空間
相關(guān)推薦

2022-05-06 18:55:29

Java技巧Shellcode

2011-03-10 11:17:03

數(shù)據(jù)庫(kù)設(shè)計(jì)技巧

2009-07-14 18:13:36

Microsoft J

2009-07-03 11:27:11

JSP編程思想

2009-06-30 15:15:30

JSP數(shù)據(jù)庫(kù)

2009-07-01 11:08:14

JSP DestoryJSP Init數(shù)據(jù)庫(kù)鏈接

2011-03-22 16:31:35

Access數(shù)據(jù)庫(kù)

2010-04-06 11:19:28

Oracle數(shù)據(jù)庫(kù)

2009-05-15 10:11:55

數(shù)據(jù)庫(kù)查詢查詢性能分頁(yè)瀏覽

2009-12-30 15:58:42

ADO.NET數(shù)據(jù)庫(kù)編

2009-07-06 15:57:56

獲取數(shù)據(jù)庫(kù)連接JSP

2010-11-29 11:51:59

Sybase數(shù)據(jù)庫(kù)維護(hù)

2010-01-26 16:55:35

Android數(shù)據(jù)庫(kù)操

2011-04-12 09:43:17

Sybase數(shù)據(jù)庫(kù)修復(fù)技巧

2009-06-24 13:07:44

Android數(shù)據(jù)庫(kù)

2011-03-08 09:27:34

SQL Server數(shù)死鎖

2017-09-27 09:36:22

數(shù)據(jù)庫(kù)基礎(chǔ)技巧數(shù)據(jù)庫(kù)大小

2009-05-18 13:18:54

字符Oracle字符串

2010-08-19 14:31:46

DB2數(shù)據(jù)庫(kù)

2010-04-13 10:32:40

Oracle數(shù)據(jù)庫(kù)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧美日本在线 | 中文字幕高清av | 天天操天天操 | 欧美日韩在线播放 | 四虎影音 | 99爱国产 | 午夜激情免费视频 | 黄色免费观看网站 | 四虎在线视频 | 精品一区二区三区在线视频 | 亚洲福利网站 | 99久久日韩精品免费热麻豆美女 | 一级片网址| 涩涩视频在线观看 | 欧美一级视频免费看 | 97国产爽爽爽久久久 | 成人免费视频观看视频 | 成人免费淫片aa视频免费 | 九九亚洲| 日韩一级免费电影 | 国产高清免费视频 | 欧美激情亚洲天堂 | 日本欧美在线视频 | 97伦理电影| 久久久久久国产精品免费免费狐狸 | 欧美成年视频 | 男女国产视频 | 中文字幕在线三区 | 日本a级大片 | 国产a爽一区二区久久久 | 欧美日韩一区二区在线 | 久久国产一区二区 | 爱爱免费视频 | 国产一区二区三区四区 | 久久久久久网站 | 成人小视频在线 | a视频在线观看 | 国产区精品 | 欧美性极品xxxx做受 | 午夜一区二区三区在线观看 | 亚洲欧美另类在线观看 |