JDBC整理記錄

1.什么是JDBC?

Java DataBase Connectivity Java 數(shù)據(jù)庫(kù)連接
其實(shí)就是官方(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫(kù)的規(guī)則,即接口蓝牲。各個(gè)數(shù)據(jù)庫(kù)廠商去實(shí)現(xiàn)這套接口,提供數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包澡绩。我們可以使用這套接口(JDBC)編程锤灿,真正去執(zhí)行的代碼式驅(qū)動(dòng)jar包的實(shí)現(xiàn)類(lèi)第股。

2.步驟:

a.導(dǎo)入驅(qū)動(dòng)jar包,需要Add As Library
b.注冊(cè)驅(qū)動(dòng)對(duì)象

mysql注冊(cè)驅(qū)動(dòng):mysql5之后的jar包可以省略注冊(cè)驅(qū)動(dòng)的步驟
Class.forName("com.mysql.cj.jdbc.Driver");

c.定義數(shù)據(jù)庫(kù)連接對(duì)象 Connection

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

d.定義sql語(yǔ)句

String sqlString = "delete from tbtest where id = 8;";

e.獲取執(zhí)行sql語(yǔ)句的對(duì)象 Statement

Statement statement = connection.createStatement();

f.執(zhí)行sql,接收返回結(jié)果

int count = statement.executeUpdate(sqlString);

g.處理結(jié)果

if (count > 0) {
    System.out.println("操作成功");
} else {
    System.out.println("操作失敗");
}

h.釋放資源

if (connection != null) {
    try {
        connection.close();
     }catch (SQLException e) {
     }
}
if (statement != null) {
    try {
       statement.close();
    } catch (SQLException e) {
    }
}

3.數(shù)據(jù)庫(kù)連接對(duì)象 Connection

1.獲取執(zhí)行sql的對(duì)象Statement
a. createStatement
b. prepareStatement(String sqlString) 可以防止SQL注入丁稀,效率更高

String sqlString = "select * from tbtest where worker=? and score > ?;";
preparedStatement = connection.prepareStatement(sqlString);
preparedStatement.setInt(1,2);
preparedStatement.setDouble(2,80);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
      System.out.println(resultSet.getInt("id") + " " + resultSet.getString("name"));
}

2.管理事務(wù):

  • 開(kāi)啟事務(wù):setAutoCommit(false);
  • 提交事務(wù):commit();
  • 回滾事務(wù):rollback(); 判空&&異常
try {
    // 開(kāi)啟事務(wù)
    connection.setAutoCommit(false);
    statement = connection.createStatement();
    statement.executeUpdate("update tbtest set score = score + 5 where score > 80;");
    //如果這兒發(fā)生了一個(gè)錯(cuò)誤
    statement.executeUpdate("update tbtest set score = score - 5 where score < 80;");
    //提交事務(wù)
    connection.commit();
    System.out.println("成績(jī)更新成功");
 } catch (Exception exception) {
    if (connection != null) {
        try {
        //回滾事務(wù)
        connection.rollback();
        System.out.println("回滾事務(wù)");
        } catch (Exception exception1) {
        }
    }
    System.out.println(exception.getMessage());
 }

4.Statement 執(zhí)行sql的對(duì)象

  • execute 可以執(zhí)行任意sql
  • int executeUpdate 執(zhí)行DML(insert吼拥、update、delete)二驰、DDL(create扔罪、alter秉沼、drop)
  • ResultSet executeQuery 執(zhí)行DQL(select)

5.結(jié)果集對(duì)象 ResultSet

  • next(); 游標(biāo)向下移動(dòng)一行桶雀,當(dāng)查詢(xún)結(jié)果是個(gè)表時(shí)游標(biāo)在表第一行,判斷當(dāng)前行是否是最后一行
  • getXxx(參數(shù)):獲取數(shù)據(jù)
    a. 可以傳值列的編號(hào) 從1開(kāi)始 getString(2)
    b. 傳值列的名稱(chēng)推薦 getString("name")
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
      System.out.println(resultSet.getInt("id") + " " + resultSet.getString("name"));
}

