날아라쩡글이의 블로그입니다.
myBatis(SQL mapperFrameWork) 본문
중앙 HTA (2106기) story/spring java framwork story
myBatis(SQL mapperFrameWork)
날아라쩡글이 2021. 12. 30. 13:38728x90
반응형
myBatis란
SQL mapper Framwork 이다.
- [파라미터 객체]-[SQL]-[리절트 객체]
- paramether객체
- SQL실행에 필요한 값을 표현하는 객체
- result객체
- SQL실행결과 값을 표현하는 객체
- 예시
insert int employees(employee_id, first_name, last_name) values (employees.seq.nextval, ?, ?)
필요한 값이 2개가 필요하다.- 파라미터의 객체 : Employee 객체가 필요하다
- SQL 실행에 필요한 값을 Employee객체에 담을 수 있다.
- 리절트 객체는 없다.
- insert, update, delete작업은 조회하지 않는 작업으로 객체가 존재하지 않는다.
- 예시
delete from employees where department_id = ?
값이 1개 필요하다. 그리고 숫자이다.
- 파라미터 객체 : java.lang.Integer가 필요하다.
- 객체를 적어줘야하기 때문인데, myBatis에서 지원하는 문자로 int로 적어도 상관없다.
- 예시
select job_id, job_title, min_salary, max_salary
from jobs
where job_id = ?
값은 1개가 필요하고 문자열이다, 조회될 객체는 job객체가 필요하다.
- 파라미터 객체 : String 이다. java.lang.String 지원하는 문자로 소문자로 시작하는 string을 적어주어도 된다.
- 쿼리실행 후의 결과 값인 리절트 객체
- job객체의 컬럼명과 리절트 객체의 맴버변수가 동일한 이름이어야한다.
- class와 컬럼명은 직접적으로 바꿀 수 없지만, 컬럼이름에 별칭을 부여할 수 있다.
- 그래서 as로 변수명과 동일한 컬럼별칭을 전달해준다.
- select job_id as id, job_title as title, min_salary as minSalary , max_salary as maxSalary
from jobs
where job_id = ?
- 이렇게 값을 알려주는 것이 mapping이다.
- 쿼리 실행에 필요한 값을 어떤객체에 있는지 알려주는 것이다.
- parameter/SQL/result의 값만 적으면 myBatis의 문법으로 변환시켜준다.
- 예시
<insert id="메소드이름" parameterType="com.sample.vo.Employee">
//내가 실행하고 싶은 쿼리, parameter는 #{변수명}으로 적는다.
</insert>
<delete id="메소드이름" parameterType="java.lang.Integer" or "int">
<select id="메소드이름" parameterType="java.lang.String" or "string" resultType="com.sample.vo.Job">
//select의 result는 변수명과 쿼리별칭이 동일하게 적는다. - SQLmapping은 SQL에 필요한 객체를 myBatis로 보내는데, 모든 쿼리문마다 id가 달라야한다.
- 기본자료형은 #{value}처럼 작성하면 된다.
- insert, update, delete는 리절트객체를 아예 정의하지 않는다.
- select는 컬럼명과 resultType에서 지정한 클래스의 멤버변수명이 서로 다르면 값이 저장되지 않는다.
- 컬럼명에 별칭을 부여해서 resultType에서 지정한 객체의 변수명과 일치시켜야한다.
객체를 mapping하는 방법
메소드를 확인해서 List라면 객체가 여러개, List로 시작하지 않으면 객체가 1개의 값으로 반환된다.
parameterType과 resultType의 값을 전달하고 myBatis는 일치하는지 확인하고 쿼리를 실행하고 조회된 결과를 반환한다.
List<Book> searchBooksByPrice( int minPrice, int maxPrice);
mapper인터페이스의 메소드의 매개변수가 2개이상일 경우
- @param()어노테이션을 이용해서 인터페이스 매개변수 앞에 작성하면 SQL에 전달하는 파라미터 값의 이름을 지정할 수 있다.
- @Param을 사용해서 파라미터 이름을 지정했을 때 SQL구문을 정의하는 태그에서 parameterType의 속성을 작성할 필요없이 SQL 구문에 book_price >= #{minPrice} and book_price <= #{maxPrice} 직접 파라미터의 이름으로 작성하면 된다.
여러건의 select일 때
- <select id="getAllDepartment" resultType="com.sample.vo.Department">
select
department_id as id,
department_title as title,
manager_id as managerId
from departments
해당은 파라미터객체가 존재하지 않고
리절트객체는com.sample.vo.Department에 해당하는 객체에 담아서 보내주어야한다.
모양은 동일하게 작성하면 된다. 객체를 담고 하나 만들고 또 객체를 담고 하나를 만드는 것처럼 진행을 하기 때문이다. List<Department>라고 작성하면 안된다.
이렇게 작성하는 파일은 mapper file이라고 부른다.
mapper
- 실행할 쿼리를 SQL에 연결한다.
- SQL실행에 필요한 값을 표현하는 객체와 SQL실행 후 조회된 데이터를 저장하는 객체를 mapping시켜서 데이터베이스엑세스 작업을 수행하는 프레임워크이다.
- 장점
- 자바코드와 SQL코드를 분리할 수 있다.
- Jdbc작업에서 반복적으로 수행했던 커넥션을 획득하고 반납, preparedStatement를 획득 및 치환, ResultSet처리등의 작업을 myBatis가 대신 처리한다.
- myBatis, mybatis-spring 라이브러리를 활용하면 스프링프레임워크와 myBatis를 연동시킬 수 있다.
- 단점
- 데이터베이스가 변경되거나 테이블의 구조가 변경되면 관련된 SQL을 전부 수정해야한다.
- 테이블이 늘거나 줄어들면 수정해야한다.
- JPA는 그렇지 않다.
- SQL을 자동으로 Generator 한다.
- 잘 만들것이라는 보장이 없고, 자동으로 만들어지기 때문에 튜닝이 어렵다는 단점이 있다.
- 데이터베이스가 변경되거나 테이블의 구조가 변경되면 관련된 SQL을 전부 수정해야한다.
mybatis의 구성요소
- 3가지가 존재한다.
- mapperInterface
- 데이터베이스 엑세스 작업이 정의된 인터페이스이다.
public interface UserDao{
void insertUser(User user);
void updateUser(User user);
User getUserById(String id);
List<User> searchUserById(String name);
} - 이렇게 정의한다.
- SQL로 하고싶은 것을 정의해놓은 곳
- DAO를 만드는데, 인터페이스로 만드는 것이다.
- 데이터베이스 엑세스 작업이 정의된 인터페이스이다.
- mapperFile
- mapper인터페이스에서 정의한 데이터베이스의 엑세스 작업과 관련된 SQL이 정의된 xml이다.
- mapper파일에서 SQL과 파라미터객체, SQL의 리절트 객체를 mapping시킨다.
- mapper파일에서 작성하는 SQL구문의 id는 mapper인터페이스의 메소드 명과 일치해야한다.
- <mapper namespace="com.sample.dao.UserDao" >
//여기에는 인터페이스로 정의된 구문과 SQL구문을 작성한다.
</mapper> - mapper파일에서 작성하는 SQL구문의 parameterType과 mapper인터페이스에 정의된 메소드의 매개변수타입이 일치해야한다.
- mapper파일에서 작성하는 SQL구문의 resultType과 mapper인터페이스에 정의된 메소드반환타입이 일치해야한다.
(해당파일이 콜렉션일 때는 해당 콜렉션의 제네릭 타입이 일치해야한다. )
<select id="searchUserByName" parameterType="string" resultType="com.sample.vo.User">
List<User>여기가 일치해야한다.
- mapperInstance
- mybatis의 SQLSession의 getmapper(mapper인터페이스)메소드는mapper인터페이스를 구현한 객체를 반환한다.
이 객체를 mapper인스턴스라고 한다. - SQLSession의 getMapper()은 지정된 mapper 인터페이스와 서로 연관된 mapper파일을 참조해서 mapper파일에 정의된 SQL을 실행시킬 수 있는 구현객체를 생성한다.
- public class UserDao implements UserDao{
public void inserUser(User user){
sqlsession.insert("com.sample.dao.UserDao.insert.User", User);
}
} - 이렇게 자동으로 생성된다.
- 객체구현은 하지않고, 인스턴스 파일만 만들면 된다.
- mapper인터페이스를 구현한 구현객체는 SQLsession이 자동으로 생성하는 객체이다.
- mybatis의 SQLSession의 getmapper(mapper인터페이스)메소드는mapper인터페이스를 구현한 객체를 반환한다.
mybatis의 주요 요소
- SQLSessionFactoryBuilder
- SQLSessionFactory를 생성하는 객체다.
- SQLSessionFactory
- SQLSession을 생성하는 객체다
- SQLSession
- CRUD기능이 구현된 객체다.
- void insert(spring SQL구문 id, 파라미터 객체 );
- void update(spring SQL구문 id, 파라미터 객체 );
- void delete(spring SQL구문 id, 파라미터 객체 );
- Object selectOne(spring SQL구문 id, 파라미터 객체 );
- List selectList(spring SQL구문 id, 파라미터 객체 );
blog.mybatis.org 의 docs에서 한국어로 변경을 하고 사용서를 읽는다.
반응형
'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글
Project Object Model.xml설정, 로그설정 (0) | 2021.12.31 |
---|---|
myBatis-spring 실습 (xml환경 설정) (0) | 2021.12.30 |
어노테이션 설정하기 (0) | 2021.12.29 |
Spring 쿼리스트링 값, form값 읽어오기 (0) | 2021.12.29 |
web.xml, spring Container (0) | 2021.12.29 |
Comments