JdbcTemplateの使用例を詳しく解説

Y2J
リリース: 2017-05-10 10:15:11
オリジナル
1607 人が閲覧しました

JdbcTemplate は、JDBC API に基づいてより抽象的なカプセル化を提供し、メソッド アノテーションに基づいてトランザクション管理機能を提供します。 SpringBoot の自動構成機能を使用し、Bean の自動構成を置き換えることにより、Spring Boot での JdbcTemplate の使用に関する関連知識を紹介します。この記事では、Spring Boot と JdbcTemplate を連携して使用する方法を紹介します。

Spring のデータベース操作は jdbc に深くカプセル化されており、Spring のインジェクション関数を使用して DataSource を JdbcTemplate に登録できます。 JdbcTemplate は、JDBC API に基づいてより抽象的なカプセル化を提供し、メソッド アノテーションに基づいてトランザクション管理機能を提供します。 SpringBoot 自動構成機能を使用し、Bean を自動的に構成します。

データソース構成Maven では、spring-boot-starter-jdbc モジュールを追加する必要があります

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
ログイン後にコピー

このモジュールは次のことを行います私たちにとっていくつかのこと

Tomcat-jdbc-{version}.jar は自動的に DataSource を構成します。

DataSource を定義しない場合、SpringBoot は自動的にインメモリデータベースリソース設定を構成します

Bean が設定されていない場合, SpringBoot は自動的に登録します

データベースを初期化します
クラスパスに schema.sql ファイルと data.sql ファイルを定義すると、springBoot はこれらのファイルを使用してデータベースを自動的に初期化します (ただし、ライブラリを構築することを選択する必要があります)
さらにschema.sql と data をロードするため、SpringBoot は SQL に加えて、schema-${platform}.sql と data-${platform}.sql もロードします (クラスパスに存在する場合)。

  spring.datasource.schema=xxxx-db.sql 可以定义你的建库文件
  spring.datasource.data=xxxx-data.sql 可以定义你的数据文件
  spring.datasource.initialize=true|false 可以决定是不是要初始化这些数据库文件
  spring.datasource.continueOnError=true|false 有了错误是否继续运行
ログイン後にコピー

埋め込みデータベースのサポート埋め込みデータベースは通常、開発環境とテスト環境で使用され、運用環境では推奨されません。 Spring Boot は、H2、HSQL、Derby などの自動的に構成された組み込みデータベースを提供します。これらを使用するために接続構成を指定する必要はありません。

たとえば、HSQL

<dependency>
 <groupId>org.hsqldb</groupId>
 <artifactId>hsqldb</artifactId>
 <scope>runtime</scope>
</dependency>
ログイン後にコピー

を使用して運用データソース構成に接続するために、pom.xml に次の構成を導入できます

MySQL データベース

を例として、最初に次の依存関係パッケージを導入します。 pom.xml での MySQL 接続の追加:

src/main/resources/application.properties でデータ ソース情報を構成します

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
ログイン後にコピー

JNDI データ ソース構成に接続します アプリケーションをアプリケーション サーバーにデプロイするとき、データ ソースをアプリケーション サーバーで管理する場合は、次の構成方法を使用して JNDI データ ソースを導入できます。

spring.datasource.jndi-name=java:jboss/datasources/customers
ログイン後にコピー

カスタマイズされたデータ ソース構成デフォルトの構成データ ソースを使用したくない場合、たとえば、Alibaba のデータ プールを使用してデータ ソースを管理したい場合は、自分で構成することもできます

最初に tomcat-jdbc を除外します デフォルト設定の dataSource

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
 <exclusions>
  <exclusion>
   <groupId>org.apache.tomcat</groupId>
   <artifactId>tomcat-jdbc</artifactId>
  </exclusion>
 </exclusions>
</dependency>
ログイン後にコピー

独自のデータ リソースを定義します ここでは Alibaba のデータ プール管理が使用されます、BasicDataSource

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.0.19</version>
</dependency>
ログイン後にコピー

