동적 SQL (전달값에 따라 다른 SQL 명령 실행)

woom·2023년 2월 7일
0

Framework

목록 보기
4/20
post-thumbnail

🌼 동적 SQL

  • 동적 SQL(Dynamic SQL) : 전달값에 따라 다른 SQL 명령이 엘리먼트에 등록되는 기능

    • OGNL(Object Graph Navigation Language) 표현식을 사용하여 구현

📕 DTO class

package xyz.itwill.dto;

public class MyHewon {
	private String id;
	private String name;
	private String phone;
	private String email;
	private int state;
	
	public MyHewon() {
		// TODO Auto-generated constructor stub
	}

	public MyHewon(String id, String name, String phone, String email, int state) {
		super();
		this.id = id;
		this.name = name;
		this.phone = phone;
		this.email = email;
		this.state = state;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}
}





⭐ xml 매퍼

  • 이름을 전달받지 않을 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 이름을 전달받은 경우 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트
    • 동적 SQL 관련 엘리먼트를 사용하여 전달값에 따라 SQL 명령이 다르게 등록되도록 설정
  • if : 조건에 의해 엘리먼트 내용(SQL 명령을 구성하는 문장)의 포함여부를 설정하는 엘리먼트
    • if 엘리먼트의 조건이 참인 경우 엘리먼트 내용을 SQL명령에 포함
    • test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정
    • parameterType 속성으로 전달된 값에 대한 조건식을 사용하여 test 속성값으로 제공
  • 아이디 또는 이름을 전달받지 않은 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 아이디 또는 이름을 전달받은 경우 MYHEWON 테이블에 저장된 회원정보 중 해당 아이디 또는 이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트
    • if문을 두번 사용했을 경우 문제점 : 아이디와 이름이 모두 전달된 경우 에러 발생
    • 모든 if 엘리먼트의 test 속성값이 [true]이므로 WHERE 문장이 2번 포함
  • 해결법1 : 아이디와 이름이 모두 전달돼도 하나의 WHERE 문장만 포함되도록 설정
  • choose : 조건에 맞는 하나의 엘리먼트 내용(SQL 명령을 구성하는 문장)이 포함되도록 설정하는 엘리먼트
    • 하위 엘리먼트 : when 엘리먼트(1개 이상), otherwise 엘리먼트(0개 또는 1개)
    • 다수의 하위 엘리먼트 중 하나의 엘리먼트 내용만 SQL 명령에 포함
    • when : 조건에 의한 엘리먼트 내용 포함여부를 설정하는 엘리먼트
    • test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정
    • otherwise : when 엘리먼트의 모든 조건이 거짓인 경우 엘리먼트 내용을 SQL 명령에 포함하는 엘리먼트
  • 해결법2 : 아이디와 이름이 모두 전달된 경우 하나의 WHERE 문장에 포함되도록 설정
  • trim : 엘리먼트 내용에 필요한 값을 추가하거나 삭제하여 SQL 명령에 포함하는 엘리먼트

    • 하위 엘리먼트로 다수의 if 엘리먼트 사용
    • prefix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 추가될 문장을 속성값으로 설정
    • prefixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 제거될 문장을 속성값으로 설정
    • suffix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 추가될 문장을 속성값으로 설정
    • suffixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 제거될 문장을 속성값으로 설정
  • where : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 [and] 또는 [or] 키워드가 있으면 삭제하고 [where] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트

    • 하위 엘리먼트로 다수의 if 엘리먼트 사용
  • 회원정보를 전달받아 MYHEWON 테이블에 저장된 회원정보를 변경하는 엘리먼트
    • 아이디를 비교하여 아이디를 제외한 모든 회원정보 변경 (변경값 미입력시 초기값으로 변경됨 → 비정상적인 결과)
    • 아이디를 비교하여 아이디를 제외한 전달값이 존재하는 회원정보 변경 (변경값 미입력시 변경안됨)
    • test 속성값에서 관계연산자를 기호(>,<,>=,<=) 대신 문자(gt,lt,gte,lte)로 표현하여 사용
    • <if test="state gte 1 and state lte 4">
    • 관계연산자를 기호로 사용한 경우 에러 발생
  • set : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 [,]가 있으면 삭제하고 엘리먼트 내용 앞에 [set] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트
    • 하위 엘리먼트로 다수의 if 엘리먼트 사용
  • 아이디 목록을 전달받아 MYHEWON 테이블에 저장된 해당 아이디의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트
    • 아이디 목록을 전달받지 못한 경우 MYHEWON 테이블에 저장된 모든 회원정보 검색
    • parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정하여 아이디 목록을 List 객체로 제공받아 사용
    • parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정한 경우 List 객체를 전달받아 SQL명령에서 [list] 이름으로 표현하여 사용
    • <select id="selectMultiDynamicHewonList" parameterType="list" resultMap="myHewonResultMap">
  • foreach : 전달받은 List 객체의 요소값을 반복적으로 제공받아 SQL 명령에 포함하는 엘리먼트
    • collection 속성 : 반복 처리하기 위한 List 객체의 이름을 속성값으로 설정
    • item 속성 : List 객체의 요소값을 저장하기 위한 이름을 속성값으로 설정
    • open 속성 : foreach 엘리먼트의 내용 앞부분에 추가될 문장을 속성값으로 설정
    • close 속성 : foreach 엘리먼트의 내용 뒷부분에 추가될 문장을 속성값으로 설정
    • separator 속성 : List 객체의 요소값을 구분하기 위한 문장을 속성값으로 설정


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.MyHewonMapper">
  	<!-- 이름을 전달받아 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를  
	제공하는 엘리먼트 -->
	<select id="selectNameHewonList" parameterType="string" resultMap="myHewonResultMap">
		select * from myhewon where hewon_name=#{name} order by hewon_id
	</select>
	
	<!-- 동적 SQL(Dynamic SQL) : 전달값에 따라 다른 SQL 명령이 엘리먼트에 등록되는 기능 -->
	<!-- => OGNL(Object Graph Navigation Language) 표현식을 사용하여 구현 -->
	
	<!-- 이름을 전달받지 않을 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 이름을 전달받은
	경우 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- => 동적 SQL 관련 엘리먼트를 사용하여 전달값에 따라 SQL 명령이 다르게 등록되도록 설정 -->
	<select id="selectDynamicNameHewonList" parameterType="string" resultMap="myHewonResultMap">
		select * from myhewon
		<!-- if : 조건에 의해 엘리먼트 내용(SQL 명령을 구성하는 문장)의 포함여부를 설정하는 엘리먼트 -->
		<!-- test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정 -->
		<!-- => parameterType 속성으로 전달된 값에 대한 조건식을 사용하여 test 속성값으로 제공 -->
		<if test="name!=null and name!=''"><!-- 전달값(이름)이 있는 경우 >> [true] -->
			where hewon_name=#{name}
		</if> 
		order by hewon_id
	</select>
	
	<!-- 아이디 또는 이름을 전달받지 않은 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고
	아이디 또는 이름을 전달받은 경우  MYHEWON 테이블에 저장된 회원정보 중 해당 아이디 또는
	이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- 문제점)아이디와 이름이 모두 전달된 경우 에러 발생 -->
	<!-- => 모든 if 엘리먼트의 test 속성값이 [true]이므로 WHERE 문장이 2번 포함 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<if test="id!=null and id!=''">
			where hewon_id=#{id}
		</if>
		<if test="name!=null and name!=''">
			where hewon_name=#{name}
		</if>
		order by hewon_id
	</select>
	-->
	
	<!-- 해결법-1)아이디와 이름이 모두 전달돼도 하나의 WHERE 문장만 포함되도록 설정 -->
	<!-- choose : 조건에 맞는 하나의 엘리먼트 내용(SQL 명령을 구성하는 문장)이 포함되도록 설정하는 엘리먼트 -->
	<!-- => 하위 엘리먼트 : when 엘리먼트(1개 이상), otherwise 엘리먼트(0개 또는 1개) -->
	<!-- => 다수의 하위 엘리먼트 중 하나의 엘리먼트 내용만 SQL 명령에 포함 -->
	<!-- when : 조건에 의한 엘리먼트 내용 포함여부를 설정하는 엘리먼트 -->
	<!-- test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정 -->
	<!-- otherwise : when 엘리먼트의 모든 조건이 거짓인 경우 엘리먼트 내용을 SQL 명령에 포함하는 엘리먼트 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<choose>
			<when test="id!=null and id!=''">
				where hewon_id=#{id}
			</when>
			<when test="name!=null and name!=''">
				where hewon_name=#{name}
			</when>
		</choose>
		order by hewon_id
	</select>
	-->
	
	<!-- 해결법-2)아이디와 이름이 모두 전달된 경우 하나의 WHERE 문장에 포함되도록 설정  -->
	<!-- trim : 엘리먼트 내용에 필요한 값을 추가하거나 삭제하여 SQL 명령에 포함하는 엘리먼트 --> 
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<!-- prefix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 추가될 문장을 속성값으로 설정 -->
	<!-- prefixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 제거될 문장을 속성값으로 설정 -->
	<!-- suffix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 추가될 문장을 속성값으로 설정 -->
	<!-- suffixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 제거될 문장을 속성값으로 설정 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<trim prefix="where" prefixOverrides="and|or">
			<if test="id!=null and id!=''">
				hewon_id=#{id}
			</if>
			<if test="name!=null and name!=''">
				${choice} hewon_name=#{name}
			</if>
		</trim>
		order by hewon_id
	</select>
	-->
	
	<!-- where : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 [and] 또는 [or] 키워드가 
	있으면 삭제하고 [where] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트 -->
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<where>
			<if test="id!=null and id!=''">
				hewon_id=#{id}
			</if>
			<if test="name!=null and name!=''">
				${choice} hewon_name=#{name}
			</if>
		</where>
		order by hewon_id
	</select>
	
	<!-- 회원정보를 전달받아 MYHEWON 테이블에 저장된 회원정보를 변경하는 엘리먼트 -->
	<!-- => 아이디를 비교하여 아이디를 제외한 모든 회원정보 변경 -->
	<update id="updateHewon" parameterType="MyHewon">
		update myhewon set hewon_name=#{name},hewon_phone=#{phone},hewon_email=#{email}
			,hewon_state=#{state} where hewon_id=#{id}
	</update>
	
	<!-- 회원정보를 전달받아 MYHEWON 테이블에 저장된 회원정보를 변경하는 엘리먼트 -->
	<!-- => 아이디를 비교하여 아이디를 제외한 전달값이 존재하는 회원정보 변경 -->
	<!-- test 속성값에서 관계연산자를 기호(>,<,>=,<=) 대신 문자(gt,lt,gte,lte)로 표현하여 사용  -->
	<!-- => 관계연산자를 기호로 사용한 경우 에러 발생 -->
	<!--  
	<update id="updateDynamicHewon" parameterType="MyHewon">
		update myhewon 
		<trim prefix="set" suffixOverrides=",">
			<if test="name!=null and name!=''">
				hewon_name=#{name},
			</if>
			<if test="phone!=null and phone!=''">
				hewon_phone=#{phone},
			</if>
			<if test="email!=null and email!=''">
				hewon_email=#{email},
			</if>
			<if test="state gte 1 and state lte 4">
				hewon_state=#{state}
			</if>
		</trim>
		where hewon_id=#{id}
	</update>
	-->
	
	<!-- set : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 [,]가 있으면 삭제하고 
	엘리먼트 내용 앞에 [set] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트 -->
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<update id="updateDynamicHewon" parameterType="MyHewon">
		update myhewon 
		<set>
			<if test="name!=null and name!=''">
				hewon_name=#{name},
			</if>
			<if test="phone!=null and phone!=''">
				hewon_phone=#{phone},
			</if>
			<if test="email!=null and email!=''">
				hewon_email=#{email},
			</if>
			<if test="state gte 1 and state lte 4">
				hewon_state=#{state}
			</if>
		</set>
		where hewon_id=#{id}
	</update>
	
	<!-- 아이디 목록을 전달받아 MYHEWON 테이블에 저장된 해당 아이디의 회원정보를 검색하여
	검색결과를 제공하는 엘리먼트 -->
	<!-- => 아이디 목록을 전달받지 못한 경우 MYHEWON 테이블에 저장된 모든 회원정보 검색 -->
	<!-- parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정하여 아이디 목록을  
	List 객체로 제공받아 사용 -->
	<!-- => parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정한 경우 List 객체를
	전달받아 SQL명령에서 [list] 이름으로 표현하여 사용 -->
	<select id="selectMultiDynamicHewonList" parameterType="list" resultMap="myHewonResultMap">
		select * from myhewon
		<if test="list!=null">
			where hewon_id in
			<!-- foreach : 전달받은 List 객체의 요소값을 반복적으로 제공받아 SQL 명령에 포함하는 엘리먼트 -->
			<!-- collection 속성 : 반복 처리하기 위한 List 객체의 이름을 속성값으로 설정 -->
			<!-- item 속성 : List 객체의 요소값을 저장하기 위한 이름을 속성값으로 설정 -->
			<!-- open 속성 : foreach 엘리먼트의 내용 앞부분에 추가될 문장을 속성값으로 설정 -->
			<!-- close 속성 : foreach 엘리먼트의 내용 뒷부분에 추가될 문장을 속성값으로 설정 -->
			<!-- separator 속성 : List 객체의 요소값을 구분하기 위한 문장을 속성값으로 설정 -->
			<foreach collection="list" item="id" open="(" close=")" separator=",">
				#{id}
			</foreach>
		</if>
		order by hewon_id
	</select>
</mapper>






📙 interface 매퍼

package xyz.itwill.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import xyz.itwill.dto.MyHewon;

public interface MyHewonMapper {
	List<MyHewon> selectNameHewonList(String name);
	List<MyHewon> selectDynamicNameHewonList(String name);
	List<MyHewon> selectDynamicHewonList(Map<String, Object> map);
	int updateHewon(MyHewon hewon);
	int updateDynamicHewon(MyHewon hewon);
	List<MyHewon> selectMultiDynamicHewonList(List<String> idList);
}





📒 DAO class

package xyz.itwill.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import xyz.itwill.dto.MyHewon;
import xyz.itwill.mapper.MyHewonMapper;

public class MyHewonDAO extends AbstractSession {
	private static MyHewonDAO _dao;
	
	private MyHewonDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyHewonDAO();
	}
	
	public static MyHewonDAO getDAO() {
		return _dao;
	}
	
	public int insertHewon(MyHewon hewon) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).insertHewon(hewon);
		} finally {
			sqlSession.close();
		}
	}
	
	public List<MyHewon> selectNameHewonList(String name) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectNameHewonList(name);
		} finally {
			sqlSession.close();
		}
	}
	
	public List<MyHewon> selectDynamicNameHewonList(String name) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectDynamicNameHewonList(name);
		} finally {
			sqlSession.close();
		}
	}
	
	public List<MyHewon> selectDynamicHewonList(Map<String, Object> map) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectDynamicHewonList(map);
		} finally {
			sqlSession.close();
		}
	}
	
	public int updateHewon(MyHewon hewon) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).updateHewon(hewon);
		} finally {
			sqlSession.close();
		}
	}
	
	public int updateDynamicHewon(MyHewon hewon) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).updateDynamicHewon(hewon);
		} finally {
			sqlSession.close();
		}
	}
	
	public List<MyHewon> selectMultiDynamicHewonList(List<String> idList) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectMultiDynamicHewonList(idList);
		} finally {
			sqlSession.close();
		}
	}
}





