【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//@EnableSchedulingpublic 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 tables2019-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 Woo2019-03-01 14:19:52.430 INFO 7436 --- [ restartedMain] c.e.kane.RestfulWebService1Application : Inserting customer record for Jeff Dean2019-03-01 14:19:52.430 INFO 7436 --- [ restartedMain] c.e.kane.RestfulWebService1Application : Inserting customer record for Josh Bloch2019-03-01 14:19:52.430 INFO 7436 --- [ restartedMain] c.e.kane.RestfulWebService1Application : Inserting customer record for Josh Long2019-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;@Configurationpublic 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.Driverdb.url:jdbc:mysql://localhost:3306/testdb.username:rootdb.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/testspring.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常用方法
execute方法:可以用於執行任何SQL語句,一般用於執行DDL語句;
update方法及batchUpdate方法:update方法用於執行新增、修改、刪除等語句;batchUpdate方法用於執行批處理相關語句;
query方法及queryForXXX方法:用於執行查詢相關語句;
call方法:用於執行儲存過程、函式相關語句。
參考官網 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html
關於連線池的一些內容
-
為什麼要使用資料庫連線池?
因為建立資料庫連線是一個非常耗時的過程,使用連線池可以預先同資料庫建立連線,放在記憶體中。應用需要使用資料庫的時候直接使用連線池中的連線即可。
-
當前三大主流連線池
DBCP:提供最大空閒連線數,超過連線全部自動斷開連線,其他兩個沒有。
C3P0:提供最大空閒連線時間,這樣可以做到自動收回空閒連線的機制
Druid:阿里出品的,同樣提供最大的空閒連線時間
作者:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2821926/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jmeter系列(31)- 獲取並使用 JDBC Request 返回的資料JMeterJDBC
- jdbc獲取資料庫連線JDBC資料庫
- Spring Boot入門(五):使用JDBC訪問MySql資料庫Spring BootJDBCMySql資料庫
- Spring Boot中如何使用JDBC讀取和寫入資料,JDBC和JPA的對比,JdbcTemplate和SimpleJdbcInsert的用法對比Spring BootJDBC
- oracle資料庫獲取指定表的列的相關資訊Oracle資料庫
- 使用Python獲取ECS相關資訊Python
- 如何處理 Spring Boot 中與快取相關的錯誤?Spring Boot快取
- jdbc獲取各種資料庫連線JDBC資料庫
- JDBC 獲取被插入資料的主鍵ID值JDBC
- jdbc獲取對各種資料庫的連線JDBC資料庫
- Spring Boot學習6:Spring Boot JDBCSpring BootJDBC
- spring boot配置檔案相關Spring Boot
- 如獲取獲取關聯資料的文件跟模型的關聯資料集呢模型
- 獲取網路卡的相關資訊
- 關於使用Spring Boot的Kafka教程 - DZone大資料Spring BootKafka大資料
- 強烈推薦:如何找到免費大資料,獲取相關資料大資料
- JDBC 相關配置JDBC
- 關於如何獲取資料的方法
- Spring boot 獲取yml檔案工具類Spring Boot
- Spring多資料來源獲取Spring
- spring boot學習(7)— 配置資訊的獲取方式Spring Boot
- JDBC獲取表的列數JDBC
- 獲取app版本號相關資訊APP
- spring cloud+spring boot 電子商務spring boot獲取配置檔案的屬性CloudSpring Boot
- 關於獲取事件相應的結果事件
- Spring Boot中使用PostgreSQL資料庫Spring BootSQL資料庫
- 關於海量資料的獲取問題
- 詳解JDBC資料庫連結及相關方法的封裝JDBC資料庫封裝
- datatables使用ajax獲取資料
- 使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan獲取SQL相關詳細資訊TTSSQL
- Spring Boot EL獲取配置檔案中的值的方式Spring Boot
- C++獲取硬體相關資訊C++
- 用JS獲取函式相關的程式碼JS函式
- 使用Spring Boot RESTful Web流式資料 | TechshardSpring BootRESTWeb
- PHP獲取客戶端、PHP獲取伺服器相關資訊PHP客戶端伺服器
- (七)Spring Boot Controller的請求引數獲取Spring BootController
- Spring Boot基礎教程:EhCache快取的使用Spring Boot快取
- 在Grails使用Sql獲取資料AISQL