티스토리 뷰

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

 

 

 

728x90
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항