🐣 이름 검색

  • 이름을 전달받아 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String name=request.getParameter("name");
	
	List<MyHewon> hewonList=null;
	if(name==null || name.equals("")) {//전달값이 없는 경우 - 검색기능 미사용
		hewonList=MyHewonDAO.getDAO().selectHewonList();//전체 검색
	} else {//전달값이 있는 경우 - 검색기능 사용
		hewonList=MyHewonDAO.getDAO().selectNameHewonList(name);//조건 검색
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}
td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}
.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.state { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="state">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
		<tr>
			<td colspan="5">검색된 회원정보가 없습니다.</td>
		</tr>
		<% } else { %>	
			<% for(MyHewon hewon:hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getState() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
	<br>
	
	<form method="post">
		이름 : <input type="text" name="name">
		<button type="submit">검색</button>
	</form>
</body>
</html>





🐣 이름 검색 (동적 SQL)

  • 이름을 전달받지 않을 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 이름을 전달받은 경우 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String name=request.getParameter("name");
	
	List<MyHewon> hewonList=MyHewonDAO.getDAO().selectDynamicNameHewonList(name);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}
td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}
.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.state { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="state">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
		<tr>
			<td colspan="5">검색된 회원정보가 없습니다.</td>
		</tr>
		<% } else { %>	
			<% for(MyHewon hewon:hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getState() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
	<br>
	
	<form method="post">
		이름 : <input type="text" name="name">
		<button type="submit">검색</button>
	</form>
</body>
</html>





🐣 아이디 and/or 이름 검색 (동적 SQL)

  • 아이디 또는 이름을 전달받지 않은 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 아이디 또는 이름을 전달받은 경우 MYHEWON 테이블에 저장된 회원정보 중 해당 아이디 또는 이름의 회원정보를 검색

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String id=request.getParameter("id");
	String name=request.getParameter("name");
	String choice=request.getParameter("choice");
	
	Map<String, Object> map=new HashMap<String, Object>();
	map.put("id", id);
	map.put("name", name);
	map.put("choice", choice);
	
	List<MyHewon> hewonList=MyHewonDAO.getDAO().selectDynamicHewonList(map);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}
td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}
.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.state { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="state">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
		<tr>
			<td colspan="5">검색된 회원정보가 없습니다.</td>
		</tr>
		<% } else { %>	
			<% for(MyHewon hewon:hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getState() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
	<br>
	
	<form method="post">
		아이디 : <input type="text" name="id">
		<select name="choice">
			<option value="or" selected="selected">&nbsp;OR&nbsp;</option>
			<option value="and">&nbsp;AND&nbsp;</option>
		</select>
		이름 : <input type="text" name="name">
		<button type="submit">검색</button>
	</form>
</body>
</html>





🐣 회원정보 변경

  • MYHEWON 테이블에서 아이디가 [xxx]인 회원의 이름을 [로빈훗]으로 변경
    • 기본생성자에 의해 생성된 객체 필드에는 기본값(논리형:false,숫자형:0,참조형:null) 저장

  • DAO 클래스의 메소드 매개변수에는 아이디와 이름만 저장된 회원정보가 전달
    • 아이디와 이름을 제외한 필드에는 기본값이 저장되어 전달
    • 문제점) MYHEWON 테이블에 저장된 회원정보가 비정상적으로 변경 처리
    • 해결법) DAO 클래스의 메소드 매개변수에 모든 회원정보를 저장하여 전달
    • 회원정보를 변경하지 않는 컬럼에는 기존 컬럼값이 저장되도록 필드값 변경

