作者:追夢1819
原文:https://www.cnblogs.com/yanfei1819/p/10868954.html
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
引言
前面幾篇文章介紹了 SpringBoot 的一些基本信息,但是還沒有跟數據庫交互。接下來幾章,我們將陸續介紹 SpringBoot 整合各大主流的 ORM 框架。
操作數據庫的方式有很多種。本章介紹 JDBCTemplate 操作數據庫。
JDBCTemplate 簡介
JDBCTemplate 是 Spring 對數據庫操作在jdbc上做的深層封裝。使用 Spring 的注入功能,可以把DataSource注冊到JdbcTemplate 之中。
參照 JdbcTemplate API文檔 可以總結出,JDBCTemplate 主要分為四類方法:
- query 方法/ queryForXXX 方法:用於執行查詢相關語句;
- update 方法:update 方法用於執行新增、修改、刪除等語句;batchUpdate 方法用於執行批處理相關語句;
- execute 方法:可以用於執行任何 SQL 語句,一般用於執行 DDL 語句;
- call 方法:用於執行存儲過程、函數相關語句。
## SpringBoot 整合JDBCTemplate
下面以示例演示 JDBCTemplate 在 SpringBoot 中的應用。
首先,是准備工作,初始化表和數據:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`book_name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`book_price` decimal(10, 2) NOT NULL,
`book_author` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, 'java', 45.00, 'shiyanfei');
INSERT INTO `book` VALUES (2, 'PHP', 45.65, 'admin');
SET FOREIGN_KEY_CHECKS = 1;
其次,新建 SpringBoot 工程,創建實體類並引入 maven 依賴:
book 實體類:
package com.yanfei1819.jdbctemplatedemo.entity;
/**
* Created by 追夢1819 on 2019-05-15.
*/
public class Book {
private Long id;
private String bookName;
private Double bookPrice;
private String bookAuthor;
// set/get 省略
}
pom.xml 引入依賴:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后,在 application.properties 中配置數據庫信息:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.88:3306/test?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=pass123
下面,編寫測試接口。為了簡化代碼,此處不對 Java web項目做分層處理,將所有的業務邏輯都放在 controller 層中。
package com.yanfei1819.jdbctemplatedemo.web.controller;
import com.yanfei1819.jdbctemplatedemo.entity.Book;
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;
/**
* Created by 追夢1819 on 2019-05-15.
*/
@RestController
public class BookController {
@Autowired
private JdbcTemplate jdbcTemplate;
// 查詢所有的書籍
@GetMapping("/book/queryBooks")
public List<Book> queryBooks(){
String sql = "select * from book ";
return jdbcTemplate.query(sql,new Object[]{},new BeanPropertyRowMapper<>(Book.class));
}
// 根據id查詢書籍
@GetMapping("/book/{id}")
public Book queryBookById(@PathVariable Long id){
String sql = "select * from book where id = ?";
return jdbcTemplate.queryForObject(sql,new Object[]{id},new BeanPropertyRowMapper<>(Book.class));
}
// 新增書籍
@PostMapping("/book/save")
public int saveBook(@RequestBody Book book){
String sql = "insert into book(book_name,book_price,book_author) values(?,?,?)";
return jdbcTemplate.update(sql,book.getBookName(),book.getBookPrice(),book.getBookAuthor());
}
// 刪除書籍
@GetMapping("/book/delete/{id}")
public int deleteBook(@PathVariable Long id){
String sql = "delete from book where id = ?";
return jdbcTemplate.update(sql,id);
}
}
最后,可用 Postman 或者別的客戶端工具進行測試。可以對數據庫進行增刪改查操作。
總結
市面上有很多 ORM 框架,基本上都是各有優缺點。針對於 JDBCTemplate ,它的優點是更加接近底層的 JDBC,配置少,spring 全家桶自家封裝,使用起來簡單快捷。但是缺點就是業務代碼和 sql 腳本糅合在一起了,不利於 sql 的維護。
個人認為,要使用好 JDBCTemplate ,只需將 JdbcTemplate API文檔 仔細研究研究。
源碼:我的GitHub