2019-05-17JDBC

回顧:

臟讀:未提交事務(wù)的數(shù)據(jù)

不可重復(fù)讀:已提交數(shù)據(jù) update

幻讀或者虛讀:已經(jīng)提交了數(shù)據(jù)的行數(shù) insert delete

JDBC介紹(掌握)

核心API

1.DriverManager 驅(qū)動(dòng)管理類

2.connection連接接口

3.Statement 發(fā)送SQL語句的接口 Statement的子接口PreparedStatement 預(yù)編譯接口,防止SQL注入問題

4.ResultSet 結(jié)果集 接收查詢的數(shù)據(jù)

JDBC編程六步(掌握)

注冊(cè)驅(qū)動(dòng)

?Class.forName("com.mysql.jdbc.Driver");

數(shù)據(jù)庫獲取連接

使用驅(qū)動(dòng)管理類DriverManager中的靜態(tài)方法:

??????? static Connection getConnection(String url, String user, String password)試圖建立到給定數(shù)據(jù)庫 URL 的連接掌实。


參數(shù):

??????????????????? url -連接數(shù)據(jù)庫的地址

??????????????????????? url整體格式:jdbc:mysql://連接數(shù)據(jù)庫服務(wù)器的ip地址:連接數(shù)據(jù)庫的端口號(hào)/具體的數(shù)據(jù)庫名

??????? ????????????user -數(shù)據(jù)庫用戶,root

??????????????????? password -用戶的密碼1234

?*/

//2.獲取和數(shù)據(jù)庫的連接String url = "jdbc:mysql://localhost:3306/day04_db";//連接數(shù)據(jù)庫的地址String user = "root";//數(shù)據(jù)庫用戶String password = "1234";//用戶的密碼Connection conn = DriverManager.getConnection(url, user, password);

獲取發(fā)送SQL語句對(duì)象

使用驅(qū)動(dòng)管理類DriverManager中的靜態(tài)方法:

??????? static Connection getConnection(String url, String user, String password)試圖建立到給定數(shù)據(jù)庫 URL 的連接贱鼻。


參數(shù):

??????????????????? url -連接數(shù)據(jù)庫的地址

??????????????????????? url整體格式:jdbc:mysql://連接數(shù)據(jù)庫服務(wù)器的ip地址:連接數(shù)據(jù)庫的端口號(hào)/具體的數(shù)據(jù)庫名

??????? ????????????user -數(shù)據(jù)庫用戶勇婴,root

??????????????????? password -用戶的密碼1234

?*/

//2.獲取和數(shù)據(jù)庫的連接String url = "jdbc:mysql://localhost:3306/day04_db";//連接數(shù)據(jù)庫的地址String user = "root";//數(shù)據(jù)庫用戶String password = "1234";//用戶的密碼Connection conn = DriverManager.getConnection(url, user, password);

3.獲取Statement對(duì)象

在java.sql.Connection接口中有如下方法獲取到Statement對(duì)象

Statement的API介紹

int executeUpdate(String sql)

根據(jù)執(zhí)行的DML(insert、update耕渴、delete)語句,發(fā)揮影響的行數(shù)

2.resultSet excuteQuery(String sql)

根據(jù)執(zhí)行的結(jié)果集橱脸,只能執(zhí)行select語句

注意:在MySQL中分苇,只要不是查詢就是修改。

executeUpdate:用于執(zhí)行增刪改

executeQuery:用于執(zhí)行查詢

使用步驟

1.注冊(cè)驅(qū)動(dòng)

2屁桑。獲取連接

3.獲取Statement對(duì)象

4.使用Statement對(duì)象執(zhí)行SQL語句

5.釋放資源

JDBC實(shí)現(xiàn)對(duì)單標(biāo)查詢

Result原理

1.ResultSet內(nèi)部有一個(gè)指針,開始記錄開始位置

2.調(diào)用next方法靖秩,ResultSet內(nèi)部指針就會(huì)移動(dòng)到下一行數(shù)據(jù)

3.我們可以通過ResultSet得到一行數(shù)據(jù)getXxx得到某列數(shù)據(jù)

public class Demo04 {

public static void main(String[] args) throws Exception {

Class.forName("com.mysql.jdbc.Driver");

Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");

Statement stmt = conn.createStatement();

SString sql = "select * from user";

ResultSet rs = stmt.executeQuery(sql);

// 內(nèi)部有一個(gè)指針,只能取指針指向的那條記錄

? ? ? ? while(rs.next()){// 指針移動(dòng)一行,有數(shù)據(jù)才返回true

int id = rs.getInt("id");

String name = rs.getString(2);

String pwd= rs.getString(3);

System.out.println(id+"+++"+name+"++++"+pwd);

}

// 關(guān)閉資源

rs.close();

stmt.close();

conn.close();

}

}


JDBC事務(wù)

開啟事務(wù)(coon.setAutoCommit(false))——>執(zhí)行一組SQL語句——>一切正常提交事務(wù) coon.commit();


開啟事務(wù)(coon.setAutoCommit(false))——>執(zhí)行一組SQL語句——> 出現(xiàn)異常竖瘾,回滾事務(wù)coon.rollback沟突;

Connection 接口中與事務(wù)有關(guān)的方法

void setAutoCommit(boolean autoCommit)throws SQLException;

false:開啟事務(wù)捕传,true:關(guān)閉事務(wù)

voidcommit()throwsSQLException;

提交事務(wù)

voidrollback()throwsSQLException;

回滾事務(wù)

注意:在jdbc事務(wù)操作中,事務(wù)的控制都是通過Connection對(duì)象完成的庸论,當(dāng)一個(gè)完整的業(yè)務(wù)操作前,我們首先使用coon.setAutoCommit(false)來開啟事務(wù)聂示。默認(rèn)情況下是true的,表示關(guān)閉事務(wù)鱼喉,那么一條SQL語句就是一個(gè)事務(wù),默認(rèn)提交事務(wù)蒲凶。如果設(shè)置為false拆内,那么表示開啟事務(wù)旋圆,所有的SQL語句就會(huì)都在一個(gè)事務(wù)中麸恍。

當(dāng)業(yè)務(wù)操作完成后灵巧,如果整個(gè)操作沒有問題抹沪,我們需要使用coon.commmit()來提交事務(wù)。當(dāng)然了融欧,如果出現(xiàn)了異常,我們需要使用coon.rollback()撤銷所有的操作噪馏,所以出現(xiàn)事務(wù)的異常绿饵,需要進(jìn)行事務(wù)的回滾。

使用步驟

1.注冊(cè)驅(qū)動(dòng)

2.獲取連接

3.開啟事務(wù)

4.獲取Statement

5.使用Statement執(zhí)行SQL

6.提交或回滾事務(wù)

7.關(guān)閉資源

package com.day04;

import com.mysql.jdbc.Driver;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

public class JDBC {

public static void main(String[] args)throws SQLException, ClassNotFoundException {

/* DriverManager.registerDriver(new Driver());

使用 DriverManager.registerDriver(new Driver());拟赊,存在以下不足粹淋,注冊(cè)被注冊(cè)兩次

*/

? ? ? Class.forName("com.mysql.jdbc.Driver");//注冊(cè)驅(qū)動(dòng)

//獲取連接

? ? ? ? Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db","root","root");

System.out.println(connection);

//從連接中拿到一個(gè)Statement對(duì)象

? ? ? ? Statement statement = connection.createStatement();

//1.插入記錄

/*String sql ="insert into user values(null,'zhaoliu','abc')";

int i=statement.executeUpdate(sql);

System.out.println("影響的行數(shù):"+i );*/

//2.修改記錄

/*? String? sql="update user set? username='tianqi'where username='zhaoliu'";

int? i=statement.executeUpdate(sql);

System.out.println("影響的行數(shù):"+i );*/

//刪除記錄

? ? ? ? String sql ="delete from user where id=4";

int i=statement.executeUpdate(sql);

System.out.println("影響的行數(shù):"+i );

statement.close();

connection.close();

}

}


編寫JDBC工具類

在目錄下創(chuàng)建jdbc.properties

jdbc.properties文件中的配置信息

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/day04_db

user=root

password=root

如何讀取外部文件的內(nèi)容?

