MyBatis | 検索 SELECT | パラメータ
単一パラメータ
sample_mapping.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="sample.mybatis">
<select id="selectTest" resultType="map">
select * from test_table where id=#{id}
</select>
</mapper>
Main.java
package sample.mybatis;
import java.io.InputStream;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
try (SqlSession session = factory.openSession()) {
Map<String, Object> result = session.selectOne("sample.mybatis.selectTest", 1);
System.out.println(result);
}
}
}
}
実行結果
[DEBUG] s.m.selectTest - ==> Preparing: select * from test_table where id=?
[DEBUG] s.m.selectTest - ==> Parameters: 1(Integer)
[DEBUG] s.m.selectTest - <== Total: 1
{id=1, value=fizz}
説明
- #{…}形式でパラメータを宣言できる。
- パラメータはSqlSessionでSQLを実行するとき、Statement ID(sample.mybatis.selectTest)の次の引数として渡す。
複数パラメータ
sample_mapper.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="sample.mybatis">
<select id="selectTest" resultType="map" parameterType="sample.mybatis.MyParameter">
select *
from test_table
where id=#{id}
and value=#{value}
</select>
</mapper>
MyParameter.java
package sample.mybatis;
public class MyParameter {
private int id;
private String value;
public MyParameter(int id, String value) {
this.id = id;
this.value = value;
}
public int getId() {
System.out.println("get id");
return id;
}
}
Main.java
package sample.mybatis;
import java.io.InputStream;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
try (SqlSession session = factory.openSession()) {
MyParameter param = new MyParameter(2, "aaa");
Map<String, Object> result = session.selectOne("sample.mybatis.selectTest", param);
System.out.println(result);
}
}
}
}
実行結果
get id
[DEBUG] s.m.selectTest - ==> Preparing: select * from test_table where id=? and value=?
get id
[DEBUG] s.m.selectTest - ==> Parameters: 2(Integer), aaa(String)
説明
- 複数のパラメータを含む場合は、何らかのクラスのインスタンスに値を入れて、それを渡すようにする。
- パラメータを入れるクラスは、<select>タグのparameterType属性に型を定義する。
- 宣言したパラメータ名と一致するフィールド(プロパティ)の値をインスタンスから取得する。
- Getterメソッドがあればそれを経由し、なければフィールドから直接取得する(privateでも取得されるようである)。
Mapでパラメータを渡す
複数のパラメータを渡す場合は、Mapを使用する方法もある。
sample_mapper.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="sample.mybatis">
<select id="selectTest" resultType="map">
select *
from test_table
where id=#{id}
and value=#{value}
</select>
</mapper>
Main.java
package sample.mybatis;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
try (SqlSession session = factory.openSession()) {
Map<String, Object> param = new HashMap<>();
param.put("id", 10);
param.put("value", "hogeeee");
Map<String, Object> result = session.selectOne("sample.mybatis.selectTest", param);
System.out.println(result);
}
}
}
}
実行結果
[DEBUG] s.m.selectTest - ==> Preparing: select * from test_table where id=? and value=?
[DEBUG] s.m.selectTest - ==> Parameters: 10(Integer), hogeeee(String)
- パラメータはMapでも渡すことができる。
- Mapで渡す場合は、<select>タグのparameterType設定がなくても動作する。
特殊なパラメータ名
以下のパラメータ名は、MyBatisによって自動的に登録される特殊なパラメータ名であり、暗黙的に有効である。
| パラメータ名 | 条件 |
|---|---|
| _parameter | おそらく常に参照可能 |
| collection | パラメータがjava.util.Collectionを実装している場合 |
| list | パラメータがjava.util.Listを実装している場合 |
| array | パラメータが配列の場合 |
- _parameterを設定する場所。
- org.apache.ibatis.scripting.xmltags.DynamicContext
- collection、list、arrayを設定する場所。
- org.apache.ibatis.session.defaults.DefaultSqlSession#wrapCollection(Object)