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)