MyBatis | 검색 SELECT | 매개 변수
단일 매개변수(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);
}
}
}
}
실행 결과
[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) 다음에 인수로 전달한다.
복수 매개변수(parameter)
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, arrary를 설정하는 위치.
- org.apache.ibatis.session.defaults.DefaultSqlSession#wrapCollection(Object)
최종 수정 : 2021-08-26