Spring Boot入門系列(十四)使用JdbcTemplate操作數據庫,配置多數據源!_如何寫文案

※別再煩惱如何寫文案,掌握八大原則!

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

前面介紹了Spring Boot 中的整合Mybatis並實現增刪改查、如何實現事物控制。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。

Spring Boot 除了Mybatis數據庫框架,還有JdbcTemplate等數據庫操作框架,同樣也比較簡單實用,如果是一般簡單的項目,用JdbcTemplate完全可以實現相關的數據庫操作。它雖然沒有MyBatis功能強大,但使用比較簡單,JdbcTemplate應該算是最簡單的數據持久化方案,所以下面就來給大家介紹Spring Boot 使用JdbcTemplate操作數據庫,配置多數據源!

 

一、JDBC簡介

JDBC(Java Data Base Connectivity, Java 數據庫連接)是一種用於執行各種數據庫操作的 API,可以為多種數據庫提供統一訪問接口。所以,JDBC 就像是一套 Java 訪問數據庫的 API 規範,利用這套規範屏蔽了各種數據庫 API 調用的差異性。當應用程序需要訪問數據庫時,調用 JDBC API 相關代碼進新操作,再由JDBC調用各類數據庫的驅動包進行數據操作,最後數據庫驅動包和對應的數據庫通訊協議完成對應的數據庫操作。

在Java領域,數據持久化有幾個常見的方案,有Spring Boot自帶的JdbcTemplate、有MyBatis,還有JPA,在這些方案中,最簡單的就是Spring Boot自帶的JdbcTemplate,雖然沒有MyBatis功能強大,但是,使用比較簡單,事實上,JdbcTemplate應該算是最簡單的數據持久化方案。

 

二、快速開始

開始之前,需要創建一個Spring Boot項目,JdbcTemplate的引用很簡單,開發者在創建一個SpringBoot項目時,選上Jdbc以及數據庫驅動依賴即可。之前介紹過如何創建項目這裏就不介紹,直接使用之前創建的項目工程。

1、依賴配置

1、pom添加依賴

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

需要注意的是

如果是用數據庫連接池,記得添加Druid數據庫連接池依賴。

這裏可以添加專門為Spring Boot打造的druid-spring-boot-starter,JdbcTemplate默認使用Hikari 連接池,如果需要使用druid,需要另外配置。

 

2、application.properties配置數據源

接下來需要在application.properties中提供數據的基本配置即可,如下:

spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

注意:在 Spring Boot 2.1.0 中, com.mysql.jdbc.Driver 已經過期,推薦使用com.mysql.cj.jdbc.Driver

如此之後,所有的配置就算完成了,接下來就可以直接使用JdbcTemplate了,是不是特別方便。其實這就是SpringBoot的自動化配置帶來的好處。

 

2、數據庫和實體類

1、數據庫表

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
    `name` varchar(32) DEFAULT NULL COMMENT '名稱',
    `code` varchar(32) DEFAULT NULL COMMENT '編碼',
    `price` int DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

2、實體類

package com.weiz.pojo;

public class Product {
    private Long id;
    private String name;
    private String code;
    private int price;
    public Product(String name, String code, int price) {
        this.name = name;
        this.code = code;
        this.price = price;
    }
    // 省略 getter setter
}

實體類的數據類型要和數據庫字段一一對應,否則會有問題。

3、Serverice封裝

創建ProductService和ProductServiceImpl類

1、創建 UserService 定義我們常用的增刪改查接口

package com.weiz.service;

import com.weiz.pojo.Product;

public interface ProductService {
    int save(Product product);

    int update(Product product);

    int delete(long id);

    Product findById(long id);
}

2、創建 ProductServiceImpl 類實現 ProductService 類接口

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

package com.weiz.service.impl;

import com.weiz.pojo.Product;
import com.weiz.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;


@Service
public class ProductServiceImpl implements ProductService  {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int save(Product product) {
        return jdbcTemplate.update("INSERT INTO products(name, code, price) values(?, ? , ?)",
                product.getName(), product.getCode(), product.getPrice());
    }

    @Override
    public int update(Product product) {
        return jdbcTemplate.update("UPDATE products SET name = ? , code = ? , price = ? WHERE id=?",
                product.getName(), product.getCode(), product.getPrice(), product.getId());
    }

    @Override
    public int delete(long id) {
        return jdbcTemplate.update("DELETE FROM products where id = ? ",id);
    }

    @Override
    public Product findById(long id) {
        return jdbcTemplate.queryForObject("SELECT * FROM products WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<Product>(Product.class));
    }

}

代碼說明:

UserServiceImpl類上使用 @Service 註解用於標註數據訪問組件,@Autowired 在類中注入 JdbcTemplate,JdbcTemplate是 Spring Boot操作JDBC 提供的工具類 。

除了以上這些基本用法之外,JdbcTemplate也支持其他用法,例如調用存儲過程等,這些都比較容易,而且和Jdbc本身都比較相似,這裏也就不做介紹了,有興趣可以留言討論。

 

三、調用測試

