MyBatis | SELECT Queries | Parameters
Single parameter
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);
}
}
}
}
Execution 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}
Explanation
- Parameters can be declared with the #{…} format.
- Pass the parameter as an argument after the statement ID (sample.mybatis.selectTest) when executing SQL from SqlSession.
Multiple parameters
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);
}
}
}
}
Execution 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)
Explanation
- When multiple parameters are included, put the values into an instance of some class and pass that instance.
- Define the type of the parameter class in the parameterType attribute of the <select> tag.
- MyBatis obtains values from the instance whose field or property names match the declared parameter names.
- If a getter method exists, the value is obtained through it. Otherwise, it is obtained directly from the field (it appears to work even for private fields).
Passing parameters with Map
You can also use a Map when passing multiple parameters.
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);
}
}
}
}
Execution result
[DEBUG] s.m.selectTest - ==> Preparing: select * from test_table where id=? and value=?
[DEBUG] s.m.selectTest - ==> Parameters: 10(Integer), hogeeee(String)
- Parameters can also be passed with a Map.
- When passing a Map, it works even without setting parameterType on the <select> tag.
Special parameter names
The parameter names below are special parameter names automatically registered by MyBatis and are implicitly valid.
| Parameter name | Condition |
|---|---|
| _parameter | Probably always available |
| collection | When the parameter implements java.util.Collection |
| list | When the parameter implements java.util.List |
| array | When the parameter is an array |
- Where _parameter is set.
- org.apache.ibatis.scripting.xmltags.DynamicContext
- Where collection, list, and array are set.
- org.apache.ibatis.session.defaults.DefaultSqlSession#wrapCollection(Object)