JDBC筆記

一.快速入門

*在數(shù)據(jù)庫中建立好表

*在程序中導入數(shù)據(jù)庫驅(qū)動包

1.注冊數(shù)據(jù)庫驅(qū)動

DriverManager.registerDriver(new Driver());//缺點一:觀察mysqlDriver源碼發(fā)現(xiàn)此方法導致了數(shù)據(jù)庫驅(qū)動被注冊了兩次排拷。缺點二:整個程序域mysql數(shù)據(jù)庫驅(qū)動綁定增加了耦合性

Class.forName(“com.mysql.jdbc.Driver”);

2.獲取連接

DriverManager.getConnection(url, user, password);

~url的寫法:

Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid

SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid

MySql—jdbc:mysql://localhost:3306/sid

~url可以接的參數(shù)

user伞矩、password

useUnicode=true&characterEncoding=UTF-8

3.獲取傳輸器

createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象蜕径。

prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預編譯sql的PrepareSatement對象它匕。

4.利用傳輸器執(zhí)行sql語句獲取結果集

executeQuery(String sql) :用于向數(shù)據(jù)發(fā)送查詢語句。

executeUpdate(String sql):用于向數(shù)據(jù)庫發(fā)送insert紧唱、update或delete語句

execute(String sql):用于向數(shù)據(jù)庫發(fā)送任意sql語句

5.遍歷結果集取出結構

ResultSet以表的樣式在內(nèi)存中保存了查詢結果存炮,其中還維護了一個游標,最開始的時候游標在第一行之前夺姑,每調(diào)用一次next()方法就試圖下移一行墩邀,如果移動成功返回true;

ResultSet還提供了很多個Get方法盏浙,用來獲取查詢結果中的不同類型的數(shù)據(jù)

除了next方法眉睹,還有以下方法可以用來遍歷結果集:

next():移動到下一行

Previous():移動到前一行

absolute(int row):移動到指定行

beforeFirst():移動resultSet的最前面荔茬。

afterLast() :移動到resultSet的最后面。

6.釋放資源

conn是一個有限的資源竹海,用完立即要釋放表

stat占用內(nèi)存慕蔚,所以使用完后也要釋放

rs占用內(nèi)存,所以使用完后也要釋放

釋放時后創(chuàng)建的先釋放

if(rs != null){

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

} finally{

rs = null;

}

}

if(stat != null){

try {

stat.close();

} catch (SQLException e) {

e.printStackTrace();

} finally{

stat = null;

}

}

if(conn != null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

} finally{

conn = null;

}

}

?二.PreparedStatement

1.Sql注入:

由于jdbc程序在執(zhí)行的過程中sql語句在拼裝時使用了由頁面?zhèn)魅雲(yún)?shù)站削,如果用戶惡意傳入一些sql中的特殊關鍵字坊萝,會導致sql語句意義發(fā)生變化孵稽,這種攻擊方式就叫做sql注入许起,參考用戶注冊登錄案例。

2.PreparedStatement

PreparedStatement是Statement的孩子菩鲜,不同的是园细,PreparedStatement使用預編譯機制,在創(chuàng)建PreparedStatement對象時就需要將sql語句傳入接校,傳入的過程中參數(shù)要用?替代猛频,這個過程回導致傳入的sql被進行預編譯,然后再調(diào)用PreparedStatement的setXXX將參數(shù)設置上去蛛勉,由于sql語句已經(jīng)經(jīng)過了預編譯鹿寻,再傳入特殊值也不會起作用了。

3.

PreparedStatement使用了預編譯機制诽凌,sql語句在執(zhí)行的過程中效率比Statement要高毡熏。

四、大數(shù)據(jù)

1.mysql數(shù)據(jù)庫也可以直至在數(shù)據(jù)庫中保存大文本和大二進制數(shù)據(jù)侣诵,

Text

TINYTEXT(255)痢法、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)

Blob

TINYBLOB杜顺、BLOB财搁、MEDIUMBLOB和LONGBLOB

2.JDBC去操作大文本:

~插入大文本:

ps = conn.prepareStatement("insert into Demo2Text values(null,?,?)");

ps.setString(1, "鋼鐵是怎樣練成");

File file = new File("1.txt");

ps.setCharacterStream(2, new FileReader(file), (int) file.length());

//1.Exception in thread "main" java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setCharacterStream(ILjava/io/Reader;J)V

//ps.setCharacterStream(2, new FileReader(file), file.length());第三個參數(shù)是long型的是從1.6才開始支持的,驅(qū)動里還沒有開始支持躬络。

//解決方案:ps.setCharacterStream(2, new FileReader(file), (int)file.length());

//2.Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

//文件大小過大尖奔,導致PreparedStatement中數(shù)據(jù)多大占用內(nèi)存,內(nèi)存溢出

//-Xms256M-Xmx256M

//3.com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10886466 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

//數(shù)據(jù)庫連接傳輸用的包不夠大穷当,傳輸大文本時報此錯誤

//在my.ini中配置max_allowed_packet指定包的大小

~查詢大文本:

Reader rd = rs.getCharacterStream("content");

3.JDBC操作大二進制

~插入:

ps = conn.prepareStatement("insert into Demo3Blob values(null,?,?)");

ps.setString(1, "夢想的力量");

File file = new File("1.mp3");

ps.setBinaryStream(2, new FileInputStream(file), (int) file.length());

~查詢

InputStream in = rs.getBinaryStream("content");

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末越锈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子膘滨,更是在濱河造成了極大的恐慌甘凭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火邓,死亡現(xiàn)場離奇詭異丹弱,居然都是意外死亡德撬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門躲胳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓洪,“玉大人,你說我怎么就攤上這事坯苹÷√矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵粹湃,是天一觀的道長恐仑。 經(jīng)常有香客問我,道長为鳄,這世上最難降的妖魔是什么裳仆? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮孤钦,結果婚禮上歧斟,老公的妹妹穿的比我還像新娘。我一直安慰自己偏形,他們只是感情好静袖,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俊扭,像睡著了一般队橙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上统扳,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天喘帚,我揣著相機與錄音,去河邊找鬼咒钟。 笑死吹由,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朱嘴。 我是一名探鬼主播倾鲫,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萍嬉!你這毒婦竟也來了乌昔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤壤追,失蹤者是張志新(化名)和其女友劉穎磕道,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體行冰,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡溺蕉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年伶丐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疯特。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哗魂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漓雅,到底是詐尸還是另有隱情录别,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布邻吞,位于F島的核電站组题,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吃衅。R本人自食惡果不足惜往踢,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一腾誉、第九天 我趴在偏房一處隱蔽的房頂上張望徘层。 院中可真熱鬧,春花似錦利职、人聲如沸趣效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跷敬。三九已至,卻和暖如春热押,著一層夾襖步出監(jiān)牢的瞬間西傀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工桶癣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拥褂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓牙寞,卻偏偏與公主長得像饺鹃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子间雀,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容