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

JSP編程技巧:數據庫的利用

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

一,SQL復習

1,SQL語句分為兩類:DDL(Data Definition Language)和DML(Dat Manipulation Languge,數據操作語言)。前者主要是定義數據邏輯結構,包括定義表、視圖和索引;DML主要是對數據庫進行查詢和更新操作。

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等等都是用來定義列數據類型的保留字,其中varchar表示可變字符類型。

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

條件中的子查詢:

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

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類用于處理驅動程式的調入并且對新的數據庫連接提供支持。

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,密碼為空

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

Connection的getWarning方法返回一個SQLWarning對象,在連接之前應當先檢查。

使用jdbc-odbc的***好處是:免費的。不過性能受odbc的限制,而且一般odbc驅動比較昂貴。

2,使用專門的jdbc驅動程式。//此處是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(); 

可見使用何種方式連接何種數據庫和數據庫的操作和連接數據庫是無關的。

三,查詢數據庫

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在執行過程中發生問題時產生。有一個額外的方法

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

一般來說并不建議在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.

  1. CREATE PROCEDURE ap_adduser  
  2. (  
  3. @OutUserID int output, //此為輸出參數,output標記  
  4. @UserName varchar(25), //參數表示方法:"@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,此處自動獲得ID  
  13. insert into UserRef(UserID, UserBrief)  
  14. select @OutUserID=@UserID  
  15. GO/*結束,基本結構:  
  16. CREATE PROCEDURE procedureName(  
  17. parameters  
  18. )  
  19. AS 
  20. actions  
  21. GO  
  22. */ 

JSP頁面中這樣使用:

  1. CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");  
  2. stmt.registerOutParameter(1,Types.INTEGER,1);//注冊輸出變量  
  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() 

八,使用事務

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

2,使用事務時應當先用 con.setAutoCommit(false),***使用commit或rollback

3,rollback一般在catch段執行

九,數據庫連接池

1,如果有一個數據庫連接請求并且連接中沒有連接,則生成一個新的連接。這個連接使用完之后并不關閉他,而是將他放入連接池。在這個過程中,還要判斷連接池中的連接是否超期。如果超期則將他關閉。

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

3,一般將Connection Pool作為一個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);  

也能使用一個Servlet初始化連接池

【編輯推薦】

  1. JSP數據庫操作例程(JDBC-ODBC)
  2. Java Servlets(JSP)開發環境
  3. 開發JSP HTTP服務器
  4. 選擇JSP開發工具
  5. Servlet和JSP路徑詳細介紹
責任編輯:彭凡 來源: 百度空間
相關推薦

2022-05-06 18:55:29

Java技巧Shellcode

2011-03-10 11:17:03

數據庫設計技巧

2009-07-14 18:13:36

Microsoft J

2009-07-03 11:27:11

JSP編程思想

2009-07-01 11:08:14

JSP DestoryJSP Init數據庫鏈接

2009-06-30 15:15:30

JSP數據庫

2011-03-22 16:31:35

Access數據庫

2009-12-30 15:58:42

ADO.NET數據庫編

2010-04-06 11:19:28

Oracle數據庫

2009-05-15 10:11:55

數據庫查詢查詢性能分頁瀏覽

2009-07-06 15:57:56

獲取數據庫連接JSP

2010-11-29 11:51:59

Sybase數據庫維護

2009-06-24 13:07:44

Android數據庫

2010-01-26 16:55:35

Android數據庫操

2011-04-12 09:43:17

Sybase數據庫修復技巧

2010-08-19 14:31:46

DB2數據庫

2011-03-08 09:27:34

SQL Server數死鎖

2017-09-27 09:36:22

數據庫基礎技巧數據庫大小

2010-04-13 10:32:40

Oracle數據庫編程

2009-05-18 13:18:54

字符Oracle字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品国产一区二区电影 | 国产真实乱对白精彩久久小说 | 久久69精品久久久久久久电影好 | 国产精品久久久久久久久久久新郎 | 国产午夜精品久久久 | 欧洲色 | 懂色中文一区二区在线播放 | 色性av | 精品99爱视频在线观看 | 免费视频成人国产精品网站 | 免费精品视频 | 国产精品日韩欧美一区二区三区 | 中文字幕第一页在线 | 国产高清在线观看 | 成人精品免费视频 | 久久青青| 国产日韩一区二区 | 91电影在线 | av网站免费观看 | 91伊人网 | 国产成人精品一区二区三区视频 | 免费成人在线网站 | 偷派自拍 | 啪啪网页| 农村真人裸体丰满少妇毛片 | 精品国产免费一区二区三区五区 | 久久中文字幕视频 | 成人在线小视频 | 天天射影院 | 免费观看羞羞视频网站 | 久久久女女女女999久久 | 日韩国产免费观看 | 老司机深夜福利网站 | a级性视频| 欧美小视频在线观看 | 欧美一区久久 | 99国产精品久久久 | 天天玩天天操天天干 | 国产精品久久久久久久久久免费 | 久久久婷 | 99精品免费久久久久久久久日本 |