프로그래밍

[SpringBoot] day95 : MyBatis 프레임워크 본문

자바/Spring Boot

[SpringBoot] day95 : MyBatis 프레임워크

시케 2023. 9. 27. 10:02
728x90
반응형

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가지가 있다

  1. #{param1}, #{param2}... 방식
  2. #{mid} 이름 지정 방식
  3. 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());
	}

}
소스코드 보러가기
728x90
반응형
Comments