<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
	//MYHEWON 테이블에서 아이디가 [xxx]인 회원의 이름을 [로빈훗]으로 변경
	//기본생성자에 의해 생성된 객체 필드에는 기본값(논리형:false,숫자형:0,참조형:null) 저장 
	MyHewon hewon=new MyHewon();
	hewon.setId("xxx");
	hewon.setName("로빈훗");
	
	//DAO 클래스의 메소드 매개변수에는 아이디와 이름만 저장된 회원정보가 전달
	// => 아이디와 이름을 제외한 필드에는 기본값이 저장되어 전달
	//문제점)MYHEWON 테이블에 저장된 회원정보가 비정상적으로 변경 처리
	MyHewonDAO.getDAO().updateHewon(hewon);
	*/
	
	//해결법)DAO 클래스의 메소드 매개변수에 모든 회원정보를 저장하여 전달
	// => 회원정보를 변경하지 않는 컬럼에는 기존 컬럼값이 저장되도록 필드값 변경 
	MyHewon hewon=new MyHewon();
	hewon.setId("xxx");
	hewon.setName("로빈훗");
	hewon.setPhone("010-5467-3487");
	hewon.setEmail("xxx@itwill.xyz");
	hewon.setState(4);
	MyHewonDAO.getDAO().updateHewon(hewon);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>회원정보변경</h1>
	<hr>
	<h3>회원정보를 성공적으로 변경 하였습니다.</h3>
