- 전체
- JAVA 일반
- JAVA 수학
- JAVA 그래픽
- JAVA 자료구조
- JAVA 인공지능
- JAVA 인터넷
- Java Framework
- Java GUI (AWT,SWING,SWT,JFACE)
- SWT and RCP (web RAP/RWT)[eclipse], EMF
JAVA 자료구조 [MyBatis] 검색 SELECT
2020.09.24 21:50
[MyBatis] 검색 SELECT
데이터 검색인 SELECT에 대해 알아본다.
여러 개의 결과 얻기
소스 코드
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
</select>
</mapper>
Main.java
package sample.mybatis;
import java.io.InputStream;
import java.util.List;
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()) {
List<Map<String, Object>> result = session.selectList("sample.mybatis.selectTest");
System.out.println(result);
}
}
}
}
실행 결과
[{id=1, value=fizz}, {id=2, value=buzz}]
설명
- 검색용 SQL은 <select> 태그로 선언한다.
- id 속성에 해당 SQL을 참조하는 이름을 설정한다.
- resultType 속성에 검색 결과의 레코드를 어떤 형태로 매핑하는 방법을 정의한다.
- 여기에서 map을 지정하고 있기 때문에, Map 형태로 변환된다.
- 검색 결과가 여러 레코드를 반환하는 경우 SqlSession의 selectList () 메소드를 사용한다.
- 반환 값은 List 형이 된다.
한개의 결과 얻기
소스 코드
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 limit 1
</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");
System.out.println(result);
}
}
}
}
실행 결과
{id=1, value=fizz}
설명
- 검색 결과가 1건으로 단일 객체 얻는 경우라면, selectOne() 메소드를 사용한다.
- 만약 검색 결과가 여러 레코드를 반환된다면, TooManyResultsException이 발생된다.
- 검색 결과가 0건의 경우는 null이 반환된다.
resultType에 지정할 수 있는 값
resultType에는 검색 결과를 Java의 어떤 형태로 변환할 것인지를 설정한다.
일반적으로 java.util.Map과 같이 변환 되는 클래스의 FQCN(Fully Qualified Class Name)를 지정한다.
그러나, 일부 자주 이용하는 형태에 대해서는 미리 별칭(alias)이 정의되어 짧은 이름으로 지정할 수 있다.
이하는, org.apache.ibatis.type.TypeAliasRegistry에서 추출하였다.
| 별칭(alias) | 데이터 형태(data type) |
|---|---|
| string | String |
| date | Date |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| biginteger | BigInteger |
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| _byte[] | byte[] |
| _long[] | long[] |
| _short[] | short[] |
| _int[] | int[] |
| _integer[] | int[] |
| _double[] | double[] |
| _float[] | float[] |
| _boolean[] | boolean[] |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| byte[] | Byte[] |
| long[] | Long[] |
| short[] | Short[] |
| int[] | Integer[] |
| integer[] | Integer[] |
| double[] | Double[] |
| float[] | Float[] |
| boolean[] | Boolean[] |
| object | Object |
| date[] | Date[] |
| decimal[] | BigDecimal[] |
| bigdecimal[] | BigDecimal[] |
| biginteger[] | BigInteger[] |
| object[] | Object[] |
| collection | Collection |
| iterator | Iterator |
| ResultSet | ResultSet |
원시형의 경우는 언더스코어(_)를 앞에 붙인다. 붙이지 않는 경우는 래퍼 클래스 되므로 주의하자.
별칭 정의하기
별칭은 임의로 정의할 수 있다.
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="foo.bar.Hoge" alias="Hoge" />
</typeAliases>
...
</configuration>
- 메인 쪽의 설정 파일(mybatis-config.xml)에 <typeAlias> 태그로 선언할 수 있다.
패키지를 지정하여 별칭 정의하기
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="foo.bar"/>
</typeAliases>
...
</configuration>
- <package> 태그를 사용하여 패키지 단위로 별칭을 정의할 수 있다.
- 이 경우 클래스 이름이 그대로 별칭이 된다.
매개 변수
단일 매개변수(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)
출처: https://araikuma.tistory.com/475 [프로그램 개발 지식 공유]
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 1 |
numerical analysis with java examples - turhancoban.com.pdf
| 졸리운_곰 | 2016.06.07 | 512 |

