try{Connection con;
創(chuàng)新互聯長期為上1000家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態(tài)環(huán)境。為寧河企業(yè)提供專業(yè)的網站制作、網站設計,寧河網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
Statement stmt;
ResultSet rs;
int temp;
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/java","root","");//以上是數據庫連接,不同的數據管理器有 //不同的驅動和鏈接方式,以上是mysql的連接
stmt=con.createStatement();
rs=stmt.executeQuery("select * from student");//執(zhí)行查詢語句,結果賦值給結果集rs
//結果集是結果于字段編號的映射,每一個字
//段都有一個編號,最小為1,也就是第一個字段
while(rs.next()){
String names=rs.getString("name");//查詢結果轉換成字符串。
System.out.println(names);
}rs.close();
}catch(Exception e){
e.printStackTrace();
}
import java.sql.*;
public class MSSQLText
{
public static void main(String args[])
{
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind";
String user="sa";//這里替換成你自已的數據庫用戶名
String password="sa";//這里替換成你自已的數據庫用戶密碼
String sqlStr="select CustomerID, CompanyName, ContactName from Customers";
try
{ //這里的異常處理語句是必需的.否則不能通過編譯!
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
System.out.println("類實例化成功!");
Connection con = DriverManager.getConnection(url,user,password);
System.out.println("創(chuàng)建連接對像成功!");
Statement st = con.createStatement();
System.out.println("創(chuàng)建Statement成功!");
ResultSet rs = st.executeQuery(sqlStr);
System.out.println("操作數據表成功!");
System.out.println("----------------!");
while(rs.next())
{
System.out.print(rs.getString("CustomerID") + " ");
System.out.print(rs.getString("CompanyName") + " ");
System.out.println(rs.getString("ContactName"));
}
rs.close();
st.close();
con.close();
}
catch(Exception err){
err.printStackTrace(System.out);
}
}
}
StringBuffer
sqlq=new
StringBuffer("
SELECT
*
FROM
")
;//申明一個可變字符串
,要存了一個sql語句,并且由"
SELECT
*
FROM
"可知其為一個select查詢語句
sqlq.append(DtoMapGroupOptions.DB_TABLE_NAME)
;//DtoMapGroupOptions.DB_TABLE_NAME應該是一個字符串,字面值為一個表的名稱,要在這個表里查數據
sqlq.append("
ORDER
BY
")
;//這個制定查出來的結果集需要排序
sqlq.append(DtoMapGroupOptions.COLUMN_optionID)
;//DtoMapGroupOptions.COLUMN_optionID應該是某一列的列名,根據這一列來排序,如果這一列是數字,那么就會根據數字大小排,字符串可能按abc排,和excel排序時一樣的,即根據某一列來擴展至整個區(qū)域排序
sqlq.append("
DESC
")
;//這個事制定按降序還是升序,這里是降序
//后面的語句要看上下文,那個pb不知是什么
ListRow
list
=
null
;
pb.isRequireTotalRow(true);
String
sqlStr=sqlq.toString();
list
=
pb.getInfo(sqlStr,
null,
DtoMapGroupOptions.DATA_SOURCE_ID);//可能是把結果集放入list中,根據sqlStr中的sql語句
問題描述 在通常的三層構架下 客戶通過Browser請求Web服務器查詢數據庫 而查詢結果是上千條甚至是上百萬條記錄 要求查詢結果傳送到客戶端瀏覽器并分頁顯示
考慮因素
Web服務器的資源消耗 包括 內存(用來存儲查詢結果) 數據庫相關資源(數據庫連接對象 ResultSet對象等等)
DB服務器資源的消耗 包括游標 會話等等
網絡開銷 包括與數據庫建立會話 傳輸查詢結果等等
JDBC中的幾個重要Class:
A ResultSet object maintains a cursor pointing to its current row of data Initially the cursor is positioned before the first row The next method moves the cursor to the next row and because it returns false when there are no more rows in the ResultSet object it can be used in a while loop to iterate through the result set
ResultSet是直接在數據庫上建立游標 然后通過ResultSet的行位置定位接口來獲得指定行位置的記錄 當用戶通過get方法獲取具體紀錄的內容時 ResultSet才從數據庫把所需數據讀到客戶端
Oracle的ResultSet實現似乎會在本地緩存用戶讀取過的數據 導致內存消耗會隨讀取數據的增加而增加 這樣 如果一次查詢并讀取海量數據 即使讀出數據后馬上丟棄(比如直接寫入文件) 內存消耗也會隨查詢結果的增加而遞增
The RowSet interface extends the standard java sql ResultSet interface A RowSet object may make a connection with a data source and maintain that connection throughout its life cycle in which case it is called a connected rowset A rowset may also make a connection with a data source get data from it and then close the connection Such a rowset is called a disconnected rowset A disconnected rowset may make changes to its data while it is disconnected and then send the changes back to the original source of the data but it must reestablish a connection to do so
RowSet是JDBC 中提供的接口 Oracle對該接口有相應實現 其中很有用的是 oracle jdbc rowset OracleCachedRowSet OracleCachedRowSet實現了ResultSet中的所有方法 但與ResultSet不同的是 OracleCachedRowSet中的數據在Connection關閉后仍然有效
解決方案一 直接使用ResultSet來處理
從ResultSet中將查詢結果讀入collection 緩存在HttpSession或有狀態(tài)bean中 翻頁的時候從緩存中取出一頁數據顯示 這種方法有兩個主要的缺點 一是用戶可能看到的是過期數據 二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間 并且緩存的數據也會占用大量內存 效率明顯下降
對上述方法的一種改進是當用戶第一請求數據查詢時 就執(zhí)行SQL語句查詢 獲得的ResultSet對象及其要使用的連接對象都保存到其對應的會話對象中 以后的分頁查詢都通過第一次執(zhí)行SQL獲得的ResultSet對象定位取得指定頁的記錄(使用rs last();rs getRow()獲得總計錄條數 使用rs absolute()定位到本頁起始記錄) 最后在用戶不再進行分頁查詢時或會話關閉時 釋放數據庫連接和ResultSet對象等數據庫訪問資源 每次翻頁都只從ResultSet中取出一頁數據 這種方式在某些數據庫(如oracle)的JDBC實現中差不多也是回緩存所有記錄而占用大量內存 同時速度也非常慢
在用例分頁查詢的整個會話期間 一個用戶的分頁查詢就要占用一個數據庫連接對象和結果集的游標 這種方式對數據庫的訪問資源占用比較大 并且其利用率不是很高
優(yōu)點 減少了數據庫連接對象的多次分配獲取 減少了對數據庫的SQL查詢執(zhí)行
缺點 占用數據庫訪問資源-數據庫連接對象 并占用了數據庫上的資源-游標 會消耗大量內存
解決方案二 定位行集SQL查詢
使用數據庫產品提供的對查詢的結果集可定位行范圍的SQL接口技術 在用戶的分頁面查詢請求中 每次可取得查詢請求的行范圍的參數 然后使用這些參數生產取得指定行范圍的的SQL查詢語句 然后每次請求獲得一個數據庫連接對象并執(zhí)行SQL查詢 把查詢的結果返回給用戶 最后釋放說有的數據庫訪問資源
這種方式需要每次請求時都要執(zhí)行數據庫的SQL查詢語句 對數據庫的訪問資源是使用完就立即釋放 不白白占用數據庫訪問資源 對特定(提供了對查詢結果集可定位功能的)的數據庫產品 如 Oracle(rowid或rownum ) DB (rowid或rownum ()) PostgreSQL(LIMIT 和 OFFSET) mySQL(Limit)等 (MS SQL Server 沒有提供此技術 )
下面是在oracle下的查詢語句示例
SELECT * FROM ( SELECT row_ * rownum rownum_ FROM ( ) row_ WHERE rownum = {pageNumber*rowsPerPage}) WHERE rownum_ {(pageNumber )*rowsPerPage}
優(yōu)點 對數據庫的訪問資源(數據庫連接對象 數據庫游標等)沒有浪費 這些資源的充分重復的利用
lishixinzhi/Article/program/Java/hx/201311/25890
package mysql;
import java.sql.*;
/**
* @author xys
*/
public class ConnectMysql {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:3306/databaseName";
String user = "mysqluser";
String password = "password";
String driverClass = "com.mysql.cj.jdbc.Driver";
Connection connection = null;
Class.forName(driverClass);
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
if (connection != null) {
System.out.println("數據庫連接成功");
} else {
System.out.println("數據庫連接失敗");
connection.close();
}
return connection;
}
public void getResult() throws ClassNotFoundException, SQLException {
// 實例化 Statement 對象
Statement statement = getConnection().createStatement();
// 要執(zhí)行的 Mysql 數據庫操作語句(增、刪、改、查)
String sql = "";
// 展開結果集數據庫
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
// 通過字段檢索
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
// 輸出數據
System.out.println("ID : " +id);
System.out.println("name :" + name);
}
// 完成后需要依次關閉
resultSet.close();
statement.close();
getConnection().close();
}
}
import java.sql.Connection。
import java.sql.DriverManager; ?
import java.sql.PreparedStatement; ?
import java.sql.ResultSet; ?
import java.sql.SQLException;
import javax.naming.Context; ?
import javax.naming.InitialContext; ?
import javax.naming.NamingException; ?
import javax.sql.DataSource;
public class DBCon {
//數據庫驅動對象
public static final String DRIVER="oracle.jdbc.driver.OracleDriver";
//數據庫連接地址(數據庫名)
public static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
//登陸名
public static final String USER="FM";
//登陸密碼
public static final String PWD="FM";
//創(chuàng)建數據庫連接對象
private Connection con=null;
//創(chuàng)建數據庫預編譯對象
private PreparedStatement ps=null;
//創(chuàng)建結果集
private ResultSet rs=null;
//創(chuàng)建數據源對象
public static DataSource source=null;
// ?//靜態(tài)代碼塊 ?
// ?static{ ?
// ?
// ? ? ?//初始化配置文件context ?
// ? ? ?try { ?
// ? ? ? ? ?Context context=new InitialContext(); ?
// ? ? ? ? ?source=(DataSource)context.lookup("java:comp/env/jdbc/webmessage"); ?
// ? ? ?} catch (Exception e) { ?
// ? ? ? ? ?// TODO Auto-generated catch block ?
// ? ? ? ? ?e.printStackTrace(); ?
// ? ? ?} ?
// ?
// ?
// ?}
/**
* 獲取數據庫連接
*/
public Connection getCon(){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con=DriverManager.getConnection(URL,USER,PWD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
} ?
// ?/** ?
// ? * 獲取數據庫連接 ?
// ? */ ?
// ?public Connection getCon(){ ?
// ?
// ? ? ?try { ?
// ? ? ? ? ?con=source.getConnection(); ?
// ? ? ?} catch (SQLException e) { ?
// ? ? ? ? ?// TODO Auto-generated catch block ?
// ? ? ? ? ?e.printStackTrace(); ?
// ? ? ?} ?
// ?
// ? ? ?return con; ?
// ?} ?
/**
* 關閉所有資源
*/
public void closeAll(){
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ps!=null)
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(con!=null)
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ?
}
/**
* @param sql數據庫更新(增、刪、改) 語句
* @param pras參數列表(可傳,可不傳,不傳為NULL,以數組形式存在)
* @return 返回受影響都行數
*/
public int update(String sql,String... pras){
int resu=0;
con=getCon();
try {
ps=con.prepareStatement(sql);
for(int i=0;ipras.length;i++){
ps.setString(i+1,pras[i]);
}
resu=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
closeAll();
}
return resu;
}
/**
* @param sql數據庫查詢語句
* @param pras參數列表(可傳,可不傳,不傳為NULL,以數組形式存在)
* @return 返回結果集
*/
public ResultSet query(String sql,String... pras){
con=getCon();
try {
ps=con.prepareStatement(sql);
if(pras!=null)
for(int i=0;ipras.length;i++){
ps.setString(i+1, pras[i]);
}
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
} ?
}
分享文章:數據庫查詢代碼java 數據庫查詢代碼怎么寫
文章來源:http://jinyejixie.com/article10/doseodo.html
成都網站建設公司_創(chuàng)新互聯,為您提供移動網站建設、網站制作、Google、云服務器、網頁設計公司、建站公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