HongCat 개발 스토리

동적쿼리 if문을 이용한 회원정보 조회 본문

FrameWork

동적쿼리 if문을 이용한 회원정보 조회

홍캣 2019. 12. 4. 18:04

2019.12.04 

checkbox 체크시 해당하는 정보만 조회하도록 출력하는 프로그램을 작성해 볼 것이다.

쿼리문 작성시 if문을 사용해서 동적으로 쿼리문을 조회할 수 있는 방법을 설명할 것이다.

DB는 지난시간 예제와 같은 Member DB를 사용하고 mybatisTest 프로젝트에서 작업을 진행한다.

 

아래는 동적쿼리를 사용한 결과화면이다.

1. 표시된 파일들을 생성해 준다.

2. index.jsp에 6.동적쿼리if 에 링크를 추가해준다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>마이바티스 CRUD처리</h1>
<hr>
<a href="/views/member/login.html">1.로그인</a><br>
<a href="/allMember">2.전체 회원정보 조회</a>
<a href="/views/member/enroll.html">3.회원가입</a><br>
<a href="/views/member/memberSearch.html">4.회원 정보 조회</a>

<a href="/boardList">5.게시판</a>

<a href="/views/member/dynamicQuery_if.html">6.동적쿼리if</a>




</body>
</html>

2. views/member 의 dynamicQuery_if.html 의 소스코드이다.

이 코드에서는 체크박스의 형태를 만들어준다. 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/memberListIf" method="post">
		<input type="checkbox" name="ckId">ID 
		<input type="checkbox" name="ckPw">PW 
		<input type="checkbox" name="ckName">NAME
		<input type="checkbox" name="ckAddr">ADDR 
		<input type="submit" value="회원정보요청">
	</form>
</body>
</html>

3. 위 폼에서 체크박스에 체크한 값들을 servlet으로 넘겨준다.

 

여기서 질문! checkbox의 값을 체크하지 않고 값을 넘기면 무슨 값이 나올까?

정답은 check 하지 않으면 null을 check하지 않으면 on값이 된다. 이제 이 특성을 이용해서 mapper에서 쿼리문을 작성해 줄 것이다.

Check한 데이터들은 객체에 담아서 넘겨줄 것이므로  member/mode/vo에 Check 객체를 생성해준다.

Check 객체 생성 코드

package member.model.vo;

public class Check {
	
	private String ckId;
	private String ckPw;
	private String ckName;
	private String ckAddr;
	
	/*alt+shit+s*/
	public Check() {
		super();
	}
	
	public Check(String ckId, String ckPw, String ckName, String ckAddr) {
		super();
		this.ckId=ckId;
		this.ckPw=ckPw;
		this.ckName=ckName;
		this.ckAddr=ckAddr;
		
	}

	public String getCkId() {
		return ckId;
	}

	public void setCkId(String ckId) {
		this.ckId = ckId;
	}

	public String getCkPw() {
		return ckPw;
	}

	public void setCkPw(String ckPw) {
		this.ckPw = ckPw;
	}

	public String getCkName() {
		return ckName;
	}

	public void setCkName(String ckName) {
		this.ckName = ckName;
	}

	public String getCkAddr() {
		return ckAddr;
	}

	public void setCkAddr(String ckAddr) {
		this.ckAddr = ckAddr;
	}
	
	
}

Servlet 코드

package member.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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 member.model.service.MemberService;
import member.model.vo.Check;
import member.model.vo.Member;

/**
 * Servlet implementation class MemberListIfServlet
 */
@WebServlet("/memberListIf")
public class MemberListIfServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MemberListIfServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String ckId=request.getParameter("ckId");
		String ckPw=request.getParameter("ckPw");
		String ckName=request.getParameter("ckName");
		String ckAddr=request.getParameter("ckAddr");
		System.out.println(ckId);//checkbox에 value값 주지 않고 값을 넘겼을때 어떤값이 출력될까? 체크 안하면 null 체크하면 on
		
		Check check=new Check(ckId, ckPw, ckName, ckAddr);
		//전체회원정보 
		ArrayList<Member> list=new MemberService().selectIfList(check);
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out=response.getWriter();
		
		if(!list.isEmpty()) {
			for(Member m:list) {
				out.println("NO:"+m.getMemberNo()+"<br>");
				if(m.getMemberId()!=null) {
					out.println("ID:"+m.getMemberId()+"<br>");	
				}
				if(m.getMemberPw()!=null) {
					out.println("PW:"+m.getMemberPw()+"<br>");
				}
				if(m.getMemberName()!=null) {
					out.println("NAME:"+m.getMemberName()+"<br>");
				}
				if(m.getMemberAddr()!=null) {
					out.println("ADDR:"+m.getMemberAddr()+"<br>");
				}
				out.println("<hr>");
			}
		}
		
		
	
	}

	
}

4. Service에 selectIfList 메소드 코드를 작성해준다.

	public ArrayList<Member> selectIfList(Check check) {
		SqlSession session=SqlSessionTemplate.getSqlSession();
		ArrayList<Member> list=new MemberDao().selectIfList(session, check);
		session.close();
		return list;
	}

5. DAO에 selectIfList 메소드 코드를 작성해준다.

public ArrayList<Member> selectIfList(SqlSession session, Check check) {
		List<Member> list=session.selectList("member.selectIfList",check);
 		return (ArrayList<Member>)list;
	}

6. member_mapper.xml 에 쿼리를 작성한다.

이번장의 하이라이트 if문을 사용한 동적 쿼리문의 작성이다. 

이 코드에 대한 간단한 설명을 붙이면 Check 객체에 담겨서 있는 값이 null인지 확인하고 check된 상태인지 확인(on상태인지)를 확인한뒤 select 문에 해당 컬럼으 조회할지 안할지 결정해 준다. 

이렇게 쿼리문에 조건문을 추가해서  쿼리문을 선택적으로 수행하는 작업을 동적쿼리라고 한다.

<!-- if 검색 -->
	<select id="selectIfList" parameterType="member.model.vo.Check" resultType="m">
	select 
		<if test="ckId !=null and ckId.equals('on')">
			member_id as memberId,	
		</if>
		<if test="ckPw !=null and ckPw.equals('on')">
			member_pw as memberPw,
		</if>
		<if test="ckName !=null and ckName.equals('on')">
			member_name as memberName,
		</if>
		<if test="ckAddr !=null and ckAddr.equals('on')">
			member_addr as memberAddr,
		</if>
			member_no as memberNo
	from member
	</select>

 

'FrameWork' 카테고리의 다른 글

4. Bean 등록 Annotaion  (0) 2019.12.06
Maven 사용을 위한 이클립스 환경설정  (0) 2019.12.05
3.Spring과 Maven  (0) 2019.12.05
2. Mybatis 동적쿼리  (0) 2019.12.04
1. 프레임워크란?  (0) 2019.12.02
Comments