마이바티스 기본 설정
데이터베이스 연결 설정
JDBC 드라이버 클래스명
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
DB 연결 URL
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test characterEncoding=utf8&useSSL=false
DB 사용자 이름
spring.datasource.username=root
DB 비밀번호
spring.datasource.password=root
로깅 설정
마이바티스 로그 출력 위치, 콘솔로 출력
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
카멜 케이스 변환 활성화
mybatis: configuration: map-underscore-to-camel-case: true # 카멜 케이스 자동 변환
마이바티스 XML 파일 설정
마이바티스 XML 파일 경로 설정, resources/mapper 디렉토리에 모든 테이블 XML 파일 생성
mybatis.mapper-locations=classpath:mapper/**Mapper.xml
스프링에서 주석을 이용한 마이바티스 작업
마이바티스는 강력한 자바 데이터 영속성 프레임워크로, 주석을 통해 SQL 작업을 단순화할 수 있습니다. 다음에서는 @Mapper, @Select, @Insert, @Options, @Delete, @Update, @Results 및 @ResultMap을 포함한 일반적으로 사용되는 마이바티스 주석 및 사용법을 자세히 설명합니다.
1. @Mapper
@Mapper 주석은 인터페이스를 마이바티스 매퍼 인터페이스로 식별하는 데 사용됩니다. 이 주석은 마이바티스가 인터페이스를 찾아 구현 클래스를 생성할 수 있게 합니다.
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmployeeMapper {
// 메서드 정의
}
2. @Select
@Select 주석은 SQL 쿼리를 정의하는 데 사용됩니다. 인터페이스 메서드에 직접 쿼리 문을 지정할 수 있습니다.
import org.apache.ibatis.annotations.Select;
@Mapper
public interface EmployeeMapper {
@Select("SELECT * FROM employees WHERE employee_id = #{id}")
Employee getEmployeeById(int id);
}
3. @Insert
@Insert 주석은 삽입 작업을 실행하는 데 사용됩니다. @Select와 유사하게 메서드에 삽입 SQL 문을 직접 작성할 수 있습니다.
import org.apache.ibatis.annotations.Insert;
@Mapper
public interface EmployeeMapper {
@Insert("INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})")
void addEmployee(Employee employee);
}
4. @Options
@Options 주석은 SQL 문 실행 시 옵션을 구성하는 데 사용됩니다. 생성된 기본 키 값 사용, 업데이트용 SQL 유형 지정 등이 포함됩니다.
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
@Mapper
public interface EmployeeMapper {
@Insert("INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})")
@Options(useGeneratedKeys = true, keyProperty = "employeeId")
void addEmployee(Employee employee);
}
5. @Delete
@Delete 주석은 삭제 작업의 SQL 문을 정의하는 데 사용됩니다.
import org.apache.ibatis.annotations.Delete;
@Mapper
public interface EmployeeMapper {
@Delete("DELETE FROM employees WHERE employee_id = #{id}")
void removeEmployee(int id);
}
6. @Update
@Update 주석은 업데이트 작업의 SQL 문을 정의하는 데 사용됩니다.
import org.apache.ibatis.annotations.Update;
@Mapper
public interface EmployeeMapper {
@Update("UPDATE employees SET name = #{name}, position = #{position}, salary = #{salary} WHERE employee_id = #{id}")
void modifyEmployee(Employee employee);
}
7. @Results
@Results 주석은 쿼리 결과의 매핑 관계를 정의하는 데 사용됩니다. 일반적으로 @Select와 함께 사용되며 SQL 쿼리 결과의 열을 객체 속성에 매핑하도록 지정할 수 있습니다.
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;
@Mapper
public interface EmployeeMapper {
@Select("SELECT * FROM employees WHERE employee_id = #{id}")
@Results({
@Result(property = "name", column = "name"),
@Result(property = "position", column = "position"),
@Result(property = "salary", column = "salary")
})
Employee getEmployeeById(int id);
}
8. @ResultMap
@ResultMap 주석은 정의된 결과 집합 매핑을 참조하는 데 사용됩니다. 이것은 여러 쿼리에서 동일한 결과 매핑을 재사용하는 더 유연한 방법을 제공합니다.
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;
@Mapper
public interface EmployeeMapper {
@Results(id = "employeeResultMap", value = {
@Result(property = "employeeId", column = "employee_id"),
@Result(property = "name", column = "name"),
@Result(property = "position", column = "position"),
@Result(property = "salary", column = "salary")
})
Employee getEmployeeById(int id);
@Select("SELECT * FROM employees WHERE salary > #{salary}")
@ResultMap("employeeResultMap")
List<Employee> getEmployeesWithHigherSalary(int salary);
}
스프링에서 XML을 이용한 마이바티스 작업
XML 방식을 사용하여 마이바티스로 데이터베이스 작업을 수행하는 일반적인 패턴입니다. 다음에서는 마이바티스 구성, SQL 매핑 및 데이터베이스 작업 단계를 포함한 XML 방식으로 마이바티스를 구성하는 기본 단계와 예제를 설명합니다.
1. 마이바티스 의존성 추가
Maven을 사용하는 경우 pom.xml에 마이바티스 의존성을 추가할 수 있습니다:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version> <!-- 필요에 따라 버전 선택 -->
</dependency>
2. 마이바티스 구성 파일 생성
mybatis-config.xml 파일을 생성하여 마이바티스 전역 구성을 합니다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
<property name="username" value="your_username"/>
<property name="password" value="your_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="path/to/YourMapper.xml"/>
</mappers>
</configuration>
3. 매퍼 XML 파일 생성
SQL 문과 해당 매핑을 정의하는 매퍼 XML 파일을 생성합니다. 예를 들어 EmployeeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="selectEmployeeById" resultType="com.example.model.Employee">
SELECT * FROM employees WHERE employee_id = #{id}
</select>
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})
</insert>
</mapper>
4. 엔티티 클래스 생성
데이터베이스 테이블에 해당하는 엔티티 클래스를 생성합니다. 예를 들어 Employee.java:
package com.example.model;
public class Employee {
private int employeeId;
private String name;
private String position;
private double salary;
// Getters and Setters
}
5. 매퍼 인터페이스 생성
마이바티스 제공 메서드를 사용하기 위해 매퍼 인터페이스를 생성합니다. 예를 들어 EmployeeMapper.java:
package com.example.mapper;
import com.example.model.Employee;
import java.util.List;
public interface EmployeeMapper {
Employee selectEmployeeById(int id);
void insertEmployee(Employee employee);
}
6. 마이바티스를 이용한 데이터베이스 작업
메인 프로그램에서 SqlSessionFactory와 SqlSession을 사용하여 데이터베이스 작업을 수행합니다.
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class Main {
public static void main(String[] args) {
try {
// mybatis-config.xml 구성 파일 읽기
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// SqlSession 획득
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
// 직원 추가
Employee newEmployee = new Employee();
newEmployee.setName("Bob");
newEmployee.setPosition("Developer");
newEmployee.setSalary(75000.00);
mapper.insertEmployee(newEmployee);
sqlSession.commit(); // 트랜잭션 커밋
// 직원 조회
Employee employee = mapper.selectEmployeeById(1);
System.out.println(employee.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
데이터베이스 필드와 Java 속성 매핑 정의
마이바티스에서 XML 파일을 통해 데이터베이스 필드와 Java 속성의 매핑을 정의하는 것은 데이터 영속화를 구현하는 중요한 단계입니다. 이 매핑 프로세스는 SQL 결과 집합의 열을 Java 객체의 속성에 해당시켜 두 간의 데이터가 올바르게 변환되도록 보장합니다.
1. 데이터베이스 테이블과 Java 엔티티 클래스 생성
employees라는 데이터베이스 테이블이 있다고 가정하면, 구조는 다음과 같습니다:
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(100),
last_name VARCHAR(100),
department VARCHAR(100),
hire_date DATE
);
이 테이블에 해당하는 Java 엔티티 클래스 Employee를 생성합니다:
package com.example.model;
public class Employee {
private int employeeId;
private String firstName;
private String lastName;
private String department;
private Date hireDate;
// Getters and Setters
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
}
2. 매핑을 위한 매퍼 XML 파일 정의
매퍼 XML 파일에서 resultMap 요소를 사용하여 SQL 쿼리 결과와 Java 객체 필드 간의 매핑 관계를 정의합니다. 다음은 EmployeeMapper.xml 파일의 예시입니다:
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- 결과 매핑 정의 -->
<resultMap id="employeeResultMap" type="com.example.model.Employee">
<id property="employeeId" column="employee_id"/>
<result property="firstName" column="first_name"/>
<result property="lastName" column="last_name"/>
<result property="department" column="department"/>
<result property="hireDate" column="hire_date"/>
</resultMap>
<!-- 결과 매핑을 사용한 조회 -->
<select id="selectEmployeeById" resultMap="employeeResultMap">
SELECT employee_id, first_name, last_name, department, hire_date
FROM employees
WHERE employee_id = #{id}
</select>
<!-- 직원 추가 -->
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO employees (first_name, last_name, department, hire_date)
VALUES (#{firstName}, #{lastName}, #{department}, #{hireDate})
</insert>
</mapper>
3. 매핑 요소 설명
resultMap: 매핑 규칙 집합을 정의하는 데 사용됩니다.id는 매핑의 고유 식별자이고,type은 매핑될 Java 객체의 전체 정규화된 클래스명을 지정합니다.id와result:<id property="employeeId" column="employee_id"/>는 기본 키의 매핑 관계를 지정합니다.property는 Java 객체의 속성명에 해당하고,column은 데이터베이스 테이블의 열명에 해당합니다.<result property="firstName" column="first_name"/>는 데이터베이스의first_name열 값을 Java 객체의firstName속성에 매핑함을 나타냅니다.