這是乙個搬磚工的故事,它在資料庫與程式之間搬磚遇到了什麼問題呢。
driver介面:通過操作driver介面可對驅動程式操作
driver介面就是大神在開發資料庫驅動程式的時候實現了的介面,普通程式設計師只要找到對應driver介面進行裝載就可以使用這個驅動程式,例如mysql的jdbc驅動程式,其裝載**為class.forname("com.mysql.jdbc.driver")
,引號裡面的就是driver介面
drivermanager介面:driver的管理類,用class.forname註冊驅動程式,通過getconnection(三個引數dburl,使用者名稱,密碼)建立物理鏈結。
drivermanager叫做driver的管理類,我們通過這個管理類來使用driver介面的功能,像getconnection就是用來建立驅動和程式「交流橋梁」的方法。
(常見jdbc url的格式)
statement是sql容器,可以進行sql語句操作:resultset rs=stmt.sescutequery("select username from user");
resultset物件是sql查詢的結果,resultset的方法有:下乙個,上乙個,首個,尾個,指定個。 獲取物件的方法:getstring(列名),getint(列名),getobject(列名)
通過不同的方法,就可以從大件貨物中取出自己所要的那一部分資訊
構建的大概步驟
**示意
public
class
hellojdbc
} catch (sqlexception e) finally
if(stmt!=null)
if(rs!=null)
} catch (sqlexception e) }}
}
搬磚其實也有一趟規範流程的:首先將所需材料放進來(驅動程式載入),然後使用材料建立資料庫和自身程式的橋梁(connection),這裡就需要用到橋梁的路徑(url,告訴指向**的,什麼資料庫,什麼表),賬號和密碼。建立好連線橋梁之後,通過小扶手拉車(statement)運送sql語句到資料庫,資料庫再返回乙個包裝好的大件回來(resultset),我們通過方法就可以取出想要的磚塊(rs.getstring(「username」))。這一切都執行完之後還沒結束,因為橋梁,拉車,大件物品都還散落滿地,這將大大占用了空間(系統資源),所以通過.close()方法將其**起來。至於為什麼要判斷!=null呢?就是為了防止像橋梁鋪設失敗,小拉車半路就掛了等這些意外導致這東西本身就不存在。那麼強行**就會使得系統出錯,所以要做出判斷:你有,並且用完了,那就收起來吧~
當一次讀出較多的資料(千萬條),使用普通statement讀取,就會發生記憶體溢位異常。
使用游標的方式:在dburl後面新增?usecursorfetch=true:db_url="jdbc:mysql://localhost:3306/test?usecursorfetch=true";
(開啟游標)
perparestatement繼承於statement,使用preparedstatement最重要的一點好處是它擁有更佳的效能優勢,sql語句會預編譯在資料庫系統中。執行計畫同樣會被快取起來,它允許資料庫做引數化查詢。使用預處理語句比普通的查詢更快,因為它做的工作更少(資料庫對sql語句的分析,編譯,優化已經在第一次查詢前完成了)。為了減少資料庫的負載,生產環境中的jdbc**你應該總是使用preparedstatement。值得注意的一點是:為了獲得效能上的優勢,應該使用引數化sql查詢而不是字串追加的方式。
perparestatement的setfetchsize()介面可以實現游標的功能
字串追加:
preparedstatement prestmt = conn.preparestatement("select banks from loan where loan_type="+ loantype);
引數化查詢:
preparedstatement prestmt = conn.preparestatement("select banks from loan where loan_type=?");
prestmt.setstring(1,"型別內容");
static string db_url="jdbc:mysql://localhost:3306/test";
static
final string user="root";
static
final string password="123456";
private
static
void
helloword() throws classnotfoundexception
} catch (sqlexception e) finally
if(ptmt!=null)
if(rs!=null)
} catch (sqlexception e) }}
還是從資料庫讀取username,但是這裡使用的是游標的方式,每次讀取一條。區別主要有四部分:
開啟游標
獲取preparestatement
設定每次讀取一條
執行語句
然而有一天,當我們拉著手扶車去資料庫搬磚的時候,突然收到了乙個10噸的特大件,那麼如果還是跟往常一樣一次就拉回來,車直接壓爆(記憶體溢位)。所以呢,就在拉貨的時候告訴資料庫,一次只要給我10塊磚就夠了,剩下的下次再來拿。(這種分次的策略就需要到preparestatement的setfetchsize介面)
除了多條資料可能產生記憶體溢位,一條記錄可能也會產生記憶體溢位。
**示例:
流方式跟游標原理相似,區別就是這是一塊10噸重的大磚,一塊即可壓垮小車。但是計算機世界就是神奇,大磚也可以按照規則切割成一塊塊小磚(二進位制區間)運輸,然後再組合起來
用普通的插入方式插入速度很慢,因為每一次執行executequery都是一次傳送sql的過程,傳送和接收都需要花費不少時間。
使用statement的addbatch新增多條sql,使用executebatch()執行sql,用clearbatch()清空sql語句。
public
class
hellojdbc
stmt.executebatch(); //2.批量執行sql
stmt.clearbatch(); //3.清空sql
} catch (sqlexception e) finally
if(stmt!=null)
} catch (sqlexception e) }}
public
static
void
main(string args) catch (classnotfoundexception e)
}
這裡主要就是通過statement的addbatch,executebatch,clearbatch新增sql,執行sql,清空sql。
工作很多天之後發現小拉車每次帶乙個sql,只拉一堆貨物太費時間了,所以在需要的時候就直接使用大貨車將多條sql裝在一輛車上(addbatch),然後一次拿貨(executebatch),拿完之後清空貨車,等待下一次的使用(clearbatch)。這樣就將往返多趟的路程一次就走完了,大大節省了時間。也許這就是從搬磚菜鳥變老鳥的過程吧。
如果資料庫內容涉及到中文,那麼呼叫它的程式要統一設定相同的編碼(一般用utf-8)。否則就可能因為編碼的不統一產生亂碼問題。
怎樣從零基礎學黑客
可以說想學黑客技術,要求你首先是乙個 t 字型人才,也就是說電腦的所有領域你都能做的來,而且有一項是精通的。因此作為乙個零基礎的黑客愛好者來說,沒有良好的基礎是絕對不行的,下面我就針對想真正學習黑客的零基礎朋友製作乙個學習方案,注意!我是指 真正想學黑客技術 的朋友,如果你只是想玩玩,花一上午時間學...
零基礎mysql專案例項 MySQL 零基礎開發
1.終端下連線mysql服務 mysql uroot p回車後輸入設定的密碼即可。進去後每條命令結尾要帶分號 退出命令exit 單行注釋有兩種 或 空格。多行注釋 2.基本命令集合 針對資料庫 use sys show databases 檢視當前操作的資料庫 select databse 針對表 ...
mysql零基礎操作 mysql 零基礎 開始過程
2016 11 07 算是差不多是兩個月的學習,我也馬上要結課了.今天才勉強把mysql裝上,之前還有因為使用者許可權的問題,以及使用者為建立的問題.應該早點就把該準備的開發平台準備好,而不是在最後快考試了來做這件事情,絆倒在細枝末節的東西上.安裝不成功,當時我按照教程,教程上邊說可以跳過管理員的創...