トッカンソフトウェア

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

DBアクセスJdbcTemplateとやってきましたが、今回はMyBatisをやります。

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


設定ファイルなし、検索条件なしのSELECT

最初に設定ファイルなし、検索条件なしの単純なSELECTを動作をやってみます。

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.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.10</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.7</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.4.0</version>
		</dependency>
	</dependencies>
</project>
				
logbackはなくてもmybatisは動作しますが、logbackがあるとSQLのログを出してくれるので、デバッグしやすいです。

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 id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<bean class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="spring.test.UserMapper" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>
</beans>

			

UserMapper.java

				
package spring.test;

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

import org.apache.ibatis.annotations.Select;

public interface UserMapper {

	@Select("SELECT id, name FROM m_user")
	List<Map<String, String>> getUserMap();
}

			

SpringBean.java

				

package spring.test;

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

import org.springframework.beans.factory.annotation.Autowired;

public class SpringBean {

	@Autowired
	UserMapper mapper;

	public void show() {

		List<Map<String, String>> retMap = mapper.getUserMap();
		for (Map<String, String> map : retMap) {
			System.out.println(map.get("id") + "+" + map.get("name"));
		}
	}
}

			

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();
	}
}

			

m_userテーブル

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


			
実行イメージ











設定ファイルあり、検索条件なしのSELECT

SQLをアノテーションではなく、SQL設定ファイルより取得してみます。

pom.xml

変更なし

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

	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory" />
	</bean>

	<bean class="spring.test.UserDaoImpl">
		<property name="session" ref="sqlSession" />
	</bean>
</beans>

			
mapperLocationsでSQL設定ファイルを指定しています。今回はフルパスを指定しましたが、通常はクラスパスからの
相対パスを指定します。


クラスパスから指定する場合
				
■1ファイルを指定					
<property name="mapperLocations"
			value="classpath:/spring/test/sql.xml" />
■複数ファイルを指定
<property name="mapperLocations"
			value="classpath*:/spring/**/*.xml" />


			

MyBatisのSQL設定ファイル(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="test.sql">
	<select id="selectUser" resultType="spring.test.User">
		select id,name from m_user
	</select>
</mapper>


			
Javaソースからは namespace + . + id で指定されます。

実装ファイルなしでインターフェースのみで動かす場合、namespaceに該当インターフェースのパッケージ名を含めたクラス名を指定します。 詳細はMyBatis⑤ DaoのImplなしを参照ください。

User.java

				
package spring.test;

public class User {

	String id;
	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;
	}
}


			

UserDao.java

				
package spring.test;

import java.util.List;

public interface UserDao {
	public List<User> getUserList();
}


			

UserDaoImpl.java

				
package spring.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

public class UserDaoImpl implements UserDao {

	private SqlSession session;

	public void setSession(SqlSession ss) {
		this.session = ss;
	}

	public List<User> getUserList() {
		return session.selectList("test.sql.selectUser");
	}
}

			
Springの機能より session に SqlSessionTemplate が注入されます。

SpringBean.java

				

package spring.test;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

public class SpringBean {

	@Autowired
	private UserDao dao;

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

			
Springの機能より dao に UserDaoImpl が注入されます。

HelloWorldTest.java

変更無し

m_userテーブル

変更無し


実行イメージ
実行イメージ


フォルダ構成は以下になります。











戻り値がList<Map<String, Object>>のSELECT

MyBatisのSQL設定ファイル(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="test.sql">
	<select id="selectUser" resultType="map">
		select id,name from m_user
	</select>
</mapper>


			

UserDao.java

				
package spring.test;

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

public interface UserDao {
	List<Map<String, Object>> getUserList();
}


			

UserDaoImpl.java

				
package spring.test;

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

import org.apache.ibatis.session.SqlSession;

public class UserDaoImpl implements UserDao {

	private SqlSession session;

	public void setSession(SqlSession ss) {
		this.session = ss;
	}

	public List<Map<String, Object>> getUserList() {
		return session.selectList("test.sql.selectUser");
	}
}

			

SpringBean.java

				
package spring.test;

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

import org.springframework.beans.factory.annotation.Autowired;

public class SpringBean {

	@Autowired
	private UserDao dao;

	public void show() {

		List<Map<String, Object>> list = dao.getUserList();

		for (Map<String, Object> map : list) {
			for (String key : map.keySet()) {
				System.out.print("\t" + key);
			}
			System.out.println("");

			for (String key : map.keySet()) {
				System.out.print("\t" + map.get(key));
			}
			System.out.println("");
		}
	}
}

			
実行イメージ











DaoのImplなし(Daoはインターフェースのみ定義)

MyBatis⑤ DaoのImplなしを参照下さい。



ページのトップへ戻る