トッカンソフトウェア

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

今回はsqlファイルでResult Mapsを使ってみます。

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


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" resultMap="userResultMap">
		select
		  m_user.id
		  , m_user.name
		  , m_attr1.val1
		  , m_attr2.val2 
		from
		  m_user 
		  left outer join m_attr1 
		    on m_user.attr1 = m_attr1.attr1 
		  left outer join m_attr2 
		    on m_user.attr2 = m_attr2.attr2 
		where
		  m_user.id = '1'
	</select>

	<resultMap id="userResultMap" type="spring.test.User">
		<id property="id" column="id" />
		<result property="name" column="name" />
		<association property="attr1" javaType="spring.test.Attr1">
			<result property="val1" column="val1" />
		</association>
		<collection property="attr2" ofType="spring.test.Attr2">
			<result property="val2" column="val2" />
		</collection>
	</resultMap>
</mapper>


			

User.java

				
package spring.test;

import java.util.List;

public class User {

	String id;
	String name;
	Attr1 attr1;
	List<Attr2> attr2;

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

	public Attr1 getAttr1() {
		return attr1;
	}

	public void setAttr1(Attr1 attr1) {
		this.attr1 = attr1;
	}

	public List<Attr2> getAttr2() {
		return attr2;
	}

	public void setAttr2(List<Attr2> attr2) {
		this.attr2 = attr2;
	}
}

class Attr1 {
	String val1;

	public String getVal1() {
		return val1;
	}

	public void setVal1(String val1) {
		this.val1 = val1;
	}
}

class Attr2 {
	String val2;

	public String getVal2() {
		return val2;
	}

	public void setVal2(String val2) {
		this.val2 = val2;
	}

}


			

UserMapper.java

				
package spring.test;

import java.util.List;

public interface UserMapper {

	public List<User> getUserList();

}


			

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 show() {

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

			

テーブル定義

				
create table m_user (
  id character varying(8) not null
  , name character varying(16)
  , attr1 character varying(16)
  , attr2 character varying(16)
  , primary key (id)
);

create table m_attr1 (
  attr1 character varying(16)
  , val1 character varying(16)
  , primary key (attr1)
);

create table m_attr2 (
  attr2 character varying(16)
  , seq character varying(16)
  , val2 character varying(16)
  , primary key (attr2, seq)
);

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

resultMapでSQLの実行結果でマッピングを指定することができます。

idタグでキー項目を指定します。指定しなくても良いのですが、指定した方がパフォーマンスが良いらしいです。

キー項目が複数の場合、idタグを複数使用します。

resultタグでキー以外の項目を指定します。

クラスの属性に他のクラスを保つ場合、associationタグを使用します。

クラスの属性にリストを保つ場合、collectionタグを使用します。
				
<constructor>
   <idArg column="id" javaType="String"/>
   <arg column="name" javaType="String"/>
</constructor>

			
コンストラクタでは、idタグ→idArgタグ、resultタグ→argタグになります。


ページのトップへ戻る