Spring Bootはどのように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>
Custoomer.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
}
アプリクラスを変更する

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--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Creatingテーブル
2019-03-01 14:19:52.086  INFO 7436--[  retatedMain]comp.zxer.hikari.Hikari Data Source       : HikaliPool-1-Starting…
2019-03-01 14:19:52.392  INFO 7436--[  retatedMain]comp.zxer.hikari.Hikari Data Source       : HikaliPool-1-Start completted.
2019-03-01 14:19:52.429  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Inserting customer record for John Woo
2019-03-01 14:19:52.430  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Inserting customer record for Jeff Dean
2019-03-01 14:19:52.430  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Inserting customer record for Josh Bloch
2019-03-01 14:19:52.430  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Inserting customer record for Josh Long
2019-03-01 14:19:52.461  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Querying for customer records where first_name='Josh':
2019-03-01 14:19:52.480  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Custoomer[id=3,first Name=Josh],lastName='Bloch'
2019-03-01 14:19:52.480  INFO 7436--[  retartdMain]c.e.kane.Resttful WebService 1 Appplication   : Custoomer[id=4,first Name='Josh',lastName='Long'
2019-03-01 14:20:01.122  INFO 7436-[nio-850-exc-5]o.a.c.C.[Tomcat].[local host].[/]       : Initializing Spring Displatch Servlet'dispatcher Servlet'
2019-03-01 14:20:01.123  INFO 7436-[nio-850-exc-5]o.s.web.servlet.Disppatch Servlet        : Initializing Servlet'dispatcher Servlet'
2019-03-01 14:20:01.146  INFO 7436-[nio-850-exc-5]o.s.web.servlet.Disppatch Servlet        : Copleted initialization in 22 ms
説明
公式サイトの例では、JDBC Templateが配置されているDatasourceはなく、デフォルトではH 2のメモリに格納されているデータベースをテストとして使用するしかない。DataSourceの変更方法を紹介します。
Command Lineline Runnerを紹介します。
機能
プロジェクトの起動後、実行機能はクラスを決めて、CommundLinerインターフェースを実現し、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.springframe ewark.daoパッケージで定義されている基本的な、情報量がより大きい、異常な階層構造に翻訳します。
JDBC構造方法
JdbcTemplate()

// Bean    JdbcTemplate    
//    DataSource     springboot               ,          H2   ,         
Jdbc Template(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;
 }
}
appication.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-->
アプリ起動類の修正

 @Autowired
 JdbcTemplate jdbcTemplate;
 //            。       
 @Autowired
 db_config db_config;
プログラムを実行すると、ローカルデータベースにデータが格納されていることが分かります。

SELECT * from customers;
------------------------
1 John Woo
2 Jeff Dean
3 Josh Bloch
4 Josh Long
もう一つの簡単な方法はmysqlデータベースを配置します。
直接にappication.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ファイルのappration.ymlに変更します。

spring:
 datasource:
 url: jdbc:mysql://localhost:3306/test
 username: root
 password: root
 driver-class-name: com.mysql.cj.jdbc.Driver
注:この2つの方式はまた構成ファイルの方式に戻りました。
JDBC Template常用方法
  • execute方法:任意のSQL文を実行するために使用でき、一般的にDDL文を実行するために使用されます。
  • udate方法及びbatUpdate方法:udate方法は、新規、修正、削除などの語句を実行するために使用される。batch Update方法はバッチ処理関連語句を実行するために使用されます。
  • query方法及びqueryForXXX方法:クエリ関連語句を実行するために使用されます。
  • コール方法:記憶プロセス、関数関連ステートメントを実行するために使用されます。
  • 公式サイトを参照してください。https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html
  • 接続池の内容について
    なぜデータベース接続池を使うのですか?
    データベース接続を作るのは非常に時間がかかりますので、あらかじめデータベースと接続してメモリに入れておくことができます。アプリケーションはデータベースを使用する必要があります。直接に接続池の接続を利用すればいいです。
    現在の三大主流接続池
  • DBCP:最大の空き接続数を提供し、接続を超えて全部自動的に切断して接続します。他の二つはありません。
  • C 3 P 0:最大アイドル接続時間を提供し、アイドル接続を自動的に回収できる仕組み
  • を実現する。
  • Druid:アリ製品の場合、同じく最大の空き時間を提供します。
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考となる学習価値を持っています。質問があれば、メッセージを書いて交流してください。ありがとうございます。