6數(shù)據(jù)庫(kù)連接池

  • 節(jié)約資源
  • 用戶(hù)訪問(wèn)高效
    1.使用:DataSource
    a. 獲取連接 dataSource.getConnection()
    b. 歸還連接 connection.close(); //如果連接對(duì)象Connection是從連接池獲取那么close將不是關(guān)閉連接唬复,而是歸還矗积。
  1. Druid:數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)技術(shù),由阿里巴巴提供
    a. 導(dǎo)入jar包 地址
    b. 定義配置文件properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbtest
username=root
password=xxxxxx
#初始化連接數(shù)量
initialSize=5
#最大連接數(shù)
maxActive=20
#最大等待時(shí)間
maxWait=3000

c. 加載配置文件
d. 獲取數(shù)據(jù)庫(kù)連接池對(duì)象 DruidDataSourceFactory
e. 獲取連接

Properties properties = new Properties();
InputStream inputStream = ConneFour.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from tbtest;");
while (resultSet.next()) {
    System.out.println(resultSet.getInt(1) + " " + resultSet.getString(2));
}

7.Spring JDBC

Spring 框架對(duì) JDBC 的封裝敞咧,提供了一個(gè) JdbcTemplate對(duì)象簡(jiǎn)化JDBC開(kāi)發(fā)
a. 導(dǎo)入jar包 地址

  • spring-beans
  • spring-core
  • spring-jdbc
  • spring-tx
  • com.springsource.org.apache.commons.logging-1.1.1

b.創(chuàng)建JdbcTemplate棘捣,依賴(lài)于數(shù)據(jù)源DataSource

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

c.執(zhí)行CRUD

  • update() 執(zhí)行DML語(yǔ)句
  • queryForMap() 查詢(xún)結(jié)果,將結(jié)果封裝成map集合 這個(gè)方法查詢(xún)的結(jié)果集長(zhǎng)度只能為1休建,列名作為key,值為value,將這條記錄封裝成map集合
  • queryForList() 查詢(xún)結(jié)果乍恐,將結(jié)果封裝成list集合 將其中每一條記錄封裝成map
  • query() 查詢(xún)結(jié)果,將結(jié)果封裝為JavaBean對(duì)象
  • queryForObject() 查詢(xún)結(jié)果测砂,將結(jié)果封裝成對(duì)象
//int infos = jdbcTemplate.update("update tbtest set score=100 where id=1;");
//Map infos = jdbcTemplate.queryForMap("select * from tbtest where id=1;");
//List infos = jdbcTemplate.queryForList("select * from tbtest;");
List<TbInfoBean> infos = jdbcTemplate.query("select * from tbtest;",new BeanPropertyRowMapper<TbInfoBean>(TbInfoBean.class));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茵烈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砌些,更是在濱河造成了極大的恐慌呜投,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存璃,死亡現(xiàn)場(chǎng)離奇詭異仑荐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纵东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)粘招,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人偎球,你說(shuō)我怎么就攤上這事男图∈咀耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵逊笆,是天一觀的道長(zhǎng)栈戳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)难裆,這世上最難降的妖魔是什么子檀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮乃戈,結(jié)果婚禮上褂痰,老公的妹妹穿的比我還像新娘。我一直安慰自己症虑,他們只是感情好缩歪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谍憔,像睡著了一般匪蝙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上习贫,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天逛球,我揣著相機(jī)與錄音,去河邊找鬼苫昌。 笑死颤绕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祟身。 我是一名探鬼主播奥务,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袜硫!你這毒婦竟也來(lái)了氯葬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤父款,失蹤者是張志新(化名)和其女友劉穎溢谤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體憨攒,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡世杀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肝集。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻坝。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杏瞻,靈堂內(nèi)的尸體忽然破棺而出所刀,到底是詐尸還是另有隱情衙荐,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布浮创,位于F島的核電站忧吟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斩披。R本人自食惡果不足惜溜族,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垦沉。 院中可真熱鬧煌抒,春花似錦、人聲如沸厕倍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讹弯。三九已至况既,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闸婴,已是汗流浹背坏挠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芍躏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邪乍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓对竣,卻偏偏與公主長(zhǎng)得像庇楞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子否纬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355