トッカンソフトウェア

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

今回はトランザクションをやります。

MyBatis⑤の続きなので、先にそちらで環境を構築して下さい。


単純なUPDATE(XMLで設定)

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="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 id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations"
			value="C:\\eclipseee\\workspace\\springTest\\resource\\sql.xml" />
	</bean>

	<bean id="mapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="spring.test.UserMapper" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

	<bean id="helloWorld" class="spring.test.SpringBean">
		<constructor-arg ref="mapper" />
	</bean>

</beans>

			

sql.xml

				
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="spring.test.UserMapper">
	<select id="getUserList" resultType="spring.test.User">
		select id,name from m_user order by id
	</select>
	<update id="updateUser" parameterType="spring.test.User">
		UPDATE M_USER SET NAME = #{name}
		 WHERE ID = #{id}
	</update>
</mapper>


			

UserMapper.java

				
package spring.test;

import java.util.List;

public interface UserMapper {

	public List<User> getUserList();

	public void updateUser(User user);
}


			

SpringBean.java

				
package spring.test;

import java.util.List;

public class SpringBean {

	private final UserMapper userMapper;

	public SpringBean(UserMapper mp) {
		this.userMapper = mp;
	}

	public void update() {
		User user = new User();
		user.setId("test1");
		user.setName("更新前");
		userMapper.updateUser(user);
		System.out.println("更新");
	}

	public void show() {

		List<User> list = userMapper.getUserList();
		for (User user : list) {
			System.out.println(user.getId() + "-" + user.getName());
		}
	}
}

			
pom.xml、User.java、HelloWorldTest.java はMyBatis⑤を見て下さい。

トランザクションの処理と設定追加

Spring設定ファイルに tx:annotation-driven と transactionManager の設定を追加します。

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"
	xmlns:tx="http://www.springframework.org/schema/tx"
	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
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

	<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 id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations"
			value="C:\\eclipseee\\workspace\\springTest\\resource\\sql.xml" />
	</bean>

	<bean id="mapper"
		class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface"
			value="spring.test.UserMapper" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

	<bean id="helloWorld" class="spring.test.SpringBean">
		<constructor-arg ref="mapper" />
	</bean>

	<tx:annotation-driven />

	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

</beans>

			
トランザクション制御をするメソッドに@Transactionalを付けます。

SpringBean.java

				
package spring.test;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

public class SpringBean {

	private final UserMapper userMapper;

	public SpringBean(UserMapper mp) {
		this.userMapper = mp;
	}

	@Transactional(rollbackFor = Exception.class)
	public void update() {
		User user = new User();
		user.setId("test1");
		user.setName("更新後");
		userMapper.updateUser(user);
		System.out.println("更新");

		// Exceptionが発生するとロールバックされる。通常に終わるとコミットされる。
		// String str = null;
		// System.out.println(str.length());
	}

	public void show() {

		List<User> list = userMapper.getUserList();
		for (User user : list) {
			System.out.println(user.getId() + "-" + user.getName());
		}
	}
}

			
トランザクション処理が行われない場合、こちらを確認して下さい。

ページのトップへ戻る