public static void main(String[]args) {

? ? ? ? // 需求: 通過properties對(duì)象讀取 外部配置的內(nèi)容

? ? ? ? Propertiesprop=newProperties();

? ? ? ? try{

//對(duì)于FileInputStream流相對(duì)的路徑是當(dāng)前模塊

FileInputStreamin=newFileInputStream("jdbc.properties");

? ? ? ? ? ? // 加載外部的配置文件

? ? ? ? ? ? prop.load(in);

? ? ? ? }catch(IOExceptione) {

? ? ? ? ? ? // TODO Auto-generated catch block

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? // 讀取外部配置文件的內(nèi)容

? ? ? ? StringdriverClass=prop.getProperty("driverClass");

? ? ? ? Stringurl=prop.getProperty("url");

? ? ? ? Stringuser=prop.getProperty("user");

? ? ? ? Stringpassword=prop.getProperty("password");

?

? ? ? ? System.out.println(driverClass);

? ? }

獲得連接的最終版

public class JDBCUtils {

static String driverClass = null;

static String url = null;

static String user = null;

static String password = null;

static {

// 需求: 通過properties對(duì)象讀取 外部配置的內(nèi)容

Properties prop = new Properties();

try {

FileInputStream in=new FileInputStream("jdbc.properties");

// 加載外部的配置文件

prop.load(in);

// 讀取外部配置文件的內(nèi)容

? ? driverClass = prop.getProperty("driverClass");

? ? url = prop.getProperty("url");

? ? user = prop.getProperty("user");

? ? password = prop.getProperty("password");

// 注冊(cè)驅(qū)動(dòng)

Class.forName(driverClass);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// 獲得連接

public static Connection getConnection() {

Connection con = null;

? try? {

? ? ? ? ? con = DriverManager.getConnection(url, user, password);

? ? ? ? } catch (Exception e)

{

? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? return con;

}

}

關(guān)閉資源

public static void release(Connection conn, Statement stmt, ResultSet rs) {

// 釋放資源

try {

if (rs != null) {

rs.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if (stmt != null) {

stmt.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if (conn != null) {

conn.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

優(yōu)化后的delete方法

@Test

? ? publicvoiddelete() {

? ? ? ? // 需求: 刪除id=3的記錄

? ? ? ? Connectionconn=null;

? ? ? ? Statementstmt=null;

?

? ? ? ? try{

? ? ? ? ? ? // 獲得連接

? ? ? ? ? ? conn=JDBCUtils.getConnection();

? ? ? ? ? ? // 獲得發(fā)送sql的對(duì)象

? ? ? ? ? ? stmt=conn.createStatement();

? ? ? ? ? ? // 執(zhí)行sql 獲得結(jié)果

? ? ? ? ? ? Stringsql="delete from user where id=3";

? ? ? ? ? ? intsum=stmt.executeUpdate(sql);

? ? ? ? ? ? // 處理結(jié)果

? ? ? ? ? ? System.out.println(sum);

? ? ? ? }catch(Exceptione) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }finally{

? ? ? ? ? ? // 釋放資源

? ? ? ? ? ? JDBCUtils.release(conn,stmt,null);

? ? ? ? }

? ? }


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屋匕,一起剝皮案震驚了整個(gè)濱河市谴轮,隨后出現(xiàn)的幾起案子炒瘟,更是在濱河造成了極大的恐慌第步,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘都,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡翩隧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門堆生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑仆,你說我怎么就攤上這事≌岬。” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵寞射,是天一觀的道長。 經(jīng)常有香客問我桥温,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任脓魏,我火速辦了婚禮,結(jié)果婚禮上茂翔,老公的妹妹穿的比我還像新娘。我一直安慰自己珊燎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布悔政。 她就那樣靜靜地躺著,像睡著了一般谋国。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芦瘾,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音近弟,去河邊找鬼。 笑死祷愉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的二鳄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼订讼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了躯嫉?” 一聲冷哼從身側(cè)響起杨拐,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤祈餐,失蹤者是張志新(化名)和其女友劉穎哄陶,沒想到半個(gè)月后帆阳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡山宾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了资锰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绷杜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞭盟,到底是詐尸還是另有隱情,我是刑警寧澤瑰剃,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站晌姚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舀凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一猛遍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懊烤,春花似錦、人聲如沸腌紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浸遗,卻和暖如春猫胁,著一層夾襖步出監(jiān)牢的瞬間跛锌,已是汗流浹背弃秆。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菠赚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓衡查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峡捡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • JDBC基礎(chǔ)知識(shí) 一稍途、采用JDBC訪問數(shù)據(jù)庫的基本步驟: A.載入JDBC驅(qū)動(dòng)程序 B.定義連接URL ...
    java日記閱讀 3,849評(píng)論 0 20
  • JDBC簡(jiǎn)介 SUN公司為了簡(jiǎn)化、統(tǒng)一對(duì)數(shù)據(jù)庫的操作械拍,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC装盯。JDBC...
    奮斗的老王閱讀 1,518評(píng)論 0 51
  • 本文內(nèi)容 1.什么是JDBC以及為什么要使用JDBC 2.JDBC核心API的講解 3.使用JDBC核心API進(jìn)行...
    Vincilovfang閱讀 1,216評(píng)論 0 11
  • 開發(fā)中連接數(shù)據(jù)庫的方式有多中,可以直接用jdbc連接,也可以配置服務(wù)器的連接池.寫法也有多種,可以直接寫在jsp頁...
    傳奇內(nèi)服號(hào)閱讀 843評(píng)論 0 0
  • 最聰明的處世術(shù)埂奈, 是對(duì)其投已白眼迄损, 又與其同流合污账磺。
    小仙女Mary閱讀 364評(píng)論 0 0