[Spring] 15. MyBatis SQL Mapper 정리

Dami·2025년 4월 27일

전체 메서드

package com.test.mybatis.model;

import java.util.HashMap;
import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class MyBatisDAOImpl implements MyBatisDAO {

	private final SqlSessionTemplate template;

	
	@Override
	public void m1() {
	
		//반환값(X), 인자값(X)
		template.insert("mybatis.m1");		
	}
	
	@Override
	public int m2(String seq) {
		
		//반환값(X), 인자값(O)
		return template.delete("mybatis.m2", seq);
	}	
	
	@Override
	public int m3(HashMap<String, String> map) {
		
		//반환값(X), 인자값(O)
		return template.update("mybatis.m3", map);
	}
	
	@Override
	public int m4(AddressDTO dto) {
		
		//반환값(X), 인자값(O)
		return template.insert("mybatis.m4", dto);
	}
	
	@Override
	public int m5() {
		
		//반환값(O), 인자값(X)
		//- 단일값 반환(1행 1열)
		return template.selectOne("mybatis.m5");
	}
	
	@Override
	public AddressDTO m6(String seq) {
		
		//select > 레코드(오라클 데이터) > 매핑 > AddressDTO(자바 데이터)
		return template.selectOne("mybatis.m6", seq);
	}
	
	@Override
	public List<String> m7() {
		
		return template.selectList("mybatis.m7");
	}
	
	@Override
	public List<AddressDTO> m8() {
		
		return template.selectList("mybatis.m8");
	}
	
	@Override
	public int m9(String tableName) {
		
		return template.selectOne("mybatis.m9", tableName);
	}
	
	@Override
	public List<AddressDTO> m10(int age) {
		
		return template.selectList("mybatis.m10", age);
	}
	
	@Override
	public List<AddressDTO> m11(String word) {
		
		return template.selectList("mybatis.m11", word);
	}
	
	@Override
	public List<AddressDTO> m12(String gender) {
		
		//1. gender = "m"
		//2. gender = "f"
		//3. gender = "all"
		
		return template.selectList("mybatis.m12", gender);
	}
	
	@Override
	public List<AddressDTO> m13(AddressDTO dto) {
		
		return template.selectList("mybatis.m13", dto);
	}
	
}

1. <insert> 데이터 삽입

각 메서드 별로 정리

m1: 고정 데이터 삽입

<insert id="m1">
    insert into tblAddress values (seqAddress.nextVal, '홍길동', 20, '서울시 강남구', 'm')
</insert>
  • 특징: 고정된 값을 삽입한다.
  • 설명: 파라미터 없이 INSERT문을 실행한다.

m4: DTO 기반 삽입

<insert id="m4" parameterType="adto">
    insert into tblAddress values (seqAddress.nextVal, #{name}, #{age}, #{address}, #{gender})
</insert>
  • 특징: adto 타입의 객체에서 값을 추출하여 삽입한다.
  • 설명: #{} 바인딩 문법을 사용하여 안전하게 입력 값을 설정한다.

2. <delete> — 데이터 삭제

m2: 단일 레코드 삭제

<delete id="m2" parameterType="String">
    delete from tblAddress where seq = #{seq}
</delete>
  • 특징: seq 값을 받아 해당 레코드를 삭제한다.
  • 설명: 조건문은 반드시 #{}로 바인딩하여 SQL Injection을 방지한다.

3. <update> — 데이터 수정

m3: Map 기반 수정

<update id="m3" parameterType="map">
    update tblAddress set age = #{age}, address = #{address} where seq = #{seq}
</update>
  • 특징: map 타입을 이용하여 동적으로 여러 값을 수정한다.
  • 설명: 입력된 age, address 값을 지정된 seq 레코드에 업데이트한다.

4. <select> — 데이터 조회

단일 값 조회

m5: 레코드 수 조회

<select id="m5" resultType="Integer">
    select count(*) from tblAddress
</select>
  • 특징: 테이블 전체 레코드 개수를 조회한다.
  • 설명: 결과는 Integer 타입으로 반환된다.

단일 레코드 조회

m6: seq로 레코드 조회

<select id="m6" parameterType="String" resultType="adto">
    select * from tblAddress where seq = #{seq}
</select>
  • 특징: seq 값을 통해 특정 레코드를 조회한다.
  • 설명: 조회 결과를 adto 타입 객체에 매핑한다.

다중 레코드 조회

m7: 이름 리스트 조회

<select id="m7" resultType="String">
    select name from tblAddress order by name asc
</select>
  • 특징: 이름만 조회하여 문자열 리스트로 반환한다.

m8: 전체 주소록 조회

<select id="m8" resultType="adto">
    select * from tblAddress order by name asc
</select>
  • 특징: 모든 주소록 레코드를 조회하여 객체 리스트로 반환한다.

동적 테이블명 조회

m9: 테이블명 변수 바인딩

<select id="m9" parameterType="String" resultType="Integer">
    select count(*) from ${tableName}
</select>
  • 특징: ${}를 사용하여 테이블명을 동적으로 삽입한다.
  • 주의사항: ${}는 식별자 바인딩이므로 SQL Injection 위험이 존재한다. 반드시 신뢰할 수 있는 값만 사용해야 한다.

연산자 포함 조회

m10: 나이 조건 조회 (CDATA 사용)

<select id="m10" parameterType="Integer" resultType="adto">
    select * from tblAddress
    <![CDATA[
        where age < #{age}
    ]]>
</select>
  • 특징: < 같은 특수문자를 안전하게 사용하기 위해 CDATA 블록을 사용한다.

LIKE 검색 조회

m11: 주소에 키워드 포함된 레코드 조회

<select id="m11" parameterType="String" resultType="adto">
    select * from tblAddress where address like '%${word}%'
</select>
  • 특징: 검색 키워드를 포함하는 주소를 조회한다.
  • 주의사항: ${}를 사용했으므로 입력값을 신중하게 검증해야 한다.

5. 동적 SQL 활용

성별 필터링 (m12)

<select id="m12" parameterType="String" resultType="adto">
    select * from tblAddress
    <if test="gender != 'all'">
        where gender = #{gender}
    </if>
</select>
  • 특징: gender 값이 "all"이 아니면 조건절이 추가된다.
  • 설명: if 태그를 사용하여 상황에 따라 쿼리를 다르게 만든다.

복합 조건 검색 (m13)

<select id="m13" parameterType="adto" resultType="adto">
    select * from tblAddress where 1=1
    <if test="age != null">
        and age > #{age}
    </if>
    <if test="gender != null">
        and gender = #{gender}
    </if>
    <if test="address != null">
        and address like '%' || #{address} || '%'
    </if>
</select>
  • 특징: 여러 조건을 조합하여 동적 WHERE 절을 생성한다.
  • 설명: 파라미터로 전달된 값이 있는 경우에만 해당 조건이 추가된다.

0개의 댓글