기존에 ibatis2.5로 구현했던 sample 예제를 mybatis3.1버전을 적용하여 변경한 예제입니다.
이번포스팅에서는 mybatis3.1과 JSP 3.0버전에 대한 간단한 설정및 사용법에 대해 포스팅 할 예정이며
차후에는 mybatis3.1과 spring3.1버전 / mybatis-spring1.1과 spring3.1버전 설정법에 대해 포스팅
하도록 하겠습니다.
해당소스는 naver svn에서 checkout 가능하며 상세설명은 PDF로 별도 첨부합니다^^
https://dev.naver.com/svn/samplesource/branches/mybatis3.1_originjsp
저장소는 모두공개로 설정되어 있습니다.
계정을 물어보면 본인의 네이버아이디와 개발자센터에서 추가로 등록한 저장소 비밀번호를 이용하시면 됩니다^^
네이버 svn사용법은 아래의 링크에서 확인하세요
http://sharepoint.egloos.com/2963559
2. Mybatis3.1과 JSP3.0 연동하기
2-1. mybatis참고 URL 및 라이브러리 다운로드
아래의 url에서 원하는 버전의 라이브러리를 다운받아 압축을 해제한다.
http://code.google.com/p/mybatis/downloads/list?can=1
2-2. 예제 소스 다운로드
블러그 첨부파일 - http://blog.naver.com/korn123?Redirect=Log&logNo=30141764987
svn repository – https://dev.naver.com/svn/samplesource/branches/mybatis3.1_originjsp
2-3. 예제소스 구조
이번 예제는 mybatis3.1과 jsp3.0을 연동하는 예제로 웹프레임웍을 이용하지 않는 간편한 예제로
소스파일의 구조는 아래와 같다.
2-4. 예제소스 설명
기본컨트롤 및 뷰 구현은 JSP에서 모두 처리되며 데이터베이스와 연동하는 모델은 java코드에서
처리한다.
SqlSessionFactoryManager.java클래스에서 SqlSessionFactory인스턴스를 생성하며
이렇게 생성된 인스턴스를 Day1Dao.java / Day2Dao.java에서 취득하여 쿼리를 수행한다.
예제코드는 파라미터 유무에 따른 where연산과 파라미터 수량에 따른 in연산을 수행하는
두 가지 형태의 코드로 구성되어 있다.
Database는 Oracle XE에 기본적으로 생성되어 있는 HR스키마를 이용한다.
<메인화면>
<where조건절 없이 디폴트값으로 모두 선택된 화면>
<콤보박스 선택값으로 where조건절 생성화면>
<체크박스를 선택하기 전 기본화면>
<체크박스 선택 후 해당 파라미터 집합으로 in연산을 수행한 화면>
2-4-3. 주요 설정파일 및 코드 설명
2-4-3-1. db.properties
SqlMapConfig.xml에서 datasource설정시 사용되는 DB Connection정보를 관리한다.
#Oracle
#driver = oracle.jdbc.driver.OracleDriver
driver = core.log.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@127.0.0.1:1521:XE
user = hr
pwd = hr
2-4-3-2. SqlSessionFactoryManager.java
SqlMapConfig.xml 파일을 로딩하여 SqlSessionFactory 인스터스를 싱글톤으로 생성한다.
/**
* SqlSessionFactory 인스턴스를 싱글턴으로 반환함
* @author hanjoong
*
*/
public class SqlSessionFactoryManager {
private static Logger log = Logger.getLogger(SqlSessionFactoryManager.class);
private static final SqlSessionFactory sqlMapper;
static{
String resource = "query/SqlMapConfig.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
log.debug("초기화 에러");
}
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
}
/**
*
* @return SqlSessionFactory 인스턴스를 반환
*/
public static SqlSessionFactory getSqlSessionFactory() {
return sqlMapper;
}
}
2-4-3-3. SqlMapConfig.xml
Mybatis 사용을 위한 설정관리 파일로 datasourcce정보 및 mapper파일 경로를 지정한다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties">
</properties>
<environments default="development" >
<environment id="development" >
<transactionManager type="JDBC" />
<dataSource type="POOLED" >
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${pwd}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="query/exam/Day1.xml" />
<mapper resource="query/exam/Day2.xml" />
</mappers>
</configuration>
2-4-3-4. Day1.xml
실질적인 쿼리를 수행하기 위한 Mapper설정 파일
<?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="query.exam.Day1">
<resultMap id="hashmap" type="java.util.HashMap">
</resultMap>
<!-- JOBS 테이블의 모든 로우정보를 받아옴 -->
<select id="getJobs" parameterType="int" resultMap="hashmap">
SELECT * FROM JOBS
<where>
<if test="job_id != null">
JOB_ID = #{job_id}
</if>
</where>
</select>
</mapper>
2-4-3-5. Day2.xml
실질적인 쿼리를 수행하기 위한 Mapper설정 파일
<?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="query.exam.Day2">
<resultMap id="hashmap" type="java.util.HashMap">
</resultMap>
<!-- JOBS 테이블의 모든 로우정보를 받아옴 -->
<select id="getJobs" parameterType="int" resultMap="hashmap">
SELECT * FROM JOBS
<where>
<if test="job_id != null">
JOB_ID = #{job_id}
</if>
</where>
</select>
<!-- Check된 JOB_ID와 일치하는 정보를 반환 -->
<select id="getCheckJobs" resultMap="hashmap"
parameterType = "java.util.HashMap">
SELECT * FROM JOBS
<where>
<if test="jobIdArr != null">
<foreach collection="jobIdArr" open="JOB_ID IN (" close=")"
separator="," item="jobIdArr">
#{jobIdArr}
</foreach>
</if>
</where>
</select>
</mapper>
2-4-3-6. Day1Dao
JSP에서 넘겨주는 정보를 mapper와 연결한다.
public class Day1Dao {
SqlSessionFactory sqlMapper = SqlSessionFactoryManager.getSqlSessionFactory();
public Day1Dao() {
// TODO Auto-generated constructor stub
}
/**
* JOBS 테이블의 정보를 반환(검색키워드가 없으면 모두 반환)
* @param map
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public ArrayList<HashMap<String, String>>
getJobs(HashMap<String, Object> map){
ArrayList<HashMap<String, String>> list = null;
list = (ArrayList)sqlMapper.openSession().
selectList("query.exam.Day1.getJobs",map);
return list;
}
/**
* JOB_ID를 모두 반환함
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public ArrayList<HashMap<String, String>> getJobId(){
ArrayList<HashMap<String, String>> list = null;
HashMap<String, Object> map = null;
list = (ArrayList)sqlMapper.openSession().
selectList("query.exam.Day1.getJobs",map);
return list;
}
}
2-4-3-7. Day2Dao
JSP에서 넘겨주는 정보를 mapper와 연결한다.
public class Day2Dao {
SqlSessionFactory sqlMapper = SqlSessionFactoryManager.getSqlSessionFactory();
public Day2Dao() {
// TODO Auto-generated constructor stub
}
/**
* JOBS 테이블의 정보를 반환(String[] 형태의 키값을 받아서 필터링함)
* @param map
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public ArrayList<HashMap<String, String>> getJobs(String[] jobIdArr){
ArrayList<HashMap<String, String>> list = null;
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("jobIdArr",jobIdArr);
list = (ArrayList)sqlMapper.openSession().
selectList("query.exam.Day2.getCheckJobs", map);
return list;
}
/**
* JOB_ID를 모두 반환함
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public ArrayList<HashMap<String, String>> getJobId(){
ArrayList<HashMap<String, String>> list = null;
HashMap<String, Object> map = null;
list = (ArrayList)sqlMapper.openSession().
selectList("query.exam.Day2.getJobs",map);
return list;
}
}
2-4-3-8. day1.jsp
사용자의 요청을 service로직에 전달하고 jstl 및 el을 이용하여 반환된 값을 보여준다.
<%@page import="common.util.StringUtil"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="exam.day1.dao.Day1Dao"%>
<%@ page language="java" contentType="text/html;
charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String job_id = StringUtil.nullToEmpty(request.getParameter("job_id"));
Day1Dao dao = new Day1Dao();
ArrayList<HashMap<String, String>> list = null;
ArrayList<HashMap<String, String>> jobIdList = dao.getJobId(); //선택옵션 생성
if("".equals(job_id)){ //검색 키워드가 없을경우
list = dao.getJobs(null);
}else{ //검색 키워드가 있을경우
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("job_id",job_id);
list = dao.getJobs(map);
}
%>
<c:set var="job_id" value="<%=job_id%>"></c:set>
<!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>DAY - 1</title>
<script type="text/javascript">
function searchGo() {
var job_id = document.getElementById('job_id').value;
location.href = 'day1.jsp?job_id=' + job_id;
}
</script>
</head>
<body>
<div>
<select onchange="searchGo();" id="job_id" name="job_id">
<option value="">전체조회</option>
<c:forEach var="jobIdList" items="<%=jobIdList%>">
<option value="${jobIdList.JOB_ID}" <c:if test = "${jobIdList.JOB_ID ==
job_id}"> selected="selected" </c:if> >${jobIdList.JOB_ID}
</option>
</c:forEach>
</select>
기본 동적쿼리[셀렉트박스를 선택해서 파라미터가 있으면 where 조건절을 생성함]
<table border="1">
<colgroup>
<col width="20%">
<col width="40%">
<col width="20%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>JOB_ID</th><th>JOB_TITLE</th><th>MIN_SALARY</th><th>MAX_SALARY</th>
</tr>
</thead>
<tbody>
<!-- jstl을 이용하여 list에 담겨있는 Map의 value값을 호출 -->
<c:forEach var="list" items="<%=list%>">
<tr>
<td>${list.JOB_ID}</td>
<td>${list.JOB_TITLE}</td>
<td>${list.MIN_SALARY}</td>
<td>${list.MAX_SALARY}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
2-4-3-9. Day2.jsp
사용자의 요청을 service로직에 전달하고 jstl 및 el을 이용하여 반환된 값을 보여준다.
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="exam.day2.dao.Day2Dao"%>
<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
Day2Dao dao = new Day2Dao();
//선택옵션 생성
ArrayList<HashMap<String, String>> jobIdList = dao.getJobId();
ArrayList<HashMap<String, String>> list =
new ArrayList<HashMap<String, String>>();
String[] checkIds = request.getParameterValues("jobId");
if(checkIds != null){ //체크박스가 하나 이상 선택될경우
list = dao.getJobs(checkIds);
}
%>
<!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>동적쿼리 iterate</title>
</head>
<body>
<!-- 체크 영역 -->
<div style="float: left;">
<table border="1">
<colgroup>
<col width="20%">
<col width="40%">
<col width="20%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>JOB_ID</th><th>JOB_TITLE</th><th>MIN_SALARY</th><th>MAX_SALARY</th>
</tr>
</thead>
<tbody>
<!-- jstl을 이용하여 list에 담겨있는 Map의 value값을 호출 -->
<c:forEach var="list" items="<%=list%>">
<tr>
<td>${list.JOB_ID}</td>
<td>${list.JOB_TITLE}</td>
<td>${list.MIN_SALARY}</td>
<td>${list.MAX_SALARY}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<!-- 선택 영역 -->
<div style="float: right;">
<form action="" method="get">
<c:forEach var="jobIdList" items="<%=jobIdList%>" >
<input type="checkbox" name="jobId" value="${jobIdList.JOB_ID}"
/>${jobIdList.JOB_TITLE} <br />
</c:forEach>
<input type="submit" value="검색" />
</form>
</div>
</body>
</html>
'SQL > MYBATIS' 카테고리의 다른 글
MyBatis 프레임워크의 트랜잭션 제어 (0) | 2015.02.04 |
---|---|
Mybatis의 Plug-In을 이용한 SQL문 파라미터 바인딩 로그 출력.. (0) | 2014.02.03 |
mybatis 예제 - 기본설정 및 기본쿼리 테스트 (0) | 2014.01.28 |