티스토리 뷰
1. 마이바틱스가 SQL을 관리하는 방식
- 1 ) SQL Mapper XML 파일 방식 (***)
- 2 ) Mapper Interface 활용 방식
- + 1번과 2번을 함께 사용할 수도 있다.
[ 1. 마이바틱스 연습 - selectOne(sqlMapper, #{ 값 지정 }) ] (****)
[ 1 - 1. Mapper.xml 수정 - selectOne에 해당하는 sql 추가 ]
<?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="BoardMapper">
<!-- CRUD의 기본적인 태그를 지니고 있다. -->
<!-- 태그의 id는 주로 실행시킨 메소드의 이름을 그대로 사용한다. (맘대로 작성해도 ok) -->
<!-- id의 값은 유니크해야 한다. -->
<!-- resulType은 반환될 구체타입을 지정해 주면 된다. : List타입을 반환하지만 실제로는 List<BoardVO>이기에 BoardVO의 FQCN을 지정해주면 된다. -->
<!-- 즉, List<E>를 반환한다면 resulType에 <E>를 지정해 주면 된다. -->
<!-- 1. 전체 게시물 목록을 조회하는 쿼리 등록 -->
<select id="selectAllBoards" resultType="org.zerock.myapp.domain.BoardVO">
SELECT * FROM tbl_board
</select>
<!-- 2. 특정 게시글 하나만 조회하는 쿼리 등록 -->
<select id="selectBoard" resultType="org.zerock.myapp.domain.BoardVO">
SELECT bno, title, content, writer, insert_ts, update_ts FROM tbl_board WHERE bno = #{bno}
</select>
<!-- #{bno}는 ?와 같은 기능을 한다. ( 값을 나중에 지정해 줄 수 있다. ) -->
<!-- 값 지정은 selectList나 selectOne에서 해줘야 한다. -->
<!-- <insert id=""></insert> -->
<!-- <update id=""></update> -->
<!-- <delete id=""></delete> -->
</mapper>
[ + 추가된 부분 ]
<!-- 2. 특정 게시글 하나만 조회하는 쿼리 등록 -->
<select id="selectBoard" resultType="org.zerock.myapp.domain.BoardVO">
SELECT bno, title, content, writer, insert_ts, update_ts FROM tbl_board WHERE bno = #{bno}
</select>
<!-- #{bno}는 ?와 같은 기능을 한다. ( 값을 나중에 지정해 줄 수 있다. ) -->
<!-- 값 지정은 selectList나 selectOne에서 해줘야 한다. -->
[ 1 - 2. SqlSessionTest 파일 수정 - selectOne()을 수행하는 메소드 추가 ]
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.Timeout;
import org.zerock.myapp.domain.BoardVO;
import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionTests2 {
private SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
// ======================================================
// 1. 사전처리로 마이바틱스 설정을 기반으로 SqlSessionFactory 객체 생성 @BeforeAll
// ======================================================
@BeforeAll
void beforeAll() throws IOException {
log.trace("beforeAll() invoked.");
// 마이바틱스 설정 파일
String myBatisConfigXml = "mybatis-config.xml";
@Cleanup
InputStream is = Resources.getResourceAsStream(myBatisConfigXml);
Objects.requireNonNull(is);
this.sqlSessionFactory = builder.build(is);
} // beforeAll
// ======================================================
// 2. SQL을 실행할 메소드 생성 - selectAllBoards ( SELECT문 )
// ======================================================
// @Disabled
@Test
@Order(1)
@DisplayName("2. selectAllBoards")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectAllBoards() {
log.trace("selectAllBoards() invoked.");
// SqlSessionFactory 객체에서 SqlSession 얻기
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// ======================================================
// 2 - 1. SQL 문장 처리를 프레임워크에 의뢰
// ======================================================
try ( sqlSession; ) {
// ====================================
// 아래의 2가지가 많이 사용된다.
// 1. 반환되는 결과가 1개일때
// sqlSession.selectOne(sql);
// 2. 반환되는 결과가 0개 이상일때
// sqlSession.selectList(sql);
// ====================================
// ==================================================================
// String sql = "SELECT * FROM tbl_board"; <--- Mapper.xml로 이동
// 마이바틱스에서 실행시킬 sql문장은 Mapper.xml에서 보관한다.
// ==================================================================
// 마이바틱스가 요구하는 규칙 ( 수행시킬 SQL문장을 지정하는 방식 ) :
// 1) 각 SQL Mapper XML 파일 안의 namespace 속성마다 고유한 값을 가져야 한다.
// 2) 각 SQL Mapper XML 파일 안에 저장된 각 SQL 태그마다 고유한 id값을 가져야 한다.
// + 주로 id값은 일반적으로 SQL을 수행할 메소드의 이름과 동일하게 작성한다.
// + 하지만 필수요구사항은 아니기에 개발자가 원하는대로 id값을 작성해도 된다. ( 단, 고유해야 한다. )
// ==================================================================
// 이 규격을 지켜야 한다.
String namespace ="BoardMapper";
String sqlId = "selectAllBoards";
String sql = namespace + "." + sqlId; // Unique Identifier
List<BoardVO> list = sqlSession.selectList(sql);
// List<BoardVO> list = sqlSession.<BoardVO>selectList(sql);
assertNotNull(list);
// 마이바틱스에서 실행시킬 sql문장은 Mapper.xml에서 보관한다.
list.forEach(log::info);
} // try - with - resources
} // selectAllBoards
// ==================================================================
// @Disabled
@Test
@Order(2)
@DisplayName("selectBoard")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectBoard() {
log.trace("selectBoard() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try ( sqlSession; ){
// String namespace = "BoardMapper";
// String sqlId = "selectBoard";
// String sql = namespace + sqlId;
String sql = "BoardMapper.selectBoard"; // (***)
// Mapper에서 작성한 #{bno}의 값을 지정해 준다.
// #{}는 ?와 같은 기능을 한다.
int bno = 7;
// 하나만 반환할 때에는 selectOne을 사용한다.
BoardVO vo = sqlSession.selectOne(sql, bno);
// BoardVO vo = sqlSession.<BoardVO>selectOne(sql);
assert vo != null;
log.info("\t + vo : {}",vo);
} // try - with - resources
} //selectAllBoard
} // end class
[ + 추가된 부분 ]
// @Disabled
@Test
@Order(2)
@DisplayName("selectBoard")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectBoard() {
log.trace("selectBoard() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try ( sqlSession; ){
// String namespace = "BoardMapper";
// String sqlId = "selectBoard";
// String sql = namespace + sqlId;
String sql = "BoardMapper.selectBoard"; // (***)
// Mapper에서 작성한 #{bno}의 값을 지정해 준다.
// #{}는 ?와 같은 기능을 한다.
int bno = 7;
// 하나만 반환할 때에는 selectOne을 사용한다.
BoardVO vo = sqlSession.selectOne(sql, bno);
// BoardVO vo = sqlSession.<BoardVO>selectOne(sql);
assert vo != null;
log.info("\t + vo : {}",vo);
} // try - with - resources
} //selectBoard
[ 2. 마이바틱스 연습 - #{ }가 여러 개일 때 값 지정 ] (****)
[ 2 - 1. Mapper.xml 수정 - sql 추가 ]
<!-- 3. 특정 게시글 여러개를 조회하는 쿼리 등록 -->
<!-- !CDATA는 #{}와 부등호를 같이 사용할 때 문제가 발생할 수 있는데, 이를 방지해준다. (****) -->
<select id="selectBoardsByTwoCondition" resultType="org.zerock.myapp.domain.BoardVO">
<![CDATA[
SELECT bno, title, content, writer, insert_ts, update_ts
FROM tbl_board
WHERE
bno > #{bno}
AND title > #{title}
]]>
</select>
[ 2 - 2. SqlSessionTest 파일 생성 - 메소드 생성 ]
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.Timeout;
import org.zerock.myapp.domain.BoardVO;
import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionTests3 {
private SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
// ======================================================
// 1. 사전처리로 마이바틱스 설정을 기반으로 SqlSessionFactory 객체 생성 @BeforeAll
// ======================================================
@BeforeAll
void beforeAll() throws IOException {
log.trace("beforeAll() invoked.");
// 마이바틱스 설정 파일
String myBatisConfigXml = "mybatis-config.xml";
@Cleanup
InputStream is = Resources.getResourceAsStream(myBatisConfigXml);
Objects.requireNonNull(is);
this.sqlSessionFactory = builder.build(is);
} // beforeAll
// ======================================================
// 2. SQL을 실행할 메소드 생성 - selectAllBoards ( SELECT문 )
// ======================================================
// #{}가 1개일때
// ======================================================
// @Disabled
@Test
@Order(1)
@DisplayName("selectBoard")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectBoard() {
log.trace("selectBoard() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try ( sqlSession; ){
// String namespace = "BoardMapper";
// String sqlId = "selectBoard";
// String sql = namespace + sqlId;
String sql = "BoardMapper.selectBoard"; // (***)
// Mapper에서 작성한 #{bno}의 값을 지정해 준다.
// #{}는 ?와 같은 기능을 한다.
Integer bno = 7;
// 하나만 반환할 때에는 selectOne을 사용한다.
BoardVO vo = sqlSession.selectOne(sql, bno);
// BoardVO vo = sqlSession.<BoardVO>selectOne(sql);
assert vo != null;
log.info("\t + vo : {}",vo);
} // try - with - resources
} //selectBoard
// ==================================================================
// #{}가 1개 이상일때 (*****)
// ==================================================================
// @Disabled
@Test
@Order(2)
@DisplayName("selectBoardsByTwoCondition")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectBoardsByTwoCondition() {
log.trace("selectBoardsByTwoCondition() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try ( sqlSession; ){
String sql = "BoardMapper.selectBoardsByTwoCondition"; // (***)
// ======================================================
// Mapper에서 작성한 #{bno}와 #{title}의 값을 지정해 준다.
// #{}는 ?와 같은 기능을 한다.
Map<String, Object> params = new HashMap<>();
params.put("bno", 5 );
params.put("title", "TITLE_2");
// ======================================================
List<BoardVO> volist = sqlSession.<BoardVO>selectList(sql, params);
assert volist != null;
volist.forEach(log::info);
} // try - with - resources
} // selectBoardsByTwoCondition
// ==================================================================
} // end class
[ 3. 마이바틱스 연습 - insert문 ] (****)
[ 3 - 1. 새로운 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">
<!-- mappers라는 폴더 밑의 UserMapper이라는 의미이다. -->
<!-- namespace의 명명법은 경로구분자로 .을 사용하고, 마지막 이름을 Mapper 파일명으로 지어주는 것이 관례이다. -->
<mapper namespace="mappers.UserMapper">
<!-- <select id=""></select> -->
<!-- ========================================================================================= -->
<!-- 각 SQL 태그의 id이름의 관례는 이 SQL 문장을 수행시킬 메소드의 이름을 그대로 붙여주는 것이다. -->
<insert id="insertNewUser">
INSERT INTO tbl_user ( userid, userpw, username )
VALUES ( #{userid}, #{userpw}, #{username} )
</insert>
<!-- ========================================================================================= -->
<!-- <update id=""></update> -->
<!-- ========================================================================================= -->
<!-- <delete id=""></delete> -->
<!-- ========================================================================================= -->
</mapper>
[ 3 - 2. 마이바틱스 설정파일인 mybatis-config에 mapper 추가 ]
<!-- 관리할 Mapper 파일 작성해 주기 (***) -->
<!-- Mapper 파일은 여러개일 수 있다. -->
<mappers>
<mapper resource="BoardMapper.xml" />
<mapper resource="mappers/UserMapper.xml" />
</mappers>
[ 3 - 3. SqlSessionTest 파일 생성 - 메소드 생성 ]
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.Timeout;
import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionTests4 { // insert
private SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
// ======================================================
// 1. 사전처리로 마이바틱스 설정을 기반으로 SqlSessionFactory 객체 생성 @BeforeAll
// ======================================================
@BeforeAll
void beforeAll() throws IOException {
log.trace("beforeAll() invoked.");
// 마이바틱스 설정 파일
String myBatisConfigXml = "mybatis-config.xml";
@Cleanup
InputStream is = Resources.getResourceAsStream(myBatisConfigXml);
Objects.requireNonNull(is);
this.sqlSessionFactory = builder.build(is);
} // beforeAll
// ======================================================
// 2. SQL을 실행할 메소드 생성 - insertNewUser ( INSERT문 )
// ======================================================
// @Disabled
@Test
@Order(1)
@DisplayName("insertNewUser")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void insertNewUser() {
log.trace("insertNewUser() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession(false);
// false로 지정하면 오토 커밋을 false로 지정해 준다.
try ( sqlSession; ){
String namespace = "mappers.UserMapper";
String sqlId = "insertNewUser";
String sql = namespace + "." + sqlId; // (***)
// 바인드 변수에 전달할 파라미터 값을 생성하면서,
// 한번에 여러개의 레코드를 INSERT 한다. ( TX는 수동관리 )
for( int i = 2; i <= 10; i++ ) {
Map<String, Object> params = new HashMap<>();
params.put("userid", "USER_" + i);
params.put("userpw", "PASS_" + i);
params.put("username", "NAME_"+ i);
// Map 객체를 파라미터로 전달하면서 Mapped Statement 수행 ( DML )
int insertRows = sqlSession.insert(sql, params);
log.info("\t + insertRows : {}", insertRows);
} // for
sqlSession.commit(); // TCL : ALL or Nothing
log.info("\t + commit");
} catch (Exception e) {
sqlSession.rollback(); // TCL : ALL or Nothing
log.info("\t + Rolled Back");
throw e;
} // try - catch
} // insertNewUser
} // end class
[ 4. 마이바틱스 연습 - 인터페이스 방식의 mapper ] (**)
[ 4 - 1. interface 생성 ]
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.zerock.myapp.domain.BoardVO;
public interface BoardMapper {
@Select("SELECT * FROM tbl_board")
public abstract List<BoardVO> selectAllBoards();
@Select("SELECT bno, title, content, writer, insert_ts, update_ts FROM tbl_board WHERE bno = #{bno}")
public abstract BoardVO selectBoard(@Param("bno") int bno);
// @Param은 int bno에 들어간 값을 #{bno}에 넣어준다는 의미이다. (*****)
} // end class
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.zerock.myapp.domain.UserVO;
public interface UserMapper {
@Select("SELECT userid, userpw, username FROM tbl_user WHERE userid >= #{userid} AND username >= #{username} ")
public abstract List<UserVO> selectUsers (
@Param("userid") String userid,
@Param("username") String username );
} // end class
[ 4 - 2. mybatis 설정 파일에 mapper interface ( 속성 class ) 추가 ]
<!-- 관리할 Mapper 파일 작성해 주기 (***) -->
<!-- Mapper 파일은 여러개일 수 있다. -->
<mappers>
<mapper resource="BoardMapper.xml" />
<mapper resource="mappers/UserMapper.xml" />
<!-- 인터페이스 방식의 Mapper을 등록할 때에는 class 속성을 사용해야 한다.(***) -->
<!-- <mapper class="org.zerock.myapp.mapper.BoardMapper" /> -->
<!-- <mapper class="org.zerock.myapp.mapper.UserMapper" /> -->
<!-- 인터페이스 방식의 Mapper이 만약 페키지 안에 있다면, 이러한 방법으로 패키지를 지정해 줄 수도 있다. -->
<package name="org.zerock.myapp.mapper" />
</mappers>
[ 4 - 3. SqlSessionTest 파일 생성 - 메소드 생성 ]
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.Timeout;
import org.zerock.myapp.domain.BoardVO;
import org.zerock.myapp.domain.UserVO;
import org.zerock.myapp.mapper.BoardMapper;
import org.zerock.myapp.mapper.UserMapper;
import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionTests5 { // 인터페이스 방식
private SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
// ======================================================
// 1. 사전처리로 마이바틱스 설정을 기반으로 SqlSessionFactory 객체 생성 @BeforeAll
// ======================================================
@BeforeAll
void beforeAll() throws IOException {
log.trace("beforeAll() invoked.");
// 마이바틱스 설정 파일
String myBatisConfigXml = "mybatis-config.xml";
@Cleanup
InputStream is = Resources.getResourceAsStream(myBatisConfigXml);
Objects.requireNonNull(is);
this.sqlSessionFactory = builder.build(is);
} // beforeAll
// ======================================================
// 2. SQL을 실행할 메소드 생성 - selectAllBoardsByMapperInterface ( SELECT 문 )
// ======================================================
// @Disabled
@Test
@Order(1)
@DisplayName("selectAllBoardsByMapperInterface")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectAllBoardsByMapperInterface() {
log.trace("1. selectAllBoardsByMapperInterface() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// Mapper Interface 방식을 이용한 SQL문장 처리
try ( sqlSession; ){
// =====================================================================
// 1단계 : 설정파일에 등록된 Mapper Interface의 구현 객체를 획득
// =====================================================================
BoardMapper mapper = sqlSession.<BoardMapper>getMapper(BoardMapper.class);
assertNotNull(mapper);
log.info("\t + 1. mapper : {}", mapper);
// + mapper : org.apache.ibatis.binding.MapperProxy@123456
// Proxy는 대리인이라는 의미로, 이 경우 @Select()에 있는 sql문을 대신 실행시켜준다는 의미이다.
// =====================================================================
// 2단계 : 동적 Proxy 객체를 통해 인터 페이스에 선언된 메소드 호출
// =====================================================================
List<BoardVO> list = mapper.selectAllBoards();
assertNotNull(list);
list.forEach(log::info);
} // try - with - resources
} // selectAllBoardsByMapperInterface
// ======================================================
// 3. SQL을 실행할 메소드 생성 - selectBoardByMapperInterface ( SELECT 문 - #{} )
// ======================================================
// @Disabled
@Test
@Order(2)
@DisplayName("selectBoardByMapperInterface")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectBoardByMapperInterface() {
log.trace("2. selectBoardByMapperInterface() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// Mapper Interface 방식을 이용한 SQL문장 처리
try ( sqlSession; ){
// =====================================================================
// 1단계 : 설정파일에 등록된 Mapper Interface의 구현 객체를 획득
// =====================================================================
BoardMapper mapper = sqlSession.<BoardMapper>getMapper(BoardMapper.class);
assertNotNull(mapper);
log.info("\t + 2. mapper : {}", mapper);
// + mapper : org.apache.ibatis.binding.MapperProxy@123456
// Proxy는 대리인이라는 의미로, 이 경우 @Select()에 있는 sql문을 대신 실행시켜준다는 의미이다.
// =====================================================================
// 2단계 : 동적 Proxy 객체를 통해 인터 페이스에 선언된 메소드 호출
// =====================================================================
BoardVO vo = mapper.selectBoard(33);
assertNotNull(vo);
log.info("\t + 2. vo : {}", vo);
} // try - with - resources
} // selectBoardByMapperInterface
// ======================================================
// 4. SQL을 실행할 메소드 생성 - selectUsers ( SELECT 문 - 0개 이상의 #{} )
// ======================================================
// @Disabled
@Test
@Order(3)
@DisplayName("selectUsers")
@Timeout(value=10, unit=TimeUnit.SECONDS)
void selectUsers() {
log.trace("3. selectUsers() invoked.");
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try ( sqlSession; ){
UserMapper mapper = sqlSession.<UserMapper>getMapper(UserMapper.class);
assert mapper != null;
log.info("\t + mapper : {}", mapper);
List<UserVO> list = mapper.selectUsers("USER_3", "NAME_4");
Objects.requireNonNull(list);
list.forEach(log::info);
} // try - with - resources
} // selectUsers
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 104일차 - mybatis ( 동적 SQL 처리 ) / 쿼츠 (quartz) - 스케줄링 (*****) (0) | 2022.07.26 |
---|---|
KH 103일차 - myBatis마이바틱스 3 ( 검색조건 설정 / 히카리CP ) (*****) (0) | 2022.07.25 |
KH 101일차 - mybatis ( 마이 바틱스 ) (*****) (0) | 2022.07.21 |
KH 100일차 - JSTL (***) (0) | 2022.07.20 |
KH 99일차 - EL / JSTL (*****) (0) | 2022.07.19 |