[MyBatis] MyBatis?
마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해
XML과 애노테이션을 사용할 수 있다.
(마이바티스3 문서: https://mybatis.org/mybatis-3/ko/index.html)
위에 설명은 마이바티스3 문서에서 나온 마이바티스에 대한 설명인데
한마디로 마이바티스라는 프레임워크를 사용하면 JDBC에서 사용했던 불편함을 개선할 수 있는 것이다.
즉, MyBatis는 자바 기반의 SQL 매퍼 프레임워크로, 개발자가 데이터베이스와 상호작용할 때 SQL을 직접 작성하면서도 번거로운 JDBC 코드(예: Connection, Statement 관리)를 단순화하도록 도와준다.
JAVA로 RDBMS를 연결해서 개발을 하면 JDBC라는 표준 API를 사용할 것이다.
그런데 이 JDBC로 사용하면 SQL을 실행할때마다 자원을 열고 닫고, SQL 코드가 JAVA코드안에서 작성되거나
호출하는 케이스가 늘어날수록 반복되는 코드가 늘어나고 지저분해진다.
마이바티스를 사용하면 SQL문을 XML로 분리할 수 있어 관리 측면에서 더 깔끔하고
HikariCP같은 커넥션풀 프레임워크와 연동해 SQL 실행시 자원을 열고 닫고하는 것도 해결하여 코드가 간결해지고
개발도 편하게 할 수 있다.
아래는 JDBC를 사용할때 예제 코드이다.
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String username = "root";
String password = "password";
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 데이터베이스 연결, SQL을 실행하기 위해 이렇게 연결을 직접 해줘야함
connection = DriverManager.getConnection(url, username, password);
// SQL 작성 및 실행
String sql = "SELECT id, name FROM users WHERE id = ?";
statement = connection.prepareStatement(sql);
statement.setInt(1, 1);
resultSet = statement.executeQuery();
// 결과 처리, 결과를 이렇게 직접 담아줘야함
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 자원 해제, 실행 후 이렇게 자원을 직접 해제해줘야함
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- MyBatis(3.0 이상)를 사용했을때 예제 코드
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" parameterType="int" resultType="com.example.model.User">
SELECT id, name FROM users WHERE id = #{id}
</select>
</mapper>
@Mapper
public interface UserMapper {
User findById(int id);
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(int id) {
return userMapper.findById(id); // 매퍼 호출
}
}
SQL, 호출객체, 비지니스 로직 등등을 분리해서 사용하니 더 간결해진 것을 알 수 있다.