1. 程式人生 > >易筋SpringBoot 2.1 | 第六篇:JdbcTemplate訪問MySQL

易筋SpringBoot 2.1 | 第六篇:JdbcTemplate訪問MySQL

寫作時間:2019-01-03
Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA, MySQL 8.0.13

說明

資料需要持久化儲存,無論是客戶端的SQLLITE,還是服務端的MySQL。這裡記錄最原始的訪問資料庫方式,JdbcTemplate訪問MySQL. Spring 提供了一個模板類JdbcTemplate,能夠容易跟資料庫和資料庫連線JDBC(Java DataBase Connectivity)打交道。 絕大多數的JDBC程式碼在寫業務程式碼之前需要很多準備工作:獲取資料庫資源,連線管理,異常處理,常規錯誤校驗. JdbcTemplate幫你處理上面的所有問題, 讓開發者專注於業務.

MySQL資料庫

  1. 首先需要到MySQL的官網下載社群版的安裝檔案。筆者下載的是最新版本8.0.13.
    在這裡插入圖片描述

  2. 接下來:下載 > 安裝 > 設定root密碼(mysql8.0以上密碼策略限制必須要大小寫加數字特殊符號)
    安裝完成以後,安裝路徑在/usr/local,筆者的MySQL路徑為:/usr/local/mysql-8.0.13-macos10.14-x86_64

  3. 在命令列輸入mysql命令:

$ mysql
zsh: command not found: mysql
  1. 發現找不到命令,需要先設定環境變數,筆者的命令列環境為myzsh,設定如下:
$ cd $home
$ vim .zshrc
  1. 在最下面加上環境變數配置
# Mysql
export MYSQL_HOME="/usr/local/mysql-8.0.13-macos10.14-x86_64"
export PATH=$MYSQL_HOME/bin:$PATH
  1. 儲存esc > :wq, 重新載入配置檔案
$ source .zshrc
  1. 連線資料庫:
$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ;
or \g. Your MySQL connection id is 24 Server version: 8.0.13 MySQL Community Server - GPL
  1. 新建資料庫和使用者(注意: -- 後面是註釋)
mysql> create database db_example; -- Create the new database
mysql> create user 'springuser'@'%' identified by 'ThePassword'; -- Creates the user
mysql> grant all on db_example.* to 'springuser'@'%'; -- Gives all the privileges to the new user on the newly created database
  1. 顯示資料庫:
mysql> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| db_example         |
+--------------------+
5 rows in set (0.00 sec)
  1. 選擇資料庫
mysql> use mysql;
Database changed
  1. 顯示資料庫中的表
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| component                 |
...

MySQL客戶端

在命令列裡面寫sql不方便,可以下載客戶端MySQL Workbench 8.0.13,查詢例子如下,執行快捷鍵cmd+enter
在這裡插入圖片描述

忘記root密碼也可以修改,建議儲存好密碼。
在這裡插入圖片描述

工程建立

參照教程【SpringBoot 2.1 | 第一篇:構建第一個SpringBoot工程】新建一個Spring Boot專案,名字叫demojdbctemplate, 在目錄src/main/java/resources 下找到配置檔案application.properties,重新命名為application.yml

配置檔案

pom.xml 依賴配置新增:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.13</version>
 </dependency>

MySQL連線的配置mysql-connector-java資訊來自官網 »

  1. 8.0.13 連結
  2. 所有版本連結

資料庫連線資訊配置src/main/resources/application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_example
    username: springuser
    password: ThePassword

程式碼實現

  1. 新建實體類com.zgpeace.demojdbctemplate.bean.Customer
package com.zgpeace.demojdbctemplate.bean;

public class Customer {
    private long id;
    private String firstName, lastName;

    public Customer(long id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%d, firstName='%s', lastName='%s']",
                id, firstName, lastName);
    }

    // getters & setters omitted for brevity

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

  1. 完善啟動類com.zgpeace.demojdbctemplate.DemojdbctemplateApplication
package com.zgpeace.demojdbctemplate;

import com.zgpeace.demojdbctemplate.bean.Customer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@SpringBootApplication
public class DemojdbctemplateApplication implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DemojdbctemplateApplication.class);

    @Autowired
    JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(DemojdbctemplateApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("Creating tables");

        jdbcTemplate.execute("DROP TABLE IF EXISTS customers");
        jdbcTemplate.execute("CREATE TABLE customers(" +
                "id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");

        // Split up the array of whole names into an array of first/last names
        List<Object[]> splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
                .map(name -> name.split(" "))
                .collect(Collectors.toList());

        // Use a Java 8 stream to print out each tuple of the list
        splitUpNames.forEach(name -> log.info(String.format("Inserting customer record for %s %s", name[0], name[1])));

        // Uses JdbcTemplate's batchUpdate operation to bulk load data
        jdbcTemplate.batchUpdate("INSERT INTO customers(first_name, last_name) VALUES (?,?)", splitUpNames);

        log.info("Querying for customer records where first_name = 'Josh':");

        jdbcTemplate.query("SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh"},
                (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"),
                        rs.getString("last_name"))).forEach(customer -> log.info(customer.toString()));


    }
}

實現功能解說:
1)注入jdbcTemplate物件
2)建立表customers
3)插入資料
4)查詢滿足條件firstName='Josh'的記錄

  1. 執行工程, 控制檯列印資訊如下:
2019-01-03 10:51:35.301  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Creating tables
2019-01-03 10:51:35.303  INFO 23276 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-01-03 10:51:35.626  INFO 23276 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-01-03 10:51:35.723  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Inserting customer record for John Woo
2019-01-03 10:51:35.723  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Inserting customer record for Jeff Dean
2019-01-03 10:51:35.723  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Inserting customer record for Josh Bloch
2019-01-03 10:51:35.723  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Inserting customer record for Josh Long
2019-01-03 10:51:35.743  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Querying for customer records where first_name = 'Josh':
2019-01-03 10:51:35.755  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Customer[id=3, firstName='Josh', lastName='Bloch']
2019-01-03 10:51:35.755  INFO 23276 --- [           main] c.z.d.DemojdbctemplateApplication        : Customer[id=4, firstName='Josh', lastName='Long']

總結

恭喜你!實現了JdbcTemplate訪問MySQL。 企業專案一般會用Mybatis或者JPA操作資料庫,所以這裡只要會用JdbcTemplate就好。

程式碼下載:
https://github.com/zgpeace/Spring-Boot2.1/tree/master/demojdbctemplate

參考:
https://spring.io/guides/gs/relational-data-access/
https://spring.io/guides/gs/accessing-data-mysql/
https://blog.csdn.net/forezp/article/details/70477821
https://www.jianshu.com/p/a8e4068a7a8a