SpringBoot 數(shù)據(jù)篇之使用JDBC

簡(jiǎn)介

Spring Data 包含對(duì) JDBC 的存儲(chǔ)庫(kù)支持恶阴,并將自動(dòng)為CrudRepository上的方法生成 SQL。對(duì)于更高級(jí)的查詢豹障,提供了@Query注解冯事。

當(dāng) classpath 上存在必要的依賴項(xiàng)時(shí),Spring Boot 將自動(dòng)配置 Spring Data 的 JDBC 存儲(chǔ)庫(kù)血公。它們可以通過(guò)spring-boot-starter-data-jdbc的單一依賴項(xiàng)添加到項(xiàng)目中昵仅。如有必要,可以通過(guò)將@EnableJdbcRepositories批注或JdbcConfiguration子類添加到應(yīng)用程序來(lái)控制 Spring Data JDBC 的配置累魔。

API

spring-boot-starter-data-jdbc引入了spring-jdbc摔笤,其 JDBC 特性就是基于spring-jdbc。

而spring-jdbc最核心的 API 無(wú)疑就是JdbcTemplate垦写,可以說(shuō)所有的 JDBC 數(shù)據(jù)訪問(wèn)吕世,幾乎都是圍繞著這個(gè)類去工作的。

Spring 對(duì)數(shù)據(jù)庫(kù)的操作在 Jdbc 層面做了深層次的封裝梯澜,利用依賴注入寞冯,把數(shù)據(jù)源配置裝配到JdbcTemplate中,再由JdbcTemplate負(fù)責(zé)具體的數(shù)據(jù)訪問(wèn)晚伙。

JdbcTemplate主要提供以下幾類方法:

execute方法:可以用于執(zhí)行任何 SQL 語(yǔ)句吮龄,一般用于執(zhí)行 DDL 語(yǔ)句;

update方法及batchUpdate方法:update方法用于執(zhí)行新增咆疗、修改漓帚、刪除等語(yǔ)句;batchUpdate方法用于執(zhí)行批處理相關(guān)語(yǔ)句午磁;

query方法及queryForXXX方法:用于執(zhí)行查詢相關(guān)語(yǔ)句尝抖;

call方法:用于執(zhí)行存儲(chǔ)過(guò)程毡们、函數(shù)相關(guān)語(yǔ)句。

為了方便演示昧辽,以下增刪改查操作都圍繞一個(gè)名為 user 的表(該表的主鍵 id 是自增序列)進(jìn)行衙熔,該表的數(shù)據(jù)實(shí)體如下:

public class User {

? ? private Integer id;

? ? private String name;

? ? private Integer age;

? ? // 省略 getter/setter

}

數(shù)據(jù)實(shí)體只要是一個(gè)純粹的 Java Bean 即可,無(wú)需任何注解修飾搅荞。

execute

使用 execute 執(zhí)行 DDL 語(yǔ)句红氯,創(chuàng)建一個(gè)名為 test 的數(shù)據(jù)庫(kù),并在此數(shù)據(jù)庫(kù)下新建一個(gè)名為 user 的表咕痛。

public void recreateTable() {

? ? jdbcTemplate.execute("DROP DATABASE IF EXISTS test");

? ? jdbcTemplate.execute("CREATE DATABASE test");

? ? jdbcTemplate.execute("USE test");

? ? jdbcTemplate.execute("DROP TABLE if EXISTS user");

? ? jdbcTemplate.execute("DROP TABLE if EXISTS user");

? ? // @formatter:off

? ? StringBuilder sb = new StringBuilder();

? ? sb.append("CREATE TABLE user (id int (10) unsigned NOT NULL AUTO_INCREMENT,\n")

? ? ? ? .append("name varchar (64) NOT NULL DEFAULT '',\n")

? ? ? ? .append("age tinyint (3) NOT NULL DEFAULT 0,\n")

? ? ? ? .append("PRIMARY KEY (ID));\n");

? ? // @formatter:on

? ? jdbcTemplate.execute(sb.toString());

}

update

新增數(shù)據(jù)

public void insert(String name, Integer age) {

? ? jdbcTemplate.update("INSERT INTO user(name, age) VALUES(?, ?)", name, age);

}

刪除數(shù)據(jù)

public void delete(String name) {

? ? jdbcTemplate.update("DELETE FROM user WHERE name = ?", name);

}

修改數(shù)據(jù)

public void update(User user) {

? ? jdbcTemplate.update("UPDATE USER SET name=?, age=? WHERE id=?", user.getName(), user.getAge(), user.getId());

}

批處理

public void batchInsert(List<User> users) {

? ? String sql = "INSERT INTO user(name, age) VALUES(?, ?)";

? ? List<Object[]> params = new ArrayList<>();

? ? users.forEach(item -> {

? ? ? ? params.add(new Object[] {item.getName(), item.getAge()});

? ? });

? ? jdbcTemplate.batchUpdate(sql, params);

}

query

查單個(gè)對(duì)象

public User queryByName(String name) {

? ? try {

? ? ? ? return jdbcTemplate

? ? ? ? ? ? .queryForObject("SELECT * FROM user WHERE name = ?", new BeanPropertyRowMapper<>(User.class), name);

? ? } catch (EmptyResultDataAccessException e) {

? ? ? ? return null;

? ? }

}

查多個(gè)對(duì)象

public List<User> list() {

? ? return jdbcTemplate.query("select * from USER", new BeanPropertyRowMapper(User.class));

}

獲取某個(gè)記錄某列或者 count痢甘、avg、sum 等函數(shù)返回唯一值

public Integer count() {

? ? try {

? ? ? ? return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class);

? ? } catch (EmptyResultDataAccessException e) {

? ? ? ? return null;

? ? }

}

實(shí)戰(zhàn)

配置數(shù)據(jù)源

在src/main/resource目錄下添加application.properties配置文件茉贡,內(nèi)容如下:

spring.datasource.url = jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

spring.datasource.username = root

spring.datasource.password = root

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver

需要根據(jù)實(shí)際情況塞栅,替換url、username腔丧、password放椰。

注入 JdbcTemplate

@Service

public class UserDAOImpl implements UserDAO {

? ? private JdbcTemplate jdbcTemplate;

? ? @Autowired

? ? public UserDAOImpl(JdbcTemplate jdbcTemplate) {

? ? ? ? this.jdbcTemplate = jdbcTemplate;

? ? }

? ? // ...

}

歡迎歡迎學(xué)Java的朋友們加入java架構(gòu)交流: 855835163

群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)愉粤、高性能及分布式庄敛、Jvm性能調(diào)優(yōu)、Spring源碼科汗,MyBatis藻烤,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰头滔!趁年輕怖亭,使勁拼,給未來(lái)的自己一個(gè)交代坤检!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兴猩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子早歇,更是在濱河造成了極大的恐慌倾芝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭跳,死亡現(xiàn)場(chǎng)離奇詭異晨另,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谱姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)借尿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事路翻”否” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵茂契,是天一觀的道長(zhǎng)蝶桶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掉冶,這世上最難降的妖魔是什么莫瞬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮郭蕉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喂江。我一直安慰自己召锈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布获询。 她就那樣靜靜地躺著涨岁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉嚣。 梳的紋絲不亂的頭發(fā)上梢薪,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音尝哆,去河邊找鬼秉撇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秋泄,可吹牛的內(nèi)容都是我干的琐馆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恒序,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘦麸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起歧胁,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滋饲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喊巍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屠缭,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年崭参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勿她。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阵翎,死狀恐怖逢并,靈堂內(nèi)的尸體忽然破棺而出之剧,到底是詐尸還是另有隱情,我是刑警寧澤砍聊,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布背稼,位于F島的核電站,受9級(jí)特大地震影響玻蝌,放射性物質(zhì)發(fā)生泄漏蟹肘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一俯树、第九天 我趴在偏房一處隱蔽的房頂上張望帘腹。 院中可真熱鬧,春花似錦许饿、人聲如沸阳欲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)球化。三九已至,卻和暖如春瓦糟,著一層夾襖步出監(jiān)牢的瞬間筒愚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工菩浙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巢掺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓劲蜻,卻偏偏與公主長(zhǎng)得像址遇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斋竞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 絢麗的煙花淡出了視線 響亮的鞭炮遠(yuǎn)離了耳畔 喧囂的場(chǎng)景已不再熱烈 浮躁的心境將回歸默然 車(chē)輛啟動(dòng)匆匆不息向前 麻雀...
    夕陽(yáng)在山閱讀 144評(píng)論 0 1
  • 復(fù)活節(jié)假期倔约,向西班牙進(jìn)發(fā)~ 西班牙之旅可以說(shuō)是我最期待旅程的前二了,一是可以在西班牙會(huì)一會(huì)我親愛(ài)的小學(xué)班主任坝初,二是...
    你歪閱讀 688評(píng)論 5 9
  • 記得小時(shí)候浸剩,我的語(yǔ)文不好,我的小學(xué)語(yǔ)文老師說(shuō):那東西是積累鳄袍,不是一朝一夕的事绢要,想要學(xué)好就要多學(xué)多看,才能學(xué)好拗小。于是...
    小雨天天閱讀 261評(píng)論 0 0