일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 예외
- SQL입문
- 생성자
- 자바
- 숫자형식오류
- 웹 브라우저 전쟁
- 데이터베이스
- html
- DoitSQL
- 페이지분석
- 키-값 데이터베이스
- 웹브라우저 수용도
- 우아한테크
- 자바 예외
- dbms
- 배열 3요소
- 크롤링 오류
- DoitSQL입문
- 함수 선언
- Doit입문SQL
- 숫자 형식
- 배열 예제
- R1C3
- HTML역사
- 크롤링
- DoIt
- 함수
- SQL
- 자바 오류
- 예제
- Today
- Total
프로그래밍
[SpringBoot] day95 : MyBatis 프레임워크 본문
2023.09.25.월
MyBatis 프레임워크
지금까지 JDBC Util, Template를 사용하였다
이를 MyBatis 프레임워크를 적용해볼것이다
MyBatis 프레임워크이기 때문에 정해진대로 사용해야 한다
mapper
MyBatis 프레임워크는 설정과 관련된 파일인 mapper가 필요하다
mapper는 .xml 형식이다
기존에는 SQL문이 JAVA가 아님에도 JAVA 안에 존재했었다
이는 SQL문이 바뀐다면 JAVA 코드가 바뀌므로 결합도가 높아지며 재컴파일의 필요성이 높아진다
또한 SQL문과 JAVA 코드를 따로 관리할 수 있으므로 응집도가 높아져
유지보수에 유리해진다
MyBatis 설정
프로젝트를 설정할때 MyBatis 프레임워크를 추가해주었다
# MyBatis 설정
# mapper의 위치를 설정
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
application.properties 파일에서 MyBatis 설정을 해준다
mapper가 존재하는 위치를 알려주는 작업이다
위에서 명시한 위치에 src/mybatis.mapper 설정파일을 만들어준다
classpath:는 src/main/resources 경로를 의미한다
XML 설정
해당 코드의 1~4라인은 스키마이다
XML 파일은 환경설정 파일이므로
어떤 환경에 어떻게 적용될지에 대한 사전 약속이라고 생각하면 된다
6, 37라인의 <mapper>는 namespace를 설정한다
해당 XML 파일이 어떤 클래스 혹은 인터페이스를 구현하고 있는지 명시한다
주의해야할 점은 Interface로 가져오고 있다는 점이다
@Mapper 라는 어노테이션을 어떤 인터페이스에 작성했는지가 중요하다
내부 엘리먼트(요소, 태그)이다
일반적으로 5개(CRRUD)로 이루어져 있다
<select>
<insert>
<update>
<delete>
SQL 쿼리문은 가독성을 위하여 대문자로 작성한다
id는 mapper에 존재하는 메서드명이며
resultType 속성은 반환타입을 의미한다
(기존에는 ClassMap을 만들어 적용하였던 것)
값 전달 방식
SQL문 쿼리문에 값을 전달하는 방식은 크게 3가지가 있다
- #{param1}, #{param2}... 방식
- #{mid} 이름 지정 방식
- map 컬렉션을 통한 방식
1번 방식:
파라미터의 순서대로 지정하는 방식이다
들어갈 파라미터 값이 자명할때 지정한다
2번 방식:
파라미터 값을 지정하여 전달하는 방식이다
값 이름을 지정하여 전달할 수 있어 편할 수 있지만
인자 값이 늘어날 경우 복잡해질 수 있다
3번 방식:
map 컬렉션을 이용한 방식이다
2번 방식의 심화된 방식이며 인자가 늘어나는 것을 방지할 수 있다
코드 구현
<?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="com.jhyun.app.InterfaceMemberDAO">
<select id="selectAll" resultType="com.jhyun.app.MemberDTO">
SELECT * FROM MEMBER
</select>
<select id="selectOne" resultType="com.jhyun.app.MemberDTO">
<if test="mSearch != '로그인'">
SELECT * FROM MEMBER WHERE MID=#{mid}
</if>
<if test="mSearch == '로그인'">
SELECT * FROM MEMBER WHERE MID=#{mid} AND MPW=#{mpw}
</if>
</select>
<insert id="insert">
INSERT INTO MEMBER (MID, MPW) VALUES(#{mid}, #{mpw})
</insert>
<update id="update">
UPDATE MEMBER SET MPW = #{mpw} WHERE MID = #{mid}
</update>
<delete id="delete">
DELETE FROM MEMBER WHERE MID =#{param1}
</delete>
</mapper>
같은 메서드 내에 여러 쿼리가 존재할 경우 동적 쿼리를 이용할 수 있다
package com.jhyun.app;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface InterfaceMemberDAO {
public List<MemberDTO> selectAll(MemberDTO mDTO);
public MemberDTO selectOne(Map<String, String> map);
public boolean insert(Map<String, String> map);
public boolean update(Map<String, String> map);
public boolean delete(String mid);
}
package com.jhyun.app;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MemberService implements InterfaceMemberService {
@Autowired
private InterfaceMemberDAO mDAO;
@Override
public List<MemberDTO> selectAll(MemberDTO mDTO) {
// TODO Auto-generated method stub
return mDAO.selectAll(mDTO);
}
@Override
public MemberDTO selectOne(MemberDTO mDTO) {
Map<String, String> map = new HashMap<String, String>();
map.put("mid", mDTO.getMid());
map.put("mpw", mDTO.getMpw());
map.put("mSearch", mDTO.getMSearch());
return mDAO.selectOne(map);
}
@Override
public boolean insert(MemberDTO mDTO) {
Map<String, String> map = new HashMap<String, String>();
map.put("mid", mDTO.getMid());
map.put("mpw", mDTO.getMpw());
return mDAO.insert(map);
}
@Override
public boolean update(MemberDTO mDTO) {
Map<String, String> map = new HashMap<String, String>();
map.put("mid", mDTO.getMid());
map.put("mpw", mDTO.getMpw());
return mDAO.update(map);
}
@Override
public boolean delete(MemberDTO mDTO) {
return mDAO.delete(mDTO.getMid());
}
}
소스코드 보러가기
'자바 > Spring Boot' 카테고리의 다른 글
[SpringBoot] day93 : Service와 Interface (2) | 2023.09.21 |
---|---|
[Springboot] DB 연결 (0) | 2023.09.18 |
[SpringBoot] day89 : 유효성검사(Validator) (0) | 2023.09.15 |
[SpringBoot] day88 : 스프링부트 방식으로 MVC 구현(값 주고 받기) (1) | 2023.09.14 |
[SpringBoot] 스프링 VS 스프링부트(Spring VS SpringBoot) (0) | 2023.09.13 |