Springboot整合JDBCTemplate

x33g5p2x  于2020-09-30 发布在 Spring  
字(4.3k)|赞(0)|评价(0)|浏览(746)

1. 引言

  前面几篇文章介绍了 SpringBoot 的一些基本信息,但是还没有跟数据库交互。接下来几章,我们将陆续介绍 SpringBoot 整合各大主流的 ORM 框架。

  操作数据库的方式有很多种。本章介绍 JDBCTemplate 操作数据库。
JDBCTemplate 是 Spring 对数据库操作在jdbc上做的深层封装。使用 Spring 的注入功能,可以把DataSource注册到JdbcTemplate 之中。

JdbcTemplate API文档

  参照 JdbcTemplate API文档 可以总结出,JDBCTemplate 主要分为四类方法:

  • query 方法/ queryForXXX 方法:用于执行查询相关语句;
  • update 方法:update 方法用于执行新增、修改、删除等语句;
  • batchUpdate 方法用于执行批处理相关语句;
  • execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句;
  • call 方法:用于执行存储过程、函数相关语句。

2. 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.start.domain;

public class Book {
    private Long id;
    private String bookName;
    private Double bookPrice;
    private String bookAuthor;
    // set/get 省略
}
  • pom依赖
<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 中配置数据库信息:
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/work?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

下面,编写测试接口。为了简化代码,此处不对 Java web项目做分层处理,将所有的业务逻辑都放在 controller 层中。

package com.start.controller;


import com.start.domain.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);
    }
}
  • 启动类暂时不变
package com.start;

import com.start.domain.Student;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties({Student.class})
@ConfigurationProperties(prefix = "class.student")
public class MySpringBootStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootStartApplication.class);
    }
}

最后,可用 Postman 或者别的客户端工具进行测试。可以对数据库进行增删改查操作。

3. 总结

市面上有很多 ORM 框架,基本上都是各有优缺点。针对于 JDBCTemplate ,它的优点是更加接近底层的 JDBC,配置少,spring 全家桶自家封装,使用起来简单快捷。但是缺点就是业务代码和 sql 脚本糅合在一起了,不利于 sql 的维护。
【建议】实际开发过程中:sql脚本以sql配置文件的形式存放,减少业务代码和sql的耦合。

个人认为,要使用好 JDBCTemplate ,只需将 JdbcTemplate API文档 仔细研究研究。

相关文章