본 튜터리얼은 사내 직원 교육용으로 만든 것으로 초급 자바 개발자들이 쉽게 iBATIS를 이용하여 개발하도록 하여 좀 더 나은 품질의 코드와 제품을 생산할 수 있도록 하기 위한 바램으로 작성한 자료이다. 즉, 고급 기술 및 상세 기능은 배제를 하였음을 미리 밝힌다.

8. SqlMap에서의 데이터 조회
  데이터를 입력을 해봤으니 입력된 데이터를 출력할 수 있도록 조회용 코드를 작성하도록 하겠다. 조회는 일반적으로 1건 조회와 여러건 조회로 나뉠 수 있는데, 여러건 조회는 페이징 문제도 포함하고 있어 1건 조회에 비해 다소 복잡하다 하겠다.

  먼저, 입력된 사원 1명의 정보를 조회하는 기능을 구현해보고 1건 이상의 조회하는 기능을 구현해 보도록 한다.

  1건 조회는 경우에 따라 필수 컬럼만 조회 컬럼으로 지정할 수 있지만 지금은 컬럼의 수가 많지 않고 모두 필수 컬럼에 속하므로 전체를 조회하는 SQL을 구현한다. 1건을 조회한다는 의미는 고유 번호(일련번호, 주민등록번호...)로 조회한다고 보면 되겠다. 여기서는 사원 테이블이므로 PK인 사원번호(emp_no)를 대상으로 조회하겠다.

SELECT emp_no, emp_name, hire_date, dept_no
FROM emp
WHERE emp_no=?

  위 SQL은 emp 테이블을 조회하는 JDBC에서 사용했던 쿼리이다. 이를 iBATIS의 SqlMap에 넣으려면 다음과 같이 작성하면 된다.

<!-- 사원테이블에 사원 정보 1건 조회 -->
<select id="findByPrimaryKey" parameterClass="int" resultClass="ibatis.sample01.model.Emp">
SELECT emp_no AS empNo, emp_name AS empName, hire_date AS hireDate, dept_no AS deptNo
FROM emp
WHERE emp_no=#value#
</select>

  파라미터 값이  #value#로 바뀌는 것 이외에는 차이가 없다. 여기서 조회되는 정보는 Emp 클래스로 매핑되어 결과를 얻게될 것이다. 위 SqlMap 요소를 지난 번에 생성한  emp.xml에 추가하면 된다. SqlMap 작성시 parameterClass와 resultClass는 주의깊게 작성해야 한다. 여기서 잘못 작성하면 디버깅하기가 곤란해지는 상황이 오기도 한다.  JUNIT 또는 간단한 테스트 코드를 이용하여 CRUD를 넣을 때마다 테스트 해보는 것이 추후 디버깅 시간을 줄일 수 있을 것이다.

  이제는 SqlMap 설정을 이용하는 웹인터페이스와 컨트롤러를 작성한다.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form method="post" action="select_emp.jsp">
    <p>사원번호: <input type="text" name="emp_no" /></p>
    <p><input type="submit" value="전송" /></p>
    </form>
</body>
</html>


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.io.Reader"%>
<%@page import="ibatis.sample01.model.Emp"%>
<%@page import="com.ibatis.sqlmap.client.SqlMapClientBuilder"%>
<%@page import="java.io.IOException"%>
<%@page import="com.ibatis.sqlmap.client.SqlMapClient"%>
<%@page import="com.ibatis.common.resources.Resources"%>
<%
SqlMapClient sqlMapClient = null;

Reader reader = Resources.getResourceAsReader("ibatis/sample01/sqlmap/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();

request.setCharacterEncoding("UTF-8");

String empName = request.getParameter("name");

int empNo = Integer.parseInt(request.getParameter("emp_no"));

Emp emp = (Emp)sqlMapClient.select("selectEmp", new Integer(empNo));
%>
사원번호:<%=emp.empNo%><br />
사원명:<%=emp.empName%><br />

  예를들기 위한 예제일 뿐이며 실무에서 이런 인터페이스가 필요할 경우는 거의 없을 것이다. 단, pk로 데이터를 요청하는 루틴은 많이 사용되므로 PK를 이용한 조회는 미리 구현해두는 것이 좋겠다.