 接下來我們對jdbc操作數據庫的功能進行測試。

1、創建ProductController 

package com.weiz.controller;

import com.weiz.pojo.Product;
import com.weiz.service.ProductService;
import com.weiz.utils.JSONResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("product")
public class ProductController {
    @Autowired
    private ProductService productService;


    @RequestMapping("/save")
    public JSONResult save() {
        Product product = new Product();
        product.setCode("iphone 11");
        product.setName("iphone 11");
        product.setPrice(100);
        productService.save(product);
        return JSONResult.ok("保存成功");
    }

    @RequestMapping("/update")
    public JSONResult update() {
        long pid = 1;
        Product product = new Product();
        product.setCode("iphone 12");
        product.setName("iphone 12");
        product.setPrice(200);
        product.setId(pid);
        productService.update(product);
        return JSONResult.ok("修改成功");
    }

    @RequestMapping("/delete")
    public JSONResult delete(long pid) {
        productService.delete(pid);
        return JSONResult.ok("刪除成功");
    }

    @RequestMapping("/findbyId")
    public JSONResult findById(long pid) {
        Product product =  productService.findById(pid);
        return JSONResult.ok(product);
    }
}

2、啟動項目,在瀏覽器分別輸入增刪改查對應的地址,測試對應的方法是不是正確即可。

 

四、多數據源的使用

在實際項目中,經常會碰到使用多個數據源的情況, 比如:需要使用多個host、需要使用多種數據庫(MySql、Oracle、SqlServer…)。SpringBoot中,對此都有相應的解決方案,不過一般來說,如果有多數據源的需求,我還是建議首選分佈式數據庫中間件MyCat。這些都是比較成熟的框架,不需要自己重新寫一套。當然如果一些簡單的需求,還是可以使用多數據源的,Spring Boot中,JdbcTemplate、MyBatis以及Jpa都可以配置多數據源。接下來,就在上面的項目的基礎上進行改造,給大家介紹JdbcTemplate 如何配置多數據源。

1、配置多數據源

application.properties配置多個數據源:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/zwz_test
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/zwz_test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

上面的配置文件,添加了兩個數據源,一個是 zwz_test 庫,鈴個是 zwz_test2 庫。

注意:之前單個數據源的數據庫連接是:spring.datasource.url,這裏多個數據源使用的是 spring.datasource.*.jdbc-url,因為JdbcTemplate默認使用Hikari 連接池,而 HikariCP 讀取的是 jdbc-url 。

 

2、配置JDBC初始化

創建DataSourceConfig,在項目啟動的時候讀取配置文件中的數據庫信息,並對 JDBC 初始化。  

package com.weiz.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name="primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate (
            @Qualifier("primaryDataSource") DataSource dataSource ) {
        return new JdbcTemplate(dataSource);
    }
    @Bean(name="secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

DataSourceConfig類的作用是在項目啟動的時候根據特定的前綴加載不同的數據源,再根據構建好的數據源創建不同的 JDBC。   
注意事項:使用多個數據源時,需要添加@Primary註解,@Primary:自動裝配時當出現多個Bean候選者時,被註解為@Primary的Bean將作為首選者。Primary 意味着”主要的”,類似與SQL語句中的”primary key”,有且只能有一個,否則會報錯。     3、修改Serverice封裝 需要對 ProductServerice 中的所有方法法進行改造,增加一個傳入參數 JdbcTemplate,根據調用方傳入的JdbcTemplate 進行操作。

// ProductService 接口
public interface ProductService {
    int save(Product product, JdbcTemplate jdbcTemplate);
    // 省略其他方法  
}

// ProductServiceImpl 
@Service
public class ProductServiceImpl implements ProductService  {
    @Override
    public int save(Product product,JdbcTemplate jdbcTemplate) {
        return jdbcTemplate.update("INSERT INTO products(name, code, price) values(?, ? , ?)",
                product.getName(), product.getCode(), product.getPrice());
    }
    // 省略其他方法 
}

 

4、調用測試

同樣,將之前的ProductController 修改如下:

@RestController
@RequestMapping("product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @Autowired
    private JdbcTemplate primaryJdbcTemplate;
    @Autowired
    private JdbcTemplate secondaryJdbcTemplate;

    @RequestMapping("/save")
    public JSONResult save() {
        Product product = new Product();
        product.setCode("iphone 11");
        product.setName("iphone 11");
        product.setPrice(100);
        productService.save(product,primaryJdbcTemplate);
        productService.save(product,secondaryJdbcTemplate);
        return JSONResult.ok("保存成功");
    }

    // 省略其他方法
}

在瀏覽器中輸入:/save 地址后,查看zwz_test 和 zwz_test2數據庫中的products表,都存入一條數據,說明多數據源插入數據成功,其他方方法也是一樣的。這樣在實際項目中,我們通過傳入不同的JdbcTemplate 實例,就可以操作多個數據庫。

 

最後

以上,就把Spring Boot 使用jdbcTemplate 操作數據庫介紹完了。同時也介紹了如何配置使用多數據源。Spring Boot 項目中 JDBC 操作數據庫是不是非常簡單。

這個系列課程的完整源碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回復:springboot源碼。獲取這個系列課程的完整源碼。

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※教你寫出一流的銷售文案?

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。