MyBatis 프레임워크
자바 프로그래밍 언어를 위한 오픈 소스 데이터베이스 퍼시스턴스 프레임워크로
SQL 쿼리를 별도의 XML 파일 또는 어노테이션을 사용하여 선언함
Template 과 MyBatis의 차이점
Template - 템플릿을 임포트 해서 개발자가 상황에 맞게 사용함
MyBatis - 정해진 구조대로 개발을 해야함 즉, .xml 파일(설정 파일)이 필요함
MyBatis 사용하는 이유
기존 방식 | 변경된 방식 |
SQL 구문이 JAVA 내부에 존재 | SQL 구문을 .xml 파일로 설정하여 JAVA 외부로 별도 관리 |
SQL 구문을 수정하면 재컴파일 해야함 | xml 파일에서 설정하므로 컴파일이 바뀌지 않음 |
컴파일이 별도로 필요하지 않기 때문에 결합도가 낮아지고 SQL을 확인하고 싶으면 xml 파일을 열어보면 되기 때문에 응집도가 높아짐
실습
기존 실습에 MyBatis 프레임워크 적용시켜보기
> starter project 생성 시 MyBatis 의존성 추가하여 프로젝트 생성(사용할 DB 또한 체크 / 현재 MySQL 사용)
> application.properties에 설정 추가
#mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
mybatis 의 위치를 알려주는 명령어로 classpath:package/file명.xml 확장자를 가진 모든 애들의 위치를 설정 추가함
* .xml 파일과 같이 설정 관련된 파일을 mapper라고 부름
* classpath - Java 프로그램에서 클래스 파일을 찾는 경로를 지정하는 환경 변수
> mapper 패키지 및 .xml 파일들(DAO 개수만큼) 생성 (현재는 BoardDAO, MemberDAO 2개이므로 2개 생성)
아래의 xml 설정 파일은 이미 존재하는 스키마를 가져와서 작성한 것 (현재 내가 사용하고 있는 버전에 맞도록 사용해야함)
* src/main/resources를 classpath라고 함
스키마
어떤 환경에서 어떻게 적용될 지에 대한 사전 약속
BoardDAO.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="com.ryu.app.InterfaceBoardDAO">
<select id="selectAll" resultType="com.ryu.app.BoardDTO">
SELECT * FROM BOARD ORDER BY BID DESC
</select>
<select id="selectOne" resultType="com.ryu.app.BoardDTO">
SELECT * FROM BOARD WHERE BID=#{param1}
</select>
<insert id="insert">
INSERT INTO BOARD (MID, CONTENT) VALUES (#{MID}, #{CONTENT})
</insert>
<update id="update">
UPDATE BOARD SET CONTENT = #{CONTENT} WHERE BID = #{BID}
</update>
<delete id="delete">
DELETE FROM BOARD WHERE BID=#{BID}
</delete>
</mapper>
MemberDAO.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="com.ryu.app.InterfaceMemberDAO">
<select id="selectAll" resultType="com.ryu.app.MemberDTO">
SELECT * FROM MEMBER
</select>
<select id="selectOne" resultType="com.ryu.app.MemberDTO">
<choose>
<when test="searchCondition != null">
<if test="searchCondition.equals('중복확인')">
SELECT * FROM MEMBER WHERE MID=#{MID}
</if>
</when>
</choose>
SELECT * FROM MEMBER WHERE MID=#{MID} AND MPW=#{MPW}
</select>
<insert id="insert">
INSERT INTO MEMBER VALUES(#{MID}, #{MPW})
</insert>
<update id="update">
UPDATE MEMBER SET MPW = #{MPW} WHERE MID = #{MID}
</update>
<delete id="delete">
DELETE FROM MEMBER WHERE MID = #{MID}
</delete>
</mapper>
루트 엘리먼트
<mapper namespace="com.ryu.app.InterfaceMemberDAO">
어떤 클래스, 어떤 인터페이스를 구현하고 있는지를 명시해야함
또한, @Mapper 을 어떤 인터페이스에 작성하는지에 명시 (현재는 InterfaceMemberDAO.java)
내부 엘리먼트
<select id="selectAll" resultType="com.kim.app.BoardDTO">
SELECT * FROM BOARD ORDER BY BID DESC
</select>
일반적으로 5개가 존재함 (CRRUD)
<select>, <select>, <insert>, <delete>, <update>
- SQL 쿼리문은 대문자로 작성하는데, 이는 가독성을 높이기 위해 대문자로 작성함
- id 속성은 @Mapper에 존재하는 메소드명으로 작성함 (메소드 구분을 위해)
- resultType 속성은 반환 타입을 의미함 (RowMapper의 역할)
값 전달 방식
1. #{param1}, #{param2}, ... - 편하지만 값을 확인하기가 어려움
MemberDAO.xml
<delete id="delete">
DELETE FROM MEMBER WHERE MID = #{param1}
</delete>
InterfaceMemberDAO.java
@Mapper
public interface InterfaceMemberDAO {
BoardDTO delete(int mid); // #{param1} 방식
}
2. {BID} - 이름 지정 방식 (어떠한 값인지 알기 편하지만 별도의 설정이 필요함)
MemberDAO.xml
<delete id="delete">
DELETE FROM MEMBER WHERE MID = #{MID}
</delete>
InterfaceMemberDAO.java
@Mapper
public interface InterfaceMemberDAO {
boolean delete(@Param("MID")int mid); // #{BID} 방식
}
3. map 컬렉션을 통한 방식 - 첫번째 방법 #{param1}, #{param2}, ... 의 심화 방식
MemberDAO.xml
<update id="update">
UPDATE MEMBER SET MPW = #{MPW} WHERE MID = #{MID}
</update>
InterfaceMemberDAO.java
@Mapper
public interface InterfaceMemberDAO {
boolean update(Map<String, String> map);
}
위의 3개의 방법에 따라 InterfaceDAO의 형식도 변경됨
전체 코드
InterfaceMemberDAO.java
@Mapper
public interface InterfaceMemberDAO {
List<MemberDTO> selectAll(MemberDTO mDTO);
MemberDTO selectOne(Map<String, String> map);
boolean insert(Map<String, String> map);
boolean update(Map<String, String> map);
boolean delete(@Param("MID")String mid);
}
MemberDAO.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="com.ryu.app.InterfaceMemberDAO">
<select id="selectAll" resultType="com.ryu.app.MemberDTO">
SELECT * FROM MEMBER
</select>
<select id="selectOne" resultType="com.ryu.app.MemberDTO">
<choose>
<when test="searchCondition != null">
<if test="searchCondition.equals('중복확인')">
SELECT * FROM MEMBER WHERE MID=#{MID}
</if>
</when>
</choose>
SELECT * FROM MEMBER WHERE MID=#{MID} AND MPW=#{MPW}
</select>
<insert id="insert">
INSERT INTO MEMBER VALUES(#{MID}, #{MPW})
</insert>
<update id="update">
UPDATE MEMBER SET MPW = #{MPW} WHERE MID = #{MID}
</update>
<delete id="delete">
DELETE FROM MEMBER WHERE MID = #{MID}
</delete>
</mapper>
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 서비스 레이어 (0) | 2023.09.21 |
---|---|
[Spring Boot] GetMapping, PostMapping 어노테이션 (2) | 2023.09.20 |
[Spring Boot] 예외 처리 미루기 (MVC 패턴) (2) | 2023.09.20 |
[Spring Boot] DB 연결 방법 (0) | 2023.09.18 |
[Spring Boot] 데이터 유효성 검사 (2) | 2023.09.15 |