記錄

Spring+Mybatis+Tiles 2) Mybatis설정(.jsp, DTO, DAO, mapper(Emp.xml)) 본문

Web/Spring framework

Spring+Mybatis+Tiles 2) Mybatis설정(.jsp, DTO, DAO, mapper(Emp.xml))

surhommejk 2018. 5. 6. 01:18

addEmp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<body class="bg-dark">
<div class="container">
<div class="card card-login mx-auto mt-5">
<div class="card-header">직원추가</div>
<div class="card-body">
<form action="insertEmp.htm" method="POST">

<div class="form-group">
    <label for="empno">EMPNO</label>
    
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="EMPNO" class="form-control" id="empno" type="text" required="true" placeholder="필수 입력"/>
</div>
<div class="form-group">
    <label for="ename">ENAME</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="ENAME" class="form-control" id="ename" type="text">
</div>

    <div class="form-group">
    <label for="job">JOB</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="JOB" class="form-control" id="job" type="text">
</div>

    <div class="form-group">
    <label for="mgr">MGR</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="MGR" class="form-control" id="mgr" type="text" placeholder="입력예시 : 7788">
</div>

    <div class="form-group">
    <label for="hiredate">HIREDATE</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="HIREDATE" class="form-control" id="hiredate" type="text" placeholder="입력예시 : 2018-05-04">
</div>

    <div class="form-group">
    <label for="sal">SAL</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="SAL" class="form-control" id="sal" type="text">
</div>

    <div class="form-group">
    <label for="comm">COMM</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="COMM" class="form-control" id="comm" type="text">
</div>

    <div class="form-group">
    <label for="deptno">DEPTNO</label>
    <!-- 각 input tag의 name값과 이것이 담길 DTO의 변수명은 대소문자까지 정확히 일치해야 한다 -->
    <input name="DEPTNO" class="form-control" id="deptno" type="text">
</div>

</div>
<input type="submit" class="btn btn-primary btn-block" value="추가하기">
<a class="btn btn-primary btn-block" href="showallemp.htm">돌아가기</a>
</form>

</div>
</div>
</div>









EmpDto.java


public class EmpDto {
        
    private int EMPNO;
    private String ENAME;
    private String JOB;
    private int MGR;
    private String HIREDATE;
    private int SAL;
    private int COMM;
    private int DEPTNO;
    
// .... 아래는 getter, setter 자동 생성
// getter, setter 없으면 Mybatis 작동하지 않는다

// ..
// ..
// ..








EmpDao.java(interface)


public interface EmpDao {

/*
여기서 사용할 함수명은 mapper인 .xml에서
각 태그의 id값으로 사용된다

이를 통해 여기서 정의한 함수가
mapper에서 정의하는 sql과 이어지게 된다
*/


    List<EmpDto> getEmpList();
    List<EmpDto> getEmpList2(String empno);
    
    EmpDto getEmp(int num);
    EmpDto getEmp2(HashMap<String, String> map);

int insertEmp(EmpDto dto);
    int updateEmp(EmpDto dto);
    int deleteEmp(int empno);

}









Emp.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 이름 : DAO 가지는 interface 이름을 그대로 -->
<mapper namespace="kr.or.bit.dao.EmpDao">
<!--
select id="" 이름을 interface에서 가지는 함수명과 동일하게
parameterType="" 파라미터로 받을 타입(클래스 타입 포함) 명시
resultType : 함수의 결과로 return할 타입(클래스 타입 포함) 명시
-->

    <!-- 이 함수는 List를 return하지만 이런 경우 List의 구성요소를 resultType으로 명시한다 -->
    <!-- 그러면 알아서 리스트가 return된다. sql 자체가 복수의 row를 return하기 때문에 -->
    <!-- 하나의 row가 resultType이 되고 결국 함수 전체의 result는 List가 된다 -->
    <select id="getEmpList" resultType="kr.or.bit.dto.EmpDto">
    select * from emp
    </select>
    