package com.example;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.web.servlet.DispatcherServlet;
import com.alibaba.druid.pool.DruidDataSource;
import com.example.Listener.IndexListener;
import com.example.filter.IndexFilter;
import com.example.servlet.MyServlet;
@SpringBootApplication
public class SpringBootSimpleApplication {
 @Autowired
 private Environment env;
 @Bean
 public DataSource dataSource() {
  DruidDataSource dataSource = new DruidDataSource();
  dataSource.setUrl(env.getProperty("spring.datasource.url"));
  dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
  dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
  dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
  dataSource.setInitialSize(2);
  dataSource.setMaxActive(20);
  dataSource.setMinIdle(0);
  dataSource.setMaxWait(60000);
  dataSource.setValidationQuery("SELECT 1");
  dataSource.setTestOnBorrow(false);
  dataSource.setTestWhileIdle(true);
  dataSource.setPoolPreparedStatements(false);
  return dataSource;
 }
 public static void main(String[] args) {
  SpringApplication.run(SpringBootSimpleApplication.class, args);
 }
}
ログイン後にコピー
も使用できます

その他も使用できます:

<dependency>
 <groupId>commons-dbcp</groupId>
 <artifactId>commons-dbcp</artifactId>
 <version>1.4</version>
</dependency>
@Bean
public DataSource dataSource() {
 BasicDataSource dataSource = new BasicDataSource();
 dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
 dataSource.setUrl(env.getProperty("spring.datasource.url"));
 dataSource.setUsername(env.getProperty("spring.datasource.username"));
 dataSource.setPassword(env.getProperty("spring.datasource.password"));
 return dataSource;
}
ログイン後にコピー

コード例

エンティティオブジェクトの作成/src/main/java/com/example/domain/User.java

package com.example.domain;
public class User
{
 private Integer id;
 private String name;
 private String email;
 public User()
 {
 }
 public User(Integer id, String name, String email)
 {
  this.id = id;
  this.name = name;
  this.email = email;
 }
 public Integer getId()
 {
  return id;
 }
 public void setId(Integer id)
 {
  this.id = id;
 }
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 public String getEmail()
 {
  return email;
 }
 public void setEmail(String email)
 {
  this.email = email;
 }
 @Override
 public String toString() {
  return "User{" +
    "id=" + id +
    ", name=&#39;" + name + &#39;\&#39;&#39; +
    ", email=&#39;" + email + &#39;\&#39;&#39; +
    &#39;}&#39;;
 }
}
ログイン後にコピー

永続層の作成 上記のとおり データ ソース構成を使用すると、JdbcTemplate をデータ アクセス コンポーネントに挿入し、データベースと対話できます。お気づきかもしれませんが、ほとんどの場合、これらの構成はアプリケーション内で行われます。

永続層メソッドをテストするための単体テストを作成します

/src/test/java/SpringBootJdbcDemoApplicationTests.java

package com.example.repositories;
import com.example.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.sql.*;
import java.util.List;
@Repository
public class UserRepository {
 @Autowired
 private JdbcTemplate jdbcTemplate;
 @Transactional(readOnly = true)
 public List<User> findAll() {
  return jdbcTemplate.query("select * from users", new UserRowMapper());
 }
 @Transactional(readOnly = true)
 public User findUserById(int id) {
  return jdbcTemplate.queryForObject("select * from users where id=?", new Object[]{id}, new UserRowMapper());
 }
 public User create(final User user) {
  final String sql = "insert into users(name,email) values(?,?)";
  KeyHolder holder = new GeneratedKeyHolder();
  jdbcTemplate.update(new PreparedStatementCreator() {
   @Override
   public PreparedStatement createPreparedStatement(Connection connection)
     throws SQLException {
    PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    ps.setString(1, user.getName());
    ps.setString(2, user.getEmail());
    return ps;
   }
  }, holder);
  int newUserId = holder.getKey().intValue();
  user.setId(newUserId);
  return user;
 }
 public void delete(final Integer id) {
  final String sql = "delete from users where id=?";
  jdbcTemplate.update(sql,
    new Object[]{id},
    new int[]{java.sql.Types.INTEGER});
 }
 public void update(final User user) {
  jdbcTemplate.update(
    "update users set name=?,email=? where id=?",
    new Object[]{user.getName(), user.getEmail(), user.getId()});
 }
}
class UserRowMapper implements RowMapper<User> {
 @Override
 public User mapRow(ResultSet rs, int rowNum) throws SQLException {
  User user = new User();
  user.setId(rs.getInt("id"));
  user.setName(rs.getString("name"));
  user.setEmail(rs.getString("email"));
  return user;
 }
}
ログイン後にコピー

【関連する推奨事項】1. Java の無料ビデオ チュートリアル2. Java アノテーションの包括的な分析

3.

Alibaba Java 開発マニュアル

以上がJdbcTemplateの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート