トッカンソフトウェア

SpringFrameworkでデータベースアクセス(Javaアプリケーション)

今回は、JdbcTemplateを使ってデータベースにアクセスしてみます。

データベースはPostgreSQLを使用します。テーブル作成の作成までは事前に行っておいて下さい。
PostgreSQLはこちらを参照下さい。

Springプロジェクトを作る手順は以前と同様ですが、設定ファイルの中身やソースを変えます。


まずは動かしてみましょう

pom.xml は新たにデータベースアクセスするためのライブラリ、PostgreSQLのドライバを追加します。
				
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>springTest</groupId>
	<artifactId>springTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<release>17</release>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>42.5.0</version>
		</dependency>
	</dependencies>
</project>
				
			
spring-jdbcがSpringからJDBCでデータベースアクセスするためのライブラリでpostgresqlのJDBCドライバになります。
別のデータベースにアクセスする場合は、別のJDBCドライバを指定して下さい。

Spring用の設定ファイル(SpringTest.xml)を以下を追加します。
				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<bean id="helloWorld" class="spring.test.SpringBean">
	</bean>

	<context:component-scan base-package="spring.test" />

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="org.postgresql.Driver" />
		<property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
		<property name="username" value="postgres" />
		<property name="password" value="ps" />
	</bean>

	<bean class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource" />
	</bean>
</beans>

			
dataSourceがデータベース接続設定、JdbcTemplateがJdbcTemplateを使用するための設定になります。


これからJavaソースに入っていきます。

実行対象となるJavaクラス(HelloWorldTest.java)は修正なしです。
				
package spring.test;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class HelloWorldTest {
	public static void main(String[] args) {
		FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\springApp\\SpringTest.xml");
//		FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:SpringTest.xml");

		SpringBean bean = (SpringBean) context.getBean("helloWorld");
		bean.show();

		context.close();
	}
}

			

次に設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)ですが、@AutowiredでJdbcTemplateのオブジェクトを生成します。
今回はSELECTを実行します。データベースコネクションの取得等が省略されるので、簡潔に書けます。
				
package spring.test;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class SpringBean {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void show() {
		List<Map<String, Object>> ret = jdbcTemplate.queryForList("select * from m_user");
		for (Map<String, Object> map : ret) {
			System.out.println(map.get("id").toString() + "-" + map.get("name").toString());
		}
	}
}

			
PostgeSQLのところでサンプルに作ったテーブルですが、そのまま今回使います。
				
create table public.m_user (
  id character varying(8) not null
  , name character varying(16)
  , primary key (id)
);

			

準備は以上で終わりです。それでは実行してみましょう。

作成したファイルに問題がなければ、データベースより抽出した情報が表示されます。


設定ファイルを外出し

設定ファイルの設定情報は外出しできます。
環境により値が変わるような項目は外出しすると管理が楽になります。

Spring用の設定ファイル(SpringTest.xml)
				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<bean id="helloWorld" class="spring.test.SpringBean">
	</bean>

	<context:component-scan base-package="spring.test" />

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	<context:property-placeholder location="file:C:\\workspace\\springApp\\jdbc.properties"/>

	<bean class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource" />
	</bean>
</beans>


			
外部ファイルは property-placeholder 要素で指定します。外部ファイルの場所は location属性で指定します。

file:~でファイルパスで指定しますが、classpath:~とするとクラスパスで指定できます。
とりあえず動かすためにfile:~を使いましたが、実際は classpath:~ の方がよく使われます。

置き換える情報は${~}で指定します。


外部ファイル(jdbc.properties)
				
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/postgres
jdbc.username=postgres
jdbc.password=ps


			
こちらはそのまま指定します。


コネクションプール

上で使用したDriverManagerDataSourceはテスト用らしいので、コネクションプールが使えるライブラリに変えてみます。

pom.xml
				
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>springTest</groupId>
	<artifactId>springTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<release>17</release>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.3.22</version>
		</dependency>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>42.5.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.9.0</version>
		</dependency>
	</dependencies>
</project>

			
新たに org.apache.commons の commons-dbcp2 を追加しています。


Spring用の設定ファイル(SpringTest.xml)
				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<bean id="helloWorld" class="spring.test.SpringBean">
	</bean>

	<context:component-scan base-package="spring.test" />

	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxTotal" value="${jdbc.maxTotal}" />
	</bean>

	<context:property-placeholder location="file:C:\\workspace\\springApp\\jdbc.properties"/>

	<bean class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource" />
	</bean>
</beans>

			
データソースのライブラリを org.apache.commons.dbcp2.BasicDataSource に変更しています。

またせっかくなので最大接続数(maxTotal)も変えています。
※前のバージョンでは MaxActive という項目でした。実行時にエラーになるようであれば変更するなり削除して下さい。

最大接続数は適当に10としました。環境に合わせて変えて下さい。
				
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/postgres
jdbc.username=postgres
jdbc.password=ps
jdbc.maxTotal=10


			
実行時の画像は貼りませんが、見た目の動作は上の例と同じ動きをします。

ページのトップへ戻る