MyBatis(INSERT, DELETE, UPDATE)
[ 정의 ]
- MyBatis는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다.
- 예전에는 iBatis라고 불리었으며 현재는 iBatis와 MyBatis는 완전히 다른 기능을 한다.
- 응용 프로그램 계층(자바) <-> 퍼시스턴스 계층(중간 계층, JDBC) <-> 데이터베이스 계층(오라클)
- 중간 계층 기술 중 하나이다.(JDBC, MyBatis, JPA, Hibernate, Spring JDBC .. 등)
- MyBatis는 SQL 구문을 XML파일에서 작성한다. (기존에는 xxxDAO() 에서 try-catch문 안에 만들었음)
[ 예제 - MyBatis를 이용해서 DB 조작하기 ]
- 기존에 만들어 두었던 tblMemo 테이블을 MyBatis를 통해서 insert, update, delete를 해보자
- 예제 작업 전 설정 작업 ( * Log4j: 데이터베이스 작업 중 관련된 로그를 출력하는 기능 )
1. pom.xml
- Java 버전에 맞게 변경
- Spring 버전에 맞게 변경
2. lib
- pom.xml
- ojdbc6.jar
- mybatis x n개
- log4j
3. web.xml
- 확장자 변경(*.action)
- 인코딩 필터 추가(UTF-8)
4. root-context.xml
- MyBatis 설정
- Log4j 설정 > 추가
5. servlet-context.xml
- 설정 없음
6. 파일 생성
- com.test.mybatis > MyBatisController.java, MyBatisDAO.java, MyBatisDTO.java
- com.test.mybatis.mapper > test.xml
- views > result.jsp
1) MyBatisController.java
@Controller
public class MyBatisController {
@RequestMapping(value = "/m1.action", method = { RequestMethod.GET })
public String m1(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
MyBatisDTO dto = new MyBatisDTO();
dto.setSeq("3");
dto.setName("김홍삼");
dto.setMemo("메모입니당.");
dto.setCategory("Mybatis");
// 반환값이 없는 쿼리(insert, update, delete)
int addResult = dao.add();
int delResult = dao.del();
int updateResult = dao.update(dto);
req.setAttribute("addResult", addResult);
req.setAttribute("delResult", delResult);
req.setAttribute("updateResult", updateResult);
return "result";
}
}
2) MyBatisDTO
import lombok.Data;
@Data
public class MyBatisDTO {
private String seq;
private String name;
private String memo;
private String regdate;
private String category;
}
3) MyBatisDAO
- SqlSessionTemplate은 기존 JDBC의 Statement + ResultSet + Mapping을 모두 합쳐놓은것과 동일하다.
- JDBC와 MyBatis의 반환값이 있는 쿼리와 반환값이 없는 쿼리 작성 비교
JDBC / MyBatis | 반환값이 있는 쿼리 | 반환값이 없는쿼리 |
JDBC 방식 | stat.executeUpdate(); | stat.executeQuery() |
MyBatis 방식 | template.insert(), template.delete(), template.update() |
template.selectXXX() |
@Repository
public class MyBatisDAO {
@Autowired
private SqlSessionTemplate template; // Statement + ResultSet + Mapping
// 반환값이 없는 쿼리 > insert, delete, update
// template.insert("") : 인자가 없는 쿼리
// template.insert("", obj) : 인자가 있는 쿼리
public int add() {
// 매개변수가 없는 반환값 없는 쿼리
return template.insert("test.m1");
}
public int del() {
// 매개변수가 있는 반환값 없는 쿼리
return template.delete("test.m2", 5);
}
public int update(MyBatisDTO dto) {
// 매개변수가 있는 반환값 없는 쿼리
return template.update("test.m3", dto);
}
}
4) test.xml
- MyBatis에서는 SQL구문을 xml파일에서 따로 형식에 맞게 작성한다.
- 매개변수가 넘어 올 때는 반드시 parameterType으로 자료형을 설정해야한다.
- 매개변수는 #{ } 형식으로 나타낸다. (호따옴표 사용 NO!!)
<?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">
<!--
<insert id=""></insert>
<update id=""></update>
<delete id=""></delete>
<select id=""></select>
-->
<!-- add -->
<insert id="m1">
insert into tblMemo (seq, name, memo, regdate, category)
values (seqMemo.nextVal, '홍길동', 'MyBatis 테스트', default, 'mybatis')
</insert>
<!-- delete -->
<delete id="m2" parameterType="Integer">
delete from tblMemo where seq = #{ seq }
</delete>
<update id="m3" parameterType="com.test.spring.mybatis.MyBatisDTO">
update tblMemo set
name = #{ name }, <!-- 넘어온 getName()을 name으로 줄여준다. -->
memo = #{ memo }, <!-- 어떤 자료형이든 호따옴표를 절대 붙이면 안된다.!! -->
category = #{ category }
where seq = #{ seq }
</update>
</mapper>
5) result.jsp
- 눈으로 결과값을 (0 or 1) 확인 하기 위한 페이지
<div>insert 작업 결과: ${ addResult }</div>
<div>delete 작업 결과: ${ delResult }</div>
<div>update 작업 결과: ${ updateResult }</div>
- 결과 페이지
- 위에서 설정한 MyBatis를 이용한 DB작업 insert, update, delete도 SQL-Developer를 확인하면 제대로 작업이 이루어 진걸 확인할 수 있다.
- 추가로 SQL구문을 작성하는 test.xml파일에서 m3를 보면 매개변수(dto)가 넘어왔으므로 parameterType="자료형"을 지정해줘야하는데 패키지명 까지 전부 적어줘야 적용이 된다. (여러 패키지에서 중복된 이름이 있을 수있기 때문에..)
[ parameterType Alias(별칭) 지정하기 ]
- 방금 위에서 얘기한것처럼 parameterType을 매번 패키지명까지 적어가면서 하기에는 굉장히 불편하다.
- 이러한 불편사항을 해결하기 위해 alias를 지정할 수 있다!
- 아래 코드에서 별칭 지정을 해준 com.test.mybatis.MyBatisDTO 클래스는 이제부터 parameterType="dto"으로 사용해도 동일하다!!
- webapp > WEB-INF > views > mybatis.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">
<!-- webapp > WEB-INF > mybatis.xml -->
<configuration>
<!-- Mapper에서 사용하는 자료형에 대한 별칭 만드는 작업 -->
<typeAliases>
<typeAlias type="com.test.mybatis.MyBatisDTO" alias="dto" />
</typeAliases>
</configuration>
MEMO>
# 스프링에서 어노테이션을 굉장히 많이 쓰는데 수업을 따라가면서 중간중간 많이 까먹는거같다. 어노테이션 잘 작성하자.
# xml파일에서 선언문 <?xml version="1.0" encoding="UTF-8"?> 앞에는 무조건 띄어쓰기, 공백, 엔터, 주석등... 오면 에러가 발생한다.
# 기존 JDBC을 사용해서 DB작업을 했을때와 오늘 배운 MyBatis를 사용해서 DB작업을 했을 때를 비교해보면 무조건 오늘 배운 MyBatis가 굉장히 편하고, 유지/보수가 쉽다는걸 알았다.
# 이제 곧 수료와 더불어 마지막 스프링 프로젝트와 취업 준비 + 수업이 동시에 이루어 져서 많이 어수선한거같다. 잘 마무리하자.
'교육 > Spring' 카테고리의 다른 글
Spring 개발자 수업 98일차(2) - 타일즈(Tiles) (0) | 2021.08.13 |
---|---|
Spring 개발자 수업 98일차(1) - MyBatis(SELECT) (0) | 2021.08.13 |
Spring 개발자 수업 97일차(2) - 간단한 메모장 만들기 (0) | 2021.08.12 |
Spring 개발자 수업 97일차(1) - Spring MVC Model DI (0) | 2021.08.12 |
Spring 개발자 수업 96일차(2) - 데이터 전송 + 데이터 수신하기 (0) | 2021.08.11 |
댓글