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 接続の追加: <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
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='" + name + '\'' + ", email='" + email + '\'' + '}'; } }
永続層の作成 上記のとおり データ ソース構成を使用すると、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 サイトの他の関連記事を参照してください。