一起來學(xué)SpringBoot | 第四篇:使用JdbcTemplate訪問數(shù)據(jù)庫

SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建侧纯、運(yùn)行、調(diào)試甲脏、部署等一系列問題而誕生的產(chǎn)物眶熬,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范块请,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程

Spring Framework對數(shù)據(jù)庫的操作在JDBC上面做了深層次的封裝娜氏,通過依賴注入功能,可以將 DataSource 注冊到JdbcTemplate之中墩新,使我們可以輕易的完成對象關(guān)系映射贸弥,并有助于規(guī)避常見的錯(cuò)誤,在SpringBoot中我們可以很輕松的使用它海渊。

特點(diǎn)

  • 速度快绵疲,對比其它的ORM框架而言,JDBC的方式無異于是最快的
  • 配置簡單臣疑,Spring自家出品盔憨,幾乎沒有額外配置
  • 學(xué)習(xí)成本低,畢竟JDBC是基礎(chǔ)知識讯沈,JdbcTemplate更像是一個(gè)DBUtils

導(dǎo)入依賴

pom.xml 中添加對 JdbcTemplate 的依賴

<!-- Spring JDBC 的依賴包郁岩,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 將會(huì)自動(dòng)獲得HikariCP依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默認(rèn)就內(nèi)嵌了Tomcat 容器,如需要更換容器也極其簡單-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

連接數(shù)據(jù)庫
在application.properties中添加如下配置缺狠。值得注意的是问慎,SpringBoot默認(rèn)會(huì)自動(dòng)配置DataSource,它將優(yōu)先采用HikariCP連接池挤茄,如果沒有該依賴的情況則選取tomcat-jdbc如叼,如果前兩者都不可用最后選取Commons DBCP2。通過spring.datasource.type屬性可以指定其它種類的連接池

spring.datasource.url=jdbc:mysql://localhost:3306/chapter4?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
#spring.datasource.type
#更多細(xì)微的配置可以通過下列前綴進(jìn)行調(diào)整
#spring.datasource.hikari
#spring.datasource.tomcat
#spring.datasource.dbcp2

具體編碼

完成基本配置后穷劈,接下來進(jìn)行具體的編碼操作薇正。為了減少代碼量,就不寫UserDao囚衔、UserService之類的接口了挖腰,將直接在Controller中使用JdbcTemplate進(jìn)行訪問數(shù)據(jù)庫操作,這點(diǎn)是不規(guī)范的练湿,各位別學(xué)我…

表結(jié)構(gòu)

創(chuàng)建一張 t_user 的表

CREATE TABLE `t_user` (
  `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增',
  `username` varchar(50) NOT NULL COMMENT '用戶名',
  `password` varchar(50) NOT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

實(shí)體類

package com.battcn.entity;

/**
 * @author
 */
public class User {

    private Long id;
    private String username;
    private String password;
    // TODO  省略get set
}

restful 風(fēng)格接口

package com.battcn.controller;

import com.battcn.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author
 */
@RestController
@RequestMapping("/users")
public class SpringJdbcController {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public SpringJdbcController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @GetMapping
    public List<User> queryUsers() {
        // 查詢所有用戶
        String sql = "select * from t_user";
        return jdbcTemplate.query(sql, new Object[]{}, new BeanPropertyRowMapper<>(User.class));
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // 根據(jù)主鍵ID查詢
        String sql = "select * from t_user where id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    @DeleteMapping("/{id}")
    public int delUser(@PathVariable Long id) {
        // 根據(jù)主鍵ID刪除用戶信息
        String sql = "DELETE FROM t_user WHERE id = ?";
        return jdbcTemplate.update(sql, id);
    }

    @PostMapping
    public int addUser(@RequestBody User user) {
        // 添加用戶
        String sql = "insert into t_user(username, password) values(?, ?)";
        return jdbcTemplate.update(sql, user.getUsername(), user.getPassword());
    }


    @PutMapping("/{id}")
    public int editUser(@PathVariable Long id, @RequestBody User user) {
        // 根據(jù)主鍵ID修改用戶信息
        String sql = "UPDATE t_user SET username = ? ,password = ? WHERE id = ?";
        return jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), id);
    }
}

測試
由于上面的接口是 restful 風(fēng)格的接口猴仑,添加和修改無法通過瀏覽器完成,所以需要我們自己編寫junit或者使用postman之類的工具。

創(chuàng)建單元測試Chapter4ApplicationTests辽俗,通過TestRestTemplate模擬GET疾渣、POST、PUT崖飘、DELETE等請求操作

package com.battcn;

import com.battcn.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author Levin
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Chapter4Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Chapter4ApplicationTests {

    private static final Logger log = LoggerFactory.getLogger(Chapter4ApplicationTests.class);
    @Autowired
    private TestRestTemplate template;
    @LocalServerPort
    private int port;

    @Test
    public void test1() throws Exception {
        template.postForEntity("http://localhost:" + port + "/users", new User("user1", "pass1"), Integer.class);
        log.info("[添加用戶成功]\n");
        // TODO 如果是返回的集合,要用 exchange 而不是 getForEntity 榴捡,后者需要自己強(qiáng)轉(zhuǎn)類型
        ResponseEntity<List<User>> response2 = template.exchange("http://localhost:" + port + "/users", HttpMethod.GET, null, new ParameterizedTypeReference<List<User>>() {
        });
        final List<User> body = response2.getBody();
        log.info("[查詢所有] - [{}]\n", body);
        Long userId = body.get(0).getId();
        ResponseEntity<User> response3 = template.getForEntity("http://localhost:" + port + "/users/{id}", User.class, userId);
        log.info("[主鍵查詢] - [{}]\n", response3.getBody());
        template.put("http://localhost:" + port + "/users/{id}", new User("user11", "pass11"), userId);
        log.info("[修改用戶成功]\n");
        template.delete("http://localhost:" + port + "/users/{id}", userId);
        log.info("[刪除用戶成功]");
    }
}

總結(jié)

本章介紹了JdbcTemplate常用的幾種操作,詳細(xì)請參考JdbcTemplate API文檔

目前很多大佬都寫過關(guān)于 SpringBoot 的教程了朱浴,如有雷同吊圾,請多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE編寫翰蠢,包括新版本的特性都會(huì)一起介紹…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末项乒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梁沧,更是在濱河造成了極大的恐慌檀何,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廷支,死亡現(xiàn)場離奇詭異频鉴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恋拍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門砚殿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芝囤,你說我怎么就攤上這事似炎。” “怎么了悯姊?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵羡藐,是天一觀的道長。 經(jīng)常有香客問我悯许,道長仆嗦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任先壕,我火速辦了婚禮瘩扼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垃僚。我一直安慰自己集绰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布谆棺。 她就那樣靜靜地躺著栽燕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碍岔,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天浴讯,我揣著相機(jī)與錄音,去河邊找鬼蔼啦。 笑死榆纽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捏肢。 我是一名探鬼主播奈籽,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猛计!你這毒婦竟也來了唠摹?” 一聲冷哼從身側(cè)響起爆捞,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奉瘤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后煮甥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗温,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年成肘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卖局。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡双霍,死狀恐怖砚偶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洒闸,我是刑警寧澤染坯,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站丘逸,受9級特大地震影響单鹿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜深纲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一仲锄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湃鹊,春花似錦儒喊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春掸驱,著一層夾襖步出監(jiān)牢的瞬間肛搬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工毕贼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温赔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓鬼癣,卻偏偏與公主長得像陶贼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子待秃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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