- SQL Mapping Framework다.
* SQL Mapping Framework는
SQL실행에 필요한 정보를 포함하고 있는 객체
SQL실행 결과를 저장하는 객체를
SQL과 매핑하면 해당 SQL를 실행시키고, 결과값을 반환하는 프레임워크다.
- ibatis의 후속 버전이다.
* ibatis와 많은 부분이 유사하다.
- mybatis의 주요 구성요소
Mapper 인터페이스
* 데이터베이스 엑세스 작업이 정의된 인터페이스다.
* 개발자가 작성한다.
* 예시
package com.sample.mapper;
public interface UserMapper {
void insertUser(User user);
void updateUser(User user);
List<User> getAllUsers();
User getUserById(String userId);
User getUserByEmail(String email);
}
package com.sample.mapper;
public inteface PostMapper {
void insertPost(Post post);
int getTotalRows(Map<String, Object> param);
List<PostListDto> getPosts(Map<String, Object> param);
PostDetailDto getPostDetailByNo(int postNo);
Post getPostByNo(int postNo);
void updatePost(Post post);
}
Mapper 파일
* SQL과 객체 매핑 정보가 정의된 XML 파일이다.
* Mapper 인터페이스의 전체이름을 namespace로 설정한다.
* 개발자가 작성한다.
* 예시
users.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sample.mapper.UserMapper">
<insert id="insertUser" parameterType="com.sample.vo.User">
insert into web_users (user_id, user_password, user_name, user_email)
values (#{id}, #{password}, #{name}, #{email})
</insert>
<select id="getUserById" parameterType="string" resultType="com.sample.vo.User">
select
user_id as id,
user_password as password,
user_name as name,
user_email as email,
user_enabled as enabled,
user_created_date as createdDate,
user_updated_date as updatedDate
from
web_users
where
user_id = #{value}
</select>
</mapper>
posts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sample.mapper.PostMapper">
<select id="getTotalRow" parameterType="map" resultType="int">
select
count(*)
from
web_posts
where
post_disabled = 'N'
<if test="opt != null and keyword != null">
<choose>
<when test="opt == 'title'">
and post_title like '%' || #{keyword} || '%'
</when>
<when test="opt == 'writer'">
and post_user_id in (select user_id from web_users where user_name = #{keyword})
</when>
<when test="opt == 'content'">
and post_content like '%' || #{keyword} || '%'
</when>
</choose>
</if>
</select>
</mapper>
* ibatis와 mybatis
- parameterClass -> parameterType, resultClass -> resultType으로 변경되었다.
- #파라미터명# -> #{파라미터명}로 변경되었다.
- dynamic 쿼리에서 <if>, <choose> ~ <when> ~ <otherwise>, <foreach> 태그를 사용해서 조건식처리, 반복처리가 가능해졌다.
- dynamic 쿼리에서 <where>, <set> 태그를 사용해서 불필요한 and와 ,를 제거할 수 있게 되었다.
Mapper 인스턴스
* Mapper 인터페이스를 구현한 객체다.
* 개발자가 구현하지 않는다.
* mybatis와 mybatis-spring 라이브러리에서 Mapper인터페이스를 구현한 객체를 자동으로 생성하고, 스프링 컨테이너의 빈으로 등록시킨다.
* 예시
Mapper 인터페이스
public inteface PostMapper {
void insertPost(Post post);
int getTotalRows(Map<String, Object> param);
List<PostListDto> getPosts(Map<String, Object> param);
PostDetailDto getPostDetailByNo(int postNo);
Post getPostByNo(int postNo);
void updatePost(Post post);
}
Mapper 인스턴스
public class PostMapperInstance implements PostMapper {
@Autowired
private SqlSessionFactory sqlSessionFactory;
public void insertPost(Post post) {
SqlSession session = sqlSessionFactory.openSession();
session.insert("com.sample.mapper.PostMapper.insertPost", post);
session.close();
}
public int getTotalRow(Map<String, Object> param) {
SqlSession session = SqlSessionFactory.openSession();
return session.selectOne("com.sample.mapper.PostMapper.getTotalRows", param);
session.close();
}
}
- mybatis의 주요 API
* 개발자가 직접 mybatis의 주요 API를 사용해서 코딩하는 경우는 절대 없다.
* SqlSessionFactoryBuilder
- mybatis 환경설정 파일을 읽어서 SqlSessionFactory 객체를 생성한다.
* SqlSessionFactory
- SqlSession 객체를 제공한다.
- 애플리케이션이 실행되는동안 싱글턴 객체로 관리되어야 한다.
- 주요 메소드
SqlSession openSession() : 새로운 SqlSession객체를 반환한다.
* SqlSession
- SQL를 실행하는 메소드를 제공하는 객체다.
- Sql를 실행할 때마다 SqlSessionFactory의 openSession() 메소드를 실행해서 새로운 SqlSession객체를 획득해서 사용하고, Sql 실행이 완료되면 close() 메소드를 호출해서 폐기한다.
- 주요 메소드
<T> T selectOne(String id, Object parameter)
결과값이 하나 조회되는 SELECT 문을 실행시키고, 값을 반환한다.
<E> List<E> selectList(String id, Object parameter)
결과값이 여러개 조회되는 SELECT문을 실행시키고, 값을 반환한다.
int insert(String id, Object parameter)
INSERT문을 실행시키고, 추가된 행의 갯수를 반환한다.
int update(String id, Object parameter)
UPDATE문을 실행시키고, 변경된 행의 갯수를 반환한다.
int delete(String id, Object parameter)
DELETE문을 실행시키고, 삭제된 행의 갯수를 반환한다.
void commit()
INSERT, UPDATE, DELETE 문의 실행결과를 테이블에 영구적으로 반영시킨다.
void rollback()
INSERT, UPDATE, DELETE 문의 실행의 테이블 반영을 취소시킨다.
void close()
SqlSession 객체를 폐기시킨다.
<T> T getMapper(Class<T> type)
type에서 지정한 Mapper 인터페이스를 구현한 Mapper 인스턴스를 반환한다.
예시)
Mapper 인터페이스 정의
public interface UserMapper {
void insertUser(User user)
}
Mapper 파일 정의
<mapper namespace="com.sample.mapper.UserMapper">
<insert id="insertUser" parameterType="com.sample.vo.User">
insert into web_users (user_id, user_password, user_name, user_email)
values (#{id}, #{password}, #{name}, #{email})
</insert>
</mapper>
Mapper 인스턴스 획득하기
SqlSession session = sqlSessionFactory.openSession();
UserMapper instance = session.getMapper(UserMapper.class);
* instance변수에는 UserMapper 인터페이스를 구현한 객체가 대입된다.
* mybatis-spring 라이브러리는 모든 Mapper인터페이스를 스캔해서 Mapper 인스턴스를 생성하고, 스프링 컨테이너의 빈으로 등록시킨다
mybatis 매퍼파일의 <where> 태그
==================================================================
= <where> 태그를 사용하지 않는 경우
==================================================================
select
*
from
web_products
where
<if test="deleted != null">
product_deleted = #{deleted}
</if>
<if test="minPrice > 0">
and product_price >= #{minPrice}
</if>
<if test="maxPrice > 0">
and product_price <= #{maxPrice}
</if>
<if test="categoryNo != null">
and product_category_no = #{categoryNo}
</if>
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
param.put("deleted", 'N');
param.put("minPrice", 10000);
select
*
from
web_products
where
product_deleted = #{deleted}
and product_price >= #{minPrice}
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
select
*
from
web_products
where -- 문법 오류가 발생한다.
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
param.put("minPrice", 10000);
param.put("maxPrice", 50000);
select
*
from
web_products
where
and product_price >= #{minPrice} -- 문법 오류가 발생한다.
and product_price <= #{maxPrice}
--------------------------------------------------------
==================================================================
= <where> 태그를 사용하는 경우
==================================================================
select
*
from
web_products
<where>
<if test="deleted != null">
product_deleted = #{deleted}
</if>
<if test="minPrice > 0">
and product_price >= #{minPrice}
</if>
<if test="maxPrice > 0">
and product_price <= #{maxPrice}
</if>
<if test="categoryNo != null">
and product_category_no = #{categoryNo}
</if>
</where>
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
param.put("deleted", 'N');
param.put("minPrice", 10000);
select
*
from
web_products
where
product_deleted = #{deleted}
and product_price >= #{minPrice}
* <where>과 </where>사이에 동적으로 추가되는 조건이 하나라도 있으면
where 키워드가 추가된다.
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
select
*
from
web_products
* <where>과 </where>사이에 동적으로 추가되는 조건이 하나도 없으면
where 키워드는 추가되지 않는다.
--------------------------------------------------------
Map<String, Object> param = new HashMap<>();
param.put("minPrice", 10000);
param.put("maxPrice", 50000);
select
*
from
web_products
where
product_price >= #{minPrice}
and product_price <= #{maxPrice}
* <where>과 </where>사이에 동적으로 추가되는 조건이 있고,
첫번째 조건에 and 키워드가 있으면, and를 제거한다.
--------------------------------------------------------
'학원 정리 > 스프링' 카테고리의 다른 글
spring mvc 프로젝트 생성하고, 홈페이지 연결하기 (0) | 2023.01.09 |
---|---|
스프링과 데이터베이스 엑세스 (0) | 2023.01.06 |
의존성 주입 (0) | 2023.01.04 |
Spring 개요 (0) | 2023.01.03 |
Maven (0) | 2023.01.02 |
댓글