MyBatis 프레임워크
마이바티스는 SQL 기반 데이터베이스 액세스를 단순화하기 위해 설계된 자바 퍼시스턴스 프레임워크입니다. 마이바티스를 사용하면 SQL 쿼리와 자바 객체 간의 매핑을 XML 파일이나 어노테이션을 통해 정의할 수 있습니다. 스프링의 의존성 주입(Dependency Injection)과 마이바티스의 데이터베이스 액세스를 조합하여 웹 애플리케이션을 개발하는 데 효과적으로 활용됩니다.
라이브러리 설정
프로젝트 생성 → Available → MyBatis 검색 → MyBatis Framework 선택
build.gradle 파일에 의존성이 추가된 것을 확인할 수 있습니다.
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
#src/main/resource:mybatis/mapper/BoardDAO.xml
#src/main/resource:mybatis/mapper/MemberDAO.xml
application.properties
application.properties 파일에서 MyBatis 설정을 해줍니다. mapper가 존재하는 위치를 알려주는 작업입니다.
위에서 명시한 위치에 src/mybatis.mapper 설정파일을 만들어줍니다. classpath:는 src/main/resources 경로를 의미합니다.
XML 설정
해당 코드의 1~4라인은 스키마입니다. XML 파일은 환경설정 파일이므로 어떤 환경에 어떻게 적용될지에 대한 사전 약속이라고 생각하면 됩니다.
6~00라인의 <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 컬렉션을 이용한 방식입니다. 1번 방식의 심화된 방식이며 인자가 늘어나는 것을 방지할 수 있습니다.
코드 구현
<?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());
}
}
GitHub
https://github.com/Qkrwnsgus0522/SpringBoot