    <select id="getEmpList2" resultType="kr.or.bit.dto.EmpDto">
        select * from emp where empno like '%' || #{empno} || '%'
    </select>
    
    
    <!-- 파라미터가 1개 일때는 생략이 가능하지만 가독성을 위해 써주는 것이 좋다 -->
    <select id="getEmp" parameterType="hashMap" resultType="kr.or.bit.dto.EmpDto">
        select * from emp where empno=#{empno}
    </select>
    
    <select id="getEmp2" parameterType="hashMap" resultType="kr.or.bit.dto.EmpDto">
        select * from emp
        
        <!-- where가 있을 때에는 이렇게 sql에 where을 쓰지 않고 태그로 감싼다 -->
            <where>
            
                <!-- controller에서 파리미터로 넣는 map의 key값을 그대로 쓰면 값을 받는다 -->
                <!-- 이 코드의 경우 column에 담기는 값이 String type 이므로 ""로 감싸주었다 -->
                <if test='column == "ENAME"'>
                    <!-- ${} 바인딩은 문자열 그대로 치환 #{} -->
<!-- #{} 바인딩은 자동으로 type에 맞게 ''로 감싸거나 그냥 치환 -->
                
    <!-- ename이 varchar2 type 이므로 #{}로 바인딩 -->
                    ename=#{KEYVALUE}
                </if>
        
                <if test='column == "EMPNO"'>
                    <!-- ${} 바인딩은 문자열 그대로 치환 #{} -->
<!-- #{} 바인딩은 자동으로 type에 맞게 ''로 감싸거나 그냥 치환 -->

                    <!-- empno가 number type이므로 ${}로 바인딩 -->
                    <!-- 하지만 sql은 number에 ''로 감싸도 작동은 한다-->
                    or empno=${KEYVALUE}
                </if>
                
            </where>
    </select>
    
    <insert id="insertEmp" parameterType="kr.or.bit.dto.EmpDto">
    INSERT into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (#{EMPNO},
#{ENAME}, #{JOB}, #{MGR}, #{HIREDATE}, #{SAL}, #{COMM}, #{DEPTNO})
    </insert>
    
    <update id="updateEmp" parameterType="kr.or.bit.dto.EmpDto">
    update emp set EMPNO=#{EMPNO}, ENAME=#{ENAME}, JOB=#{JOB}, MGR=#{MGR},
HIREDATE=TO_DATE(SUBSTR(#{HIREDATE},1,10),'YYYY-MM-DD'), SAL=#{SAL}, COMM=#{COMM},
DEPTNO=#{DEPTNO} where EMPNO=#{EMPNO}
    </update>
    
    <delete id="deleteEmp" parameterType="int">
    delete from emp where empno=#{empno}
    </delete>

</mapper>




유의사항 정리


1. input tag에서 보내줄 때 각 input tag의 name값과 DTO의 변수명 일치(대소문자까지)


2. DAO 인터페이스에서 정의한 함수명과 맵퍼에서 정의한 id값의 일치


3. DAO 에서 선언한 함수는 사용 여부를 떠나 모두 mapper에서 구현(의무)

   (만약 DAO에서 3개를 선언했는데 mapper에서 두 개만 정의해두면 에러 발생)


4. DAO 에서 정의한 parameter type과 return type을 mapper에서 일치시켜서 구현






+ a (service) (위 코드와 무관한 예시)

@Service
public class MemberService {
@Autowired
private SqlSession sqlsession;
public int insertMember(MemberDTO memberdto){
System.out.println("service insertmember");
int result = 0;
MemberDAO dao = sqlsession.getMapper(MemberDAO.class);
result = dao.insertMember(memberdto);
return result;
}
public String getlogin(String mid){
System.out.println("service getlogin");
String result = "";
MemberDAO dao = sqlsession.getMapper(MemberDAO.class);
result = dao.getlogin(mid);
return result;
}
}


Comments