전체 메서드
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);
}
}
<insert> 데이터 삽입각 메서드 별로 정리
<insert id="m1">
insert into tblAddress values (seqAddress.nextVal, '홍길동', 20, '서울시 강남구', 'm')
</insert>
<insert id="m4" parameterType="adto">
insert into tblAddress values (seqAddress.nextVal, #{name}, #{age}, #{address}, #{gender})
</insert>
adto 타입의 객체에서 값을 추출하여 삽입한다.#{} 바인딩 문법을 사용하여 안전하게 입력 값을 설정한다.<delete> — 데이터 삭제<delete id="m2" parameterType="String">
delete from tblAddress where seq = #{seq}
</delete>
seq 값을 받아 해당 레코드를 삭제한다.#{}로 바인딩하여 SQL Injection을 방지한다.<update> — 데이터 수정<update id="m3" parameterType="map">
update tblAddress set age = #{age}, address = #{address} where seq = #{seq}
</update>
map 타입을 이용하여 동적으로 여러 값을 수정한다.<select> — 데이터 조회<select id="m5" resultType="Integer">
select count(*) from tblAddress
</select>
Integer 타입으로 반환된다.<select id="m6" parameterType="String" resultType="adto">
select * from tblAddress where seq = #{seq}
</select>
adto 타입 객체에 매핑한다.<select id="m7" resultType="String">
select name from tblAddress order by name asc
</select>
<select id="m8" resultType="adto">
select * from tblAddress order by name asc
</select>
<select id="m9" parameterType="String" resultType="Integer">
select count(*) from ${tableName}
</select>
${}를 사용하여 테이블명을 동적으로 삽입한다.${}는 식별자 바인딩이므로 SQL Injection 위험이 존재한다. 반드시 신뢰할 수 있는 값만 사용해야 한다.<select id="m10" parameterType="Integer" resultType="adto">
select * from tblAddress
<![CDATA[
where age < #{age}
]]>
</select>
< 같은 특수문자를 안전하게 사용하기 위해 CDATA 블록을 사용한다.<select id="m11" parameterType="String" resultType="adto">
select * from tblAddress where address like '%${word}%'
</select>
${}를 사용했으므로 입력값을 신중하게 검증해야 한다.<select id="m12" parameterType="String" resultType="adto">
select * from tblAddress
<if test="gender != 'all'">
where gender = #{gender}
</if>
</select>
gender 값이 "all"이 아니면 조건절이 추가된다.if 태그를 사용하여 상황에 따라 쿼리를 다르게 만든다.<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>