mybatis를 통한 Select, Insert, Delete

과거에 mybatis 라이브러리 사용하기라는 제목으로 mybatis를 이용하기 위한 프로젝트 설정과 간단한 SELECT 문을 호출해 그 결과를 살펴보았습니다. 이번에 실제 프로젝트에 mybatis를 사용하기로 결정하여 좀더 구체적인 SQL 문을 호출하는 API를 파악하여 정리해 봅니다.

먼저 사용하는 테이블의 구조는 다음과 같습니다. (헐! 그림 대따 크게 표시되네.. -_-;)

앞서 언급해 드린 mybatis 라이브러리 사용하기를 통해 프로젝트를 구성하고, SQL 문을 정의하는 sql.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="test">
    <select id="getFirstPlayerName" resultType="string">
        SELECT name FROM players LIMIT 1
    </select>
    
    <select id="getFirstPlayer" resultType="map">
        SELECT name, age FROM players LIMIT 1
    </select>
    
    <select id="getPlayers" resultType="map">
        SELECT name, age FROM players
    </select>
    
    <select id="getPlayersWhere" resultType="map">
        SELECT name, age FROM players WHERE age > #{age}
    </select>
    
    <select id="getPlayersWhere2" resultType="map">
        SELECT name, age FROM players WHERE age > #{age} AND name LIKE #{name}
    </select>
    
    <insert id="insertPlayer"> 
    	INSERT INTO players (name, age) VALUES (#{name}, #{age}) 
    </insert>
    
    <delete id="deletePlayerWhere"> 
    	DELETE FROM players WHERE name = #{name} 
    </insert>    
</mapper>

보시는 것처럼 SELECT 문에 대한 getFirstPlayerName, getFirstPlayer, getPlayers, getPlayersWhere, getPlayersWhere2과 INSERT 문에 대한 insertPlayer, DELETE 문에 대한 deletePlayerWhere가 정의되어 있습니다. 이 7개에 대한 SQL문을 실행하는 API의 설명을 통해 mybatis에서 SELECT, INSERT, DELETE 문의 호출을 정리해 보겠습니다.

먼저 getFirstPlayerName은 테이블의 첫번째 Row에 대한 name 필드값을 가져오는 것인데, 관련된 API는 다음과 같습니다. 반환값이 string이고 반환결과는 1건 이하이므로 String과 SqlSession 객체의 selectOne 함수를 사용합니다.

String result = session.selectOne("test.getFirstPlayerName");
// 홍길동

다음은 getFirstPlayer인데, 반환결과는 역시 1건 이하인데 반환 필드가 name과 age로 2개입니다. API는 다음과 같습니다.

Map result = session.selectOne("test.getFirstPlayer");
 // {name=홍길동, age=18}

다음은 getPlayers로 반환 결과는 0건 이상이며 API는 다음과 같습니다.

List<Map<String, Object>> result = session.selectList("test.getPlayers");
// [{name=홍길동, age=18}, {name=임꺽정, age=32}, {name=일지매, age=21}]

getPlayersWhere는 조건 결과가 지정된 것으로 사용하는 API는 다음과 같습니다.

List<Map<String, Object>> result = session.selectList("test.getPlayersWhere", 20);
// [{name=임꺽정, age=32}, {name=일지매, age=21}]

getPlayersWhere2는 getPlayersWhere처럼 조건이 지정되어 있지만 비교 조건으로 사용되는 변수가 2개입니다. 사용하는 API는 다음과 같습니다.

Map param = new HashMap<>(); 
param.put("age", 20); 
param.put("name", "일%");

List<Map<String, Object>> result = session.selectList("test.getPlayersWhere2", param);
// [{name=일지매, age=21}]

insertPlayer는 데이터를 추가하는 것으로 API는 다음과 같습니다.

Map<String, Object> param = new HashMap<>(); 
param.put("age", 41); 
param.put("name", "황장군");

int result = session.insert("test.insertPlayer", param); // 1
session.commit();

deletePlayerWhere는 지정된 조건과 매칭되는 데이터를 삭제하는 것으로 사용하는 API는 다음과 같습니다.

Map<String, Object> param = new HashMap<>(); 
param.put("name", "황장군");

int result = session.delete("test.deletePlayerWhere", param);  // 1
session.commit();

mybatis는 별도의 xml 파일을 통해 SQL 문의 정의 부분을 독립적으로 유지할 수 있으며, SQL문을 보다 유연하게 처리할 수 있다는 문법 구문을 제공합니다. 또한 mybatis는 데이터베이스 연결시 발생하는 부하를 줄이기 위한 Connection Pool을 자체적으로 제공하고 있습니다. 이외에 JDBC를 직접 사용함에 따라 발생하는 복잡한 try .. catch .. finally 코드 부분이 제거되어 코드의 가독성이 향상됩니다.

“mybatis를 통한 Select, Insert, Delete”에 대한 2개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다