예전에 Mybatis를 사용했을 때는 XML기반으로 작성했던 기억이었다. 공식 문서를 보니 Mybatis 3부터는 애노테이션 기반의 코드 작성도 가능하다고 한다.
애노테이션으로는 XML이 제공하는 모든 기능을 활용할 수는 없다고 한다. 하지만 요즘은 애노테이션 코드 작성이 더 익숙하기 때문에 우선 애노테이션 기반으로 간단하게 Mybatis를 활용해보았다.
Mybatis API
따라서 아래 제시되는 코드는 Mybatis의 기능을 완벽하게 사용할 목적보다는 Mybatis를 Jpa와 유사한 방식으로 사용해보기 위함이다.
@Mapper
interface EmployeeMapper{
@Select("SELECT * FROM employees WHERE emp_no = #{empNo}")
fun findByEmpNo(empNo: Int): Employee?
@Select("SELECT * FROM $EMPLOYEE_TABLE " +
"WHERE hire_date BETWEEN #{startDate} AND #{endDate} " +
"ORDER BY hire_date ASC " +
"LIMIT #{pageRequest.pageNumber}, #{pageRequest.pageSize}")
fun findBetweenStartDateAndEndDateOrderByASC(startDate: LocalDate, endDate: LocalDate, pageRequest: PageRequest): List<Employee>
@Delete("DELETE FROM $EMPLOYEE_TABLE " +
"WHERE emp_no = #{empNo}")
fun deleteEmployeeByEmpNo(empNo: Int): Boolean
}
@Mapper
interface EmployeeMapper{
//생략
@UpdateProvider(type = EmployeeSqlBuilder::class, method = "buildUpdateEmployee")
fun updateEmployee(
empNo: Int,
birthDate: LocalDate?,
firstName: String?,
lastName: String?,
gender: Gender?,
hireDate: LocalDate?
): Boolean
class EmployeeSqlBuilder {
fun buildUpdateEmployee(
empNo: Int,
birthDate: LocalDate?,
firstName: String?,
lastName: String?,
gender: Gender?,
hireDate: LocalDate?
): String {
return object : SQL() {
init {
UPDATE(EMPLOYEE_TABLE)
if (birthDate != null) SET("birth_date = #{birthDate}")
if (firstName != null) SET("first_name = #{firstName}")
if (lastName != null) SET("last_name = #{lastName}")
if (gender != null) SET("gender = #{gender}")
if (hireDate != null) SET("hire_date = #{hireDate}")
WHERE("emp_no = #{empNo}")
}
}.toString()
}
}
}
@Mapper
interface EmployeeMapper{
//생략
@Insert("INSERT INTO employees (birth_date, first_name, last_name, gender, hire_date) values(#{birthDate}, #{firstName}, #{lastName}, #{gender}, #{hireDate})")
@Options(useGeneratedKeys = true, keyColumn = "emp_no", keyProperty = "empNo")
fun saveEmployee(
employee: Employee
): Int
}