rs.absolute(),rs.isAfterLast(),rs.next(),rs.relative()簡單解釋
阿新 • • 發佈:2018-12-30
如果沒有它,假如你要取第1000條記錄的資料,就只能rs.next()1000次了:)
rs.isAfterLast()是一種特殊的狀態,表徵已到達結果集的結尾,此時你如果呼叫rs.next()就會丟擲異常
rs.next();//向後滾動
rs.getRow();//得到當前行號
rs.absolute(n);//游標定位到n行
rs.relative(int n);//相對移動n行
一,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
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初始化連線池
rs.isAfterLast()是一種特殊的狀態,表徵已到達結果集的結尾,此時你如果呼叫rs.next()就會丟擲異常
rs.next();//向後滾動
rs.getRow();//得到當前行號
rs.absolute(n);//游標定位到n行
rs.relative(int n);//相對移動n行
一,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 @
insert into UserRef(UserID, UserBrief)
select @[email protected]
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初始化連線池