【Spring Boot】使用JDBC 獲取相關的數據


使用JDBC 獲取相關的數據

什么是JDBC

Java Database Connectivity 是一種用於執行SQL語句的Java API,與數據庫建立連接、發送 操作數據庫的語句並處理結果。

Spring Boot 使用 JDBC

增加依賴

  • 修改pom.xml:將dependecies 修改為如下兩個
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    </dependencies>

創建 Customer.java 類

package com.example.kane.Model;

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
}

修改Application 類

package com.example.kane;

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.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;

import com.example.kane.Model.Customer;

@SpringBootApplication
//@EnableScheduling
public class RestfulWebService1Application implements CommandLineRunner{
	
	private static final Logger log = LoggerFactory.getLogger(RestfulWebService1Application.class);

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

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void run(String... strings) throws Exception {

        log.info("Creating tables");

        jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
        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()));
    }
}

運行項目看結果

2019-03-01 14:19:52.078  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Creating tables
2019-03-01 14:19:52.086  INFO 7436 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-03-01 14:19:52.392  INFO 7436 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-03-01 14:19:52.429  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Inserting customer record for John Woo
2019-03-01 14:19:52.430  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Inserting customer record for Jeff Dean
2019-03-01 14:19:52.430  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Inserting customer record for Josh Bloch
2019-03-01 14:19:52.430  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Inserting customer record for Josh Long
2019-03-01 14:19:52.461  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Querying for customer records where first_name = 'Josh':
2019-03-01 14:19:52.480  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Customer[id=3, firstName='Josh', lastName='Bloch']
2019-03-01 14:19:52.480  INFO 7436 --- [  restartedMain] c.e.kane.RestfulWebService1Application   : Customer[id=4, firstName='Josh', lastName='Long']
2019-03-01 14:20:01.122  INFO 7436 --- [nio-8080-exec-5] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-03-01 14:20:01.123  INFO 7436 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-03-01 14:20:01.146  INFO 7436 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Completed initialization in 22 ms

說明

官網的例子,沒有配置JDBC Template的Datasource,默認使用的是H2 的內存存儲的數據庫,只能當做測試使用。下面會有介紹更改DataSource的方法

介紹下 CommandLineRunner

功能

在項目啟動后,執行執行功能,我們可以定一個類,去實現CommandLineRunner接口,重寫run方法,執行一部分操作。需要注意的是,定義類必須標記為Spring管理的組件

測試類

package com.example.kane.Model;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order(value=1) //因為可能有許多事情要做,Order 可以根據大小,判讀執行的順序
public class run_after_application implements CommandLineRunner{

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("-----------------------");
	}
	
}

介紹下JdbcTempalte

在JDBC核心包中,JdbcTemplate是主要的類,簡化了JDBC的使用,避免了一些常規錯誤。它能夠執行JDBC核心流程,在應用代碼之上提供SQL語句、導出結果。這個類執行SQL查詢、更新、對結果集重復操作捕獲JDBC的異常。並將它翻譯成org.springframework.dao 包中定義的基本的、信息量更大的異常層次結構。

JDBC構造方法

  • JdbcTemplate()
//為Bean創建一個JdbcTemplate以供使用
//再沒配置DataSource的情況下 springboot提供了 一些嵌入式的數據庫支持,上面的例子使用的就是H2數據庫,是一個內存的數據庫
  • JdbcTemplate(javax.sql.DataSource dataSource)
//構造的時候傳入一個 DataSource,來獲取鏈接
//JdbcTemplate Spring boot默認鏈接的是H2 database,

在spring boot中配置mysql 數據庫

  • 數據庫配置類 db_config
package com.example.kane.config;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class db_config {
	//這個類是一個Config類
		@Value("${db.driver}")
		private String DRIVER;

		@Value("${db.password}")
		private String PASSWORD;

		@Value("${db.url}")
		private String URL;

		@Value("${db.username}")
		private String USERNAME;
		@Bean
		public DataSource dataSource1() {
			BasicDataSource dataSource = new BasicDataSource();
			dataSource.setDriverClassName(DRIVER);
			dataSource.setUrl(URL);
			dataSource.setUsername(USERNAME);
			dataSource.setPassword(PASSWORD);
			return dataSource;
		}
}
  • application.properties
# Database
# mysqljdbc連接驅動
db.driver:com.mysql.cj.jdbc.Driver
db.url:jdbc:mysql://localhost:3306/test
db.username:root
db.password:root
  • pom.xml
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- 需要用到commons-dbcp連接池,以及連接mysql使用的drver-->
  • application 啟動類修改
    @Autowired
    JdbcTemplate jdbcTemplate;
	//下面是加載了數據庫的配置。只需要增加這個
	@Autowired
	db_config db_config;
  • 運行程序后會發現數據存儲到本地數據庫
SELECT * from customers;
------------------------
1	John	Woo
2	Jeff	Dean
3	Josh	Bloch
4	Josh	Long

另一個簡單的方法配置mysql數據庫

  • 直接修改application.properties
# database
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 將properties改成yml文件 application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

注:這兩種方式又回歸到配置文件的方式了,

JDBC Template常用方法

關於連接池的一些內容

  • 為什么要使用數據庫連接池?

    因為建立數據庫連接是一個非常耗時的過程,使用連接池可以預先同數據庫建立連接,放在內存中。應用需要使用數據庫的時候直接使用連接池中的連接即可。

  • 當前三大主流連接池

    • DBCP:提供最大空閑連接數,超過連接全部自動斷開連接,其他兩個沒有。
    • C3P0:提供最大空閑連接時間,這樣可以做到自動收回空閑連接的機制
    • Druid:阿里出品的,同樣提供最大的空閑連接時間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM