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タグになります。
ページのトップへ戻る