JAVA 자료구조 [MyBatis] 검색 SELECT

2020.09.24 21:50

졸리운_곰 조회 수:142

[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에 지정할 수 있는 값

 

 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

매개 변수

단일 매개변수(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 [프로그램 개발 지식 공유]

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
141 [java] [MyBatis] #{} 와 ${} 개념과 차이점 졸리운_곰 2020.12.11 191
140 [java, mybatis] MyBatis에서 샾(#{})과 달러(${})의 차이는 무엇일까? 졸리운_곰 2020.12.11 190
139 [JAVA] String to int, int to String 형변환 컴퓨터/코딩 졸리운_곰 2020.12.10 188
138 [Java] 현재날짜 구하기 졸리운_곰 2020.12.10 204
137 [Java] [Java] Jackson으로 Json <-> Object 변환(Transformation)하기 졸리운_곰 2020.12.09 279
136 [java] jackson custom serializer, deserializer 만들기 file 졸리운_곰 2020.12.09 235
135 [Java] Deserialize MongoDB date fields to Java POJO Using Jackson 졸리운_곰 2020.12.09 289
134 [Java] Jackson ObjectMapper upper/lower case issues 졸리운_곰 2020.12.09 672
133 Java의 날짜와 시간 API file 졸리운_곰 2020.12.03 257
132 Java로 현재 날짜 / 시간을 얻는 방법 file 졸리운_곰 2020.11.30 625
131 [java, jackson] [jackson] json serialize 만 ignore 하고 싶다면? 졸리운_곰 2020.11.07 196
130 Java MongoDB : Query document 졸리운_곰 2020.11.07 187
129 [Java] Jackson으로 Json <-> Object 변환(Transformation)하기 졸리운_곰 2020.11.07 339
128 [Java, XML, Jackson] Binary JSON with bson4jackson 졸리운_곰 2020.11.07 190
127 [MongoDB, Java] Deserialize MongoDB date fields to Java POJO Using Jackson 졸리운_곰 2020.11.07 173
126 Converting DBObject to Java Object while retrieve values from MongoDB 졸리운_곰 2020.11.07 232
125 [Mybatis] 간단한 마이바티스 CRUD 예제 file 졸리운_곰 2020.09.28 663
» [MyBatis] 검색 SELECT 졸리운_곰 2020.09.24 142
123 Jackson 라이브러리를 이용한 JSON String, Map 간 변환 (How to convert JSON String to Map and Map to JSON String) 졸리운_곰 2020.09.24 245
122 Jackson 라이브러리 기본기능 정리 - json 직렬화와 역직렬화 file 졸리운_곰 2020.09.24 194
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED