Developer N
[MyBatis] MyBatis란? 본문
728x90
마이바티스(MyBatis)란?
- 자바 객체와 SQL문 사이를 자동으로 매핑해주는 ORM(Object Relation Mapping) 프레임워크
- SQL 파일을 별도로 분리하여 관리 가능하며, 객체와 SQL 사이의 파라미터를 자동으로 매핑해주기 때문에 편리
- SQL 쿼리문을 그대로 사용하며 도메인 객체나 VO 객체 중심으로 개발 가능
특징
- JDBC의 기능을 대부분 제공 (자동으로 제공하므로 깔끔한 코드 유지 가능)
- SQL문과 프로그래밍 코드 분리 가능
- SQL 쿼리를 변경할 때마다 자바 코드를 수정하거나 따로 컴파일할 필요X
- SQL 작성과 관리 분담 가능
- 다양한 프로그래밍 언어 사용 가능 (Java, C#, .NET, Ruby)
Mapper XML File
- MaBatis Mapper XML (SQL Mapping XML) File은 실행할 SQL문을 정의해놓은 파일
- SQL문 실행을 위해 Parameter Object를 받아오거나 SQL문 실행 결과를 Result Object에 자동 바인딩하는 기능 등 제공
- Mapper XML File의 요소
요소 | 설명 |
<select> | 데이터를 조회하는 select 구문 작성하는 요소 |
<insert> | 데이터를 삽입하는 insert 구문 작성하는 요소 |
<update> | 데이터를 수정하는 update 구문 작성하는 요소 |
<delete> | 데이터를 삭제하는 delete 구문 작성하는 요소 |
- <select> 요소의 속성
속성 | 설명 |
id | 해당 구문 호출시 사용되는 값 각 sql문을 구분하는 유일한 식별자 (필수) |
parameterType | 해당 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스명이나 별칭 |
resultType | 해당 구문이 리턴하는 타입의 패키지 경로를 포함한 전체 클래스명이나 별칭 |
resultMap | <select> 외부에 정의된 Result Object(<resultMap>)를 참조하는 방법 |
parameterMap | <select> 외부에 정의된 Parameter Object(<parameterMap>)를 참조하는 방법 권장하지 않음 (parameterType 속성이나 Inline Parameter를 권장) |
flushCache | 이 속성값이 true이면, 구문이 호출될 때마다 캐시 지원 (기본값 false) |
useCache | 이 속성값이 true이면, 구문의 결과가 캐시됨 (기본값 true) |
timeout | 예외가 던져지기 전에 데이터베이스의 요청 결과를 기다리는 최대 시간 |
- <insert>, <update>, <delete>에는 resultType이 없고 row의 개수를 반환
- <insert> : 삽입된 행의 개수 반환
- <update> : 수정에 성공한 행의 개수 반환 (실패시 0 반환)
- <delete> : 삭제한 행의 개수 반환
#{}와 ${}의 차이
- #{}
- 파라미터가 String 형태로 들어와 값에 ' '가 자동으로 붙음
- PreparedStatement를 통해 악의적인 쿼리주입 예방 가능
- 보안차원에서 유리
- 주로 사용자의 입력을 전달할 때 사용
- ${}
- 값에 ' '가 자동으로 붙지않고 해당 칼럼의 자료형에 맞추어 파라미터의 자료형이 변경된다.
- Statement 방법으로 파라미터가 출력되어서 전달됨
- 의도적인 쿼리주입을 막을 수 없음
- SQL injection 보안 위험 발생 가능
- 주로 table명, column명 전달시 사용 (#{}의 경우 자동으로 ' '가 붙어 사용 불가)
728x90
'STUDY > DBMS' 카테고리의 다른 글
[MyBatis] MyBatis에서 insert 쿼리 등을 여러개 실행시키는 법 (0) | 2023.04.11 |
---|---|
[MyBatis] 동적 쿼리 foreach문 문법 정리 (0) | 2023.04.10 |
[SQL/MySQL] LPAD, RPAD 함수 : 특정 길이만큼 문자열 채우기 (0) | 2023.02.23 |
[SQL] ORDER BY에서 CASE문 사용 (0) | 2023.02.22 |
[SQL] WHERE 1=1을 사용하는 이유 (0) | 2023.02.22 |
Comments