</body>
</html>





🐣 회원정보 변경 (동적 SQL)

<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//MYHEWON 테이블에서 아이디가 [xxx]인 회원의 이름을 [홍경래]으로 변경
	MyHewon hewon=new MyHewon();
	hewon.setId("xxx");
	hewon.setName("홍경래");
	
	MyHewonDAO.getDAO().updateDynamicHewon(hewon);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>회원정보변경</h1>
	<hr>
	<h3>회원정보를 성공적으로 변경 하였습니다.</h3>
</body>
</html>





🐣 id목록 검색 (foreach )

  • 아이디 목록을 전달받아 MYHEWON 테이블에 저장된 해당 아이디의 회원정보를 검색


<%@page import="java.util.ArrayList"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String ids=request.getParameter("ids");
		
	List<String> idList=null;
	if(ids!=null && !ids.equals("")) {//전달받은 아이디 목록이 있는 경우
		//전달받은 아이디 목록을 [,] 기호로 분리하여 List 객체의 요소값으로 추가하여 저장
		idList=new ArrayList<String>();
		for(String id:ids.split(",")) {
			idList.add(id.trim());
		}
	}
	
	List<MyHewon> hewonList=MyHewonDAO.getDAO().selectMultiDynamicHewonList(idList);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}
td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}
.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.state { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="state">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
		<tr>
			<td colspan="5">검색된 회원정보가 없습니다.</td>
		</tr>
		<% } else { %>	
			<% for(MyHewon hewon:hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getState() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
	<br>
	
	<form method="post">
		아이디 : <input type="text" name="ids">
		<button type="submit">검색</button>
		<b>[검색하고자 하는 아이디가 여러개인 경우 ,로 구분하여 입력해 주세요.]</b>
	</form>
</body>
</html>





profile
Study Log 📂

0개의 댓글