[[ Dynamic query ]]
- 동적으로 조건이 변해야 하는 경우 Mybatis에서 사용 예제
- 두가지 :
(1) select 로 하나만 선택하는 경우
(2) checkbox로 여러개 선택하는 경우
(1) main.jsp
검색( select ) ,검색2 (checkbox)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<a href="MemberCon?cmd=list1">검색</a><br/>
<a href="MemberCon?cmd=list2">검색2</a><br/>
</body>
</html>
(2) list1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
<div><!-- 조회된 목록이 보여질 div -->
<table border="1" width="600">
<tr>
<th>아이디</th><th>비밀번호</th><th>이메일</th>
<th>전화번호</th><th>가입일</th>
</tr>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.id }</td>
<td>${vo.pwd }</td>
<td>${vo.email }</td>
<td>${vo.phone }</td>
<td>${vo.regdate }</td>
</tr>
</c:forEach>
</table>
</div>
<div>
<form method="post" action="MemberCon?cmd=list1">
<select name="field">
<option value="id">아이디</option>
<option value="email">이메일</option>
<option value="phone">전화번호</option>
</select>
<input type="text" name="keyword"/>
<input type="submit" value="검색"/>
</form>
</div>
</body>
</html>
(3) list2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
<div>
<table border="1" width="600">
<tr>
<th>아이디</th><th>비밀번호</th><th>이메일</th>
<th>전화번호</th><th>가입일</th>
</tr>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.id }</td>
<td>${vo.pwd }</td>
<td>${vo.email }</td>
<td>${vo.phone }</td>
<td>${vo.regdate }</td>
</tr>
</c:forEach>
</table>
</div>
<div>
<form method="post" action="MemberCon?cmd=list2">
<input type="checkbox" name="chkId" value="id" checked="checked">아이디
<input type="checkbox" name="chkEmail" value="email" >이메일
<input type="checkbox" name="chkPhone" value="phone" >전화번호
<input type="text" name="keyword"/>
<input type="submit" value="검색"/>
</form>
</div>
</body>
</html>
---------------------------------------------------------------------------------
: lib에 jar파일 복사
----------------------------------------------------------------------------------
: controller, Dao, vo, sqlsession생성, xml, log4j 기본파일
----------------------------------------------------------------------------------
(1) test.orm.mybatis-config.xml
;
<?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>
<!--//// 접속할 DB서버에 대한 정보 설정 ////-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</dataSource>
</environment>
</environments>
<!--/////// sql구문이 들어있는 SQL Mapper파일 포함 ////////// -->
<mappers>
<mapper resource="test/orm/BoardMapper.xml" />
</mappers>
</configuration>
(2) test.orm.BoardMapper.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.orm.BoardMapper">
<!--
where id like '%aa%'
where ${field} like '%'||#{keyword}||'%'
${}는 미리 컴파일 됨.컬럼명등은 ?로 쓸수 없으므로 ${}로 처리해야 함
-->
<select id="findList1" resultType="test.vo.MembersVo"
parameterType="hashmap">
select * from members
<if test="field != null">
where ${field} like '%'||#{keyword}||'%'
</if>
</select>
<!--
String ss =" select * from members ";
if(id!=null){
ss+="where id=keyword";
}
if(pwd!=null){
ss+="or pwd=keyword";
}
이와 같이 경우
-->
<select id="findList2" parameterType="hashmap"
resultType="test.vo.MembersVo">
select * from members
<where>
<!--
where 다음에 if문에 해당하는 조건이 하나라도 있으면 select뒤에 where가 붙는다.
or는 붙이며, 이전 항목이 없으면 자동으로 빼고 실행한다.
-->
<if test="id!=null">
id=#{keyword}
</if>
<if test="email!=null">
or email=#{keyword}
</if>
<if test="phone!=null">
or phone=#{keyword}
</if>
</where>
</select>
</mapper>
(3) test.orm.SqlSessionFactoryService
;
package test.orm;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryService {
private static SqlSessionFactory sqlSessionFactory;
//static멤버변수를 초기화할때는 static블록을 사용한다.(생성자x)
static{
try{
InputStream is=
Resources.getResourceAsStream("test/orm/mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
(4) test.vo.MembersVo
; getter, setter
package test.vo;
import java.sql.Date;
public class MembersVo {
private String id;
private String pwd;
private String email;
private String phone;
private Date regdate;
public MembersVo() {}
public MembersVo(String id, String pwd, String email, String phone,
Date regdate) {
super();
this.id = id;
this.pwd = pwd;
this.email = email;
this.phone = phone;
this.regdate = regdate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
}
(5) test.dao.MembersDao
;
package test.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import test.orm.SqlSessionFactoryService;
import test.vo.MembersVo;
public class MembersDao {
private SqlSessionFactory sqlSessionFactory;
public MembersDao(){
sqlSessionFactory=SqlSessionFactoryService.getSqlSessionFactory();
}
public List<MembersVo> getList(Map<String,String> map){
SqlSession sqlSession=null;
try{
sqlSession=sqlSessionFactory.openSession();
return sqlSession.selectList("findList1",map);
}finally{
if(sqlSession!=null) sqlSession.close();
}
}
public List<MembersVo> getList1(HashMap<String,String> map){
SqlSession sqlSession = null;
try{
sqlSession=sqlSessionFactory.openSession();
return sqlSession.selectList("findList2", map);
}finally{
if(sqlSession!=null) sqlSession.close();
}
}
}
(6) test.controller.MemberController
;
package test.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import test.dao.MembersDao;
import test.vo.MembersVo;
@WebServlet("/MemberCon")
public class MemberController extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String cmd=req.getParameter("cmd");
if(cmd.equals("list1")){
list1(req,resp);
}else if(cmd.equals("list2")){
list2(req,resp);
}
}
// 체크박스로 선택된 조건 ( 여러개 인 경우 )
protected void list2(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 전송된 체크박스의 value값들 얻어오기.
// 체크가 안된것은 null이 들어온다.
String id = req.getParameter("chkId");
String email = req.getParameter("chkEmail");
String phone = req.getParameter("chkPhone");
String keyword=req.getParameter("keyword");
//검색조건을 HashMap에 담기.
HashMap<String,String> map=new HashMap<>();
map.put("id", id);
map.put("email", email);
map.put("phone", phone);
map.put("keyword", keyword);
// dao를 통해서 조건에 해당하는 데이터 얻어오기.
MembersDao dao = new MembersDao();
List<MembersVo> list=dao.getList1(map);
//결과값을 가지고 뷰페이지로 이동하기.
req.setAttribute("list", list);
req.getRequestDispatcher("/list2.jsp").forward(req, resp);
}
// 셀렉트로 선택한 조건 ( 하나 )
protected void list1(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//검색필드 얻어오기
String field=req.getParameter("field");
//검색어 얻어오기
String keyword=req.getParameter("keyword");
//검색조건을 HashMap에 담기
Map<String,String> map=new HashMap<>();
map.put("field",field);
map.put("keyword",keyword);
//DAO를 통해서 DB에서 조회하기
MembersDao dao=new MembersDao();
List<MembersVo> list=dao.getList(map);
//결과값을 가지고 뷰페이지로 이동하기
req.setAttribute("list",list);
req.getRequestDispatcher("/list1.jsp").forward(req, resp);
}
}
(7) log4j.properties
; 로그 확인용
# \uC804\uC5ED \uB85C\uAE45 \uC124\uC815
log4j.rootLogger=ERROR, stdout
# MyBatis \uB85C\uAE45 \uC124\uC815...
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=TRACE
# Console \uCD9C\uB825...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
'WEB > MyBatis' 카테고리의 다른 글
log4j.properties (0) | 2013.05.04 |
---|---|
3. MyBatis 사용 간한한 방명록 예제 (0) | 2013.04.24 |
2. java 에서 mybatis 사용한 예제 (0) | 2013.04.24 |
1. 라이브러리 다운 및 환경설정(xml) (0) | 2013.04.24 |