トッカンソフトウェア

SpringFrameworkでJdbcTemplateを使ってみる(Javaアプリケーション)

前回は、JdbcTemplateを使って単純にSELECTしただけだったので、今回は色々やります。


いろいろな形でデータを受け取る

前回は queryForList を使用し、処理結果をリストで受け取りましたが、他にもqueryForObject、queryForMapなどがあります。
				
// 前回使用したメソッドです。取得結果をListで返します。
List<Map<String, Object>> ret = jdbcTemplate.queryForList("select * from m_user");

// 取得結果をMapで返します。取得レコードが1以外の場合、エラーになります。
Map<String, Object> map = jdbcTemplate.queryForMap("select * from m_user where id='0001'");

// 取得結果を指定したクラスで返します。
int count = jdbcTemplate.queryForObject("select count(*) from m_user", Integer.class);

// 自動でマップを行う
String sql = "select id, name, attr1, attr2 from m_user where id = ? ";
RowMapper<MUser> rowMapper = new BeanPropertyRowMapper<MUser>(MUser.class);

List<MUser> users = jdbcTemplate.query(sql, rowMapper, "0001");

			

(参考)
?で指定したパラメータをlogbackでログ出力するには以下のようにStatementCreatorUtilsをTRACEで出力します。

<logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE" additivity="false">
	<appender-ref ref="FILE" />
	<appender-ref ref="STDOUT" />
</root>


マッパーを作る

SQL実行時にRowMapperクラスのオブジェクトを引数で渡すと、取得結果を引数としたmapRowメソッドが呼び出されます。
戻り値の型をジェネリクスで指定できます。
				
List<String[]> list = jdbcTemplate.query("select * from m_user", new RowMapper<String[]>() {
	public String[] mapRow(ResultSet rs, int rowNum) throws SQLException {
		String[] strs = new String[2];
		strs[0] = rs.getString("id");
		strs[1] = rs.getString("name");
		return strs;
	}
});


			

動かしてみましょう(SELECT)

データの受け取りは前回でサンプル作ったので、今回はマッパーを使うサンプルを作ります。

pom.xml、SpringTest.xml、HelloWorldTest.javaは前回と同じです。

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>
	</dependencies>
</project>
				

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>


			

実行対象となる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)
				
package spring.test;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

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

public class SpringBean {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void show() {

		List<MUser> list = jdbcTemplate.query("select * from m_user", new RowMapper<MUser>() {
			public MUser mapRow(ResultSet rs, int rowNum) throws SQLException {
				MUser user = new MUser();
				user.setId(rs.getString("id"));
				user.setName(rs.getString("name"));
				return user;
			}
		});
		for (MUser user : list) {
			System.out.println(user.getId() + "-" + user.getName());
		}
	}
}


			
最初に書いたサンプルでは文字配列を使いましたが、実際に使われるときは上記のようにオブジェクトにセットすることが多いと思います。
データクラスはgetter、setterのみで作りました。

データクラス(MUser.java)
				
package spring.test;

public class MUser {
	private String id;
	private String name;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


			

データを更新してみる

次は更新系(INSERT、UPDATE、DELETE)をやってみます。

JdbcTemplateではすべてupdateメソッドを使用します。
				
// 新規追加
jdbcTemplate.update("insert into m_user(id, name) values(? , ?)", user.getId(), user.getName());

// 更新
jdbcTemplate.update("update m_user set name = ? where id = ?", user.getId(), user.getName());

// 削除
jdbcTemplate.update("delete from m_user where id = ?", user.getId());


			

動かしてみましょう(INSERT、UPDATE、DELETE)

pom.xml、SpringTest.xml、MUser.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.insertUpdate();
		bean.show();
		bean.delete();
		bean.show();

		context.close();
	}
}


			
追加、更新メソッドを呼び出した後に全データを表示、削除メソッドを呼び出したに後にもう一度、全データを表示しています。

設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)
				
package spring.test;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

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

public class SpringBean {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void insertUpdate() {
		MUser user = new MUser();

		System.out.println("追加します");
		user.setId("0005");
		user.setName("新規追加");
		jdbcTemplate.update("insert into m_user(id, name) values(? , ?)", user.getId(), user.getName());

		System.out.println("更新します");
		user.setName("更新");
		jdbcTemplate.update("update m_user set name = ? where id = ?", user.getName(), user.getId());
	}

	public void delete() {
		System.out.println("削除します");
		MUser user = new MUser();
		user.setId("0005");
		jdbcTemplate.update("delete from m_user where id = ?", user.getId());
	}

	public void show() {

		List<MUser> list = jdbcTemplate.query("select * from m_user", new RowMapper<MUser>() {
			public MUser mapRow(ResultSet rs, int rowNum) throws SQLException {
				MUser user = new MUser();
				user.setId(rs.getString("id"));
				user.setName(rs.getString("name"));
				return user;
			}
		});
		for (MUser user : list) {
			System.out.println(user.getId() + "-" + user.getName());
		}
	}
}


			
insertUpdateメソッドでINSERTしたデータをUPDATEして、deleteメソッドでDELETEを実行しています。


それでは実行してみましょう。


ページのトップへ戻る