Spring Boot JDBCを使って関連データを取得する方法

11274 ワード

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.springframework.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:アリ製品の場合、同じく最大の空き時間を提供します。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。