java查詢資料庫數據
剛剛漏了帳號密碼了,現在補上
try {
//這里的是MYsql 舉例
//載入驅動
Class.forName("com.mysql.jdbc.Driver");
//創建資料庫連接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
//創建查詢 「請求」
PreparedStatement ps = con.prepareStatement("select * from user");
//返回查詢結果
ResultSet rs = ps.executeQuery();
//遍歷結果
while(rs.next()) {
//假如 User 表中 有個 name 列
System.out.println("name >> "+rs.getString("name"));
}
//關閉
rs.close();
ps.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
㈡ Java中的大量數據查詢
問題描述 在通常的三層構架下 客戶通過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或有狀態bean中 翻頁的時候從緩存中取出一頁數據顯示 這種臘臘升方法有兩個主要的缺點 一是用輪老戶可能看到的是過期數據 二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間 並且緩存的數據也會佔用大量內存 效率明顯下降
對上述方法的一種改進是當用戶第一請求數據查詢時 就執行SQL語句查詢 獲得的ResultSet對象及其要使用的連接對象都保存到其對應的會話對象中 以後的分頁查詢都通過第一次執行SQL獲得的ResultSet對象定位取得指定頁的記錄(使用rs last();rs getRow()獲得總計錄條數 使用rs absolute()定位到本頁起始記錄) 最後在用戶不再進行分頁查詢時或會話關閉時 釋放資料庫連接和ResultSet對象等資料庫訪問資源 每次翻頁都只從ResultSet中取出一頁數據 這種方式在某些資料庫(如oracle)的JDBC實現中差不多也是回緩存所有記錄而佔用大量內存 同時速度也非常慢
在用例分頁查詢的整個會話期間 一個用戶的分頁查詢就要佔用一個資料庫連接對象和結果集的游標 這種方式對資料庫的訪問資源佔用比較大 並且其利用率不是很高
優點 減少了資料庫連接對象的多次分配獲取 減少了對資料庫的SQL查詢執行
缺點 佔用資料庫訪問資源-資料庫連接對象 並佔用了資料庫上的資源-游標 會消耗大量內存
解決方案二 定位行集SQL查詢
使用資料庫產品提供的對查詢的結果集可定位行范圍的SQL介面技術 在用戶的分頁面查詢請求中 每次可取得查詢請求的行范圍的參數 然後使用這些參數生產取得指定行范圍的的SQL查詢語句 然後每次請求獲得一個資料庫連接對象並執行SQL查詢 把查詢的結果返回給用戶 最後釋放說有的資料庫訪問資源
這種方式需要每次請求時都要執行資料庫的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}
優點 對資料庫的訪問資源(資料庫連接對象 資料庫游標等)沒有浪費 這些資源的充分重復的利用
lishixin/Article/program/Java/hx/201311/25890
㈢ 用JAVA如何來查詢資料庫裡面相關的數據
你的意思就是根據id
找數據本身以及他的葉子節點。
假設你的表叫location
rs
:
ResultSet
stmt:
Statement
public
ResultSet
getLocation(int
id)
{
String
sql
=
"select
id,
name,
pid
from
location
where
id
=
"
+
id
+
"or
pid
=
"
+
id;
rs
=
stmt.executeQuery(sql);
}
㈣ 如何用Java實現資料庫查詢
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("創建連接對像成功!");
Statement st = con.createStatement();
System.out.println("創建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);
}
}
}
㈤ java如何實現定時從資料庫查詢新增的數據,
在表上新增一個欄位,比如INSERT_TIMESTAMP,要求insert數據的時候必須插入當時的時間。
你select的時候就檢查當前時間和上次查詢的時間(可以在頁面或者內存里記錄這個上次查詢的時間,或者根據你的定時策略,反推到你上次查詢的時間)內的數據可以OK
㈥ 在java中,在下拉列表查詢資料庫的所有數據怎麼查
你的意思是先查詢出來所有數據後,再顯示到下拉菜單中去對嗎?
如果是的話,按下面的思路做,相信你能做出來:
首先你訪問這個界面前,要先去查詢資料庫中的數據,一般這些數據都裝到一個list(集合,不一定用List)中去,然後再轉到(如果是web項目,就是跳轉了,這時把這個list裝到request中,request.setAt....(「list」,lits);如果用的是桌面應用程序,就把這個list以參數的形式傳到界面類上去)你的界面上,在界面上做一個下攔菜單,然後呢,就是一個循環輸出list中包含的所有資料庫中的數據,把每次循環取出來的信息放入下拉菜單的選項中去,這樣,有多少數據,這個下拉菜單就有多少選項了,不知道是不是你想要的結果,如果不是,你可以再說詳細點,方便大家為你解答,。
㈦ java如何查詢資料庫某表某列的所有值
獲得某表所有列的信息:
String sql = select * from tname;//tname為某一表名
Connection conn = ....;
Statement st = conn.createStatement();
ResultSet rs = st.rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int colcount = rsmd.getColumnCount();//取得全部列數
for(int i=0;i<colcount;i++){
String colname = rsmd.getColumnName(i);//取得全部列名
}
以上為某表欄位具體查詢,如果是查詢表的信息,如在mysql伺服器上那樣的查詢結果的話,可以用一下代碼:
ResultSet.executeQuery("show tables")可以的到所有的表信息。
ResultSet.executeQuery("describe tname")可以得到表的欄位信息。//tname為表名
p.s :同樣適用於jsp。
㈧ java獲取資料庫數據
1、對應資料庫中的表創建實體類(entity),封裝a、b、c等欄位。
2、使用jdbc查詢資料庫,一行數據對應一個實體對象,放進一個集合List<entity>中。
㈨ Java如何獲取資料庫中的數據·案例
下面是一個從 mysql 數據獲取用戶數據的案例,可以參考一下:
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.ArrayList;
importjava.util.List;
//用戶類,存儲單個用戶信息
classUser{
privateintid;
privateStringname;
publicUser(intid,Stringname){
this.id=id;
this.name=name;
}
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
@Override
publicStringtoString(){
return"User[id="+id+",name="+name+"]";
}
}
publicclassDemo1{
publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{
//本例使用mysql資料庫,演示將資料庫test的tb_users表中的用戶信息
//放到List中
//載入數據驅動
Class.forName("com.mysql.jdbc.Driver");
//資料庫連接字元串,此例資料庫為test
Stringurl="jdbc:mysql://localhost:3306/test";
Stringuser="root"; //資料庫用戶名
Stringpassword=""; //資料庫密碼
//打開一個數據連接
Connectionconn=DriverManager.getConnection(url,user,password);
Statementstmt=conn.createStatement();
//獲取表tb_users所有用戶信息到結果集中
ResultSetrs=stmt.executeQuery("SELECTid,nameFROMtb_users");
//定義一個存放用戶信息的List
List<User>users=newArrayList<>();
//提取用戶信息,並將用戶信息放入List
while(rs.next()){
//獲取用戶ID
intid=rs.getInt(1);
//獲取用戶名
Stringname=rs.getString(2);
users.add(newUser(id,name));
}
rs.close();
stmt.close();
conn.close();
//顯示用戶信息
for(Useru:users){
System.out.println(u);
}
}
}
㈩ java里當資料庫里的數據量很大的時候、要一次性查詢出來、並且展示出來、應該怎樣查詢、效率更高
sql語句要快1.不必要的列就不用查出來;2作為查詢的條枯基件列設索引;3.如果查詢的表數據大於500萬條數據,表創建之初就應該建立表分沒鏈謹區,依據分表去查;
最最重要的是傳輸給前台頁面的數據量盡喚埋量簡化減少傳輸量,比如時間數據最好不傳,自己規定個順序,依據順序前台生成對應的時間;非要傳可轉為毫秒數去掉最後四個零(依據實際情況而定,因為時間只要求精確到分),用[]不用{}(key就不用傳了,根據商量好的下標對應提取)