MyBatis를 사용하면 DB를 쉽게 다룰 수 있다
예시) preparedstatement 처럼 쿼리문을 복잡하게 입력하지 않고 실제 쿼리문과 유사하게 작성할수 있다.
preparedstatement : "UPDate users Set name=?,email=?,WHERE id =?"
MyBatis : UPDATE users Set name = #{name}, email = #{email}, WHERE id = #{id}
MyBatis의 또 하나의 장점은 동적 쿼리 작성이 가능하다
MyBatis 사용 방법 : 의존성 설정 -> DB 설정 -> MyBatis 설정 -> Mapper 인터페이스 작성 -> xml 작성 -> MyBatis 사용
MyBatis
- 데이터베이스를 쉽게 다룰 수 있도록 도와주는 오픈 소스 ORM(Object-Relational Mapping) 프레임워크 이다.
MyBatis의 사용 목적
- 데이터베이스 쿼리 <-> 프로그래밍 언어 코드를 분리하여 유지보수성과 생산성을 높이는 것
MyBatis의 주요 장점
- 유연성 : SQL 쿼리를 직접 작성할 수 있으므로 매우 유연하다. 또한, MyBatis는 동적 쿼리를 작성할 수 있다.
- 간결성 : MyBatis는 SQL 쿼리와 프로그래밍 코드를 분리하기 때문에 코드가 간결하져 유지보수에 용이하다
- 성능 : MyBatis는 캐시 기능을 제공하여 데이터베이스 연산 속도를 높일 수 있다.
- 다양한 데이터베이스 지원 : MyBatis는 다양한 데이터베이스에 대한 지원을 제공합니다.
동적 쿼리 (대표적인 장점 유연성)
- 동적 쿼리란, 실행 시점에 조건에 따라 SQL 쿼리를 동적으로 생성하는 것
- 이는 데이터베이스의 검색 조건이나 결과값 등이 동적으로 변화할 때 유용하게 사용됩니다.
- MyBatis에서는 동적 쿼리를 작성하기 위해 <if>, <choose>,<when>,<otherwise>,<foreach> 등 태그를 사용할 수 있다
// xml 파일
<select id="getUserList" resultType="User">
SELECT * FROM users
<where>
<if test="name != null"> // 동적 쿼리
AND name = #{name}
</if>
<if test="email != null"> // 동적 쿼리
AND email = #{email}
</if>
</where>
</select>
MyBatis 사용순서와 예제
1. 스프링 프로젝트 생성 후 필요한 의존성 추가
- spring-core
- spring-jdbc
- mybatis
- mybatis-spring
2. 데이터베이스(DB) 설정
- MyBatis는 JDBC로 DB 연결을 하기에 DB 연결 정보를 설정해야 한다.
- 스프링 설정(XML, properies 등)에 DB 연결 정보(DataSource) 등록
//root-context.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> // mysql 드라이버
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/> // mysql 사용
<property name="username" value="username"/> // 아이디
<property name="password" value="password"/> // 비밀번호
</bean>
3. MyBatis 설정
//root-context.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations"
value="classpath:/sqlmap/**/*_SQL.xml" />
<property name="configLocation"
value="/WEB-INF/mybatisAlias/mybatisAlias.xml" />
</bean>
<!-- 데이터베이스에 개별적으로 쿼리를 실행시키는 객체.이 객체를 통해 query를 실행함 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
4. MyBatis 매퍼 작성 후 등록
- MyBatis Mapper는 DB 쿼리와 <-> 자바 메서드()를 매핑하는 역할
- 데이터베이스에 접근하기 위한 SQL 쿼리를 작성하고, 이를 실행하는 자바 메서드를 정의합니다.
- 쉽게 말해 "XML에 SQL 쿼리들을 작성할 건데 그 SQL이 연결될 메서드들을 정의할 파일을 만들자"
package kr.or.ddit.mapper;
import java.util.List;
import java.util.Map;
import kr.or.ddit.vo.CertificateVO;
public interface CertificateMapper {
public int certificateTotal(Map<String, Object> map);
public List<CertificateVO> certificateVOList(Map<String, Object> map);
public int cerCreateAjax(CertificateVO certificateVO);
public int cerDeleteAjax(Map<String, Object> map);
public int cerUpdateAjax(Map<String, Object> map);
public int certificateCount(String stNo);
public int cerValidation(CertificateVO certificateVO);
}
5. Mapper 인터페이스와 연결된 xml 작성
- Mapper 속 메서드() 별로 SQL 쿼리문 작성
<!-- user_mapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<!-- 다른 메서드들에 대한 쿼리도 추가할 수 있다 -->
</mapper>
6. Mapper 사용
- Mapper 인터페이스를 스프링 Bean으로 등록하고 주입받아 사용
package kr.or.ddit.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import kr.or.ddit.mapper.ConsultingStudentMapper;
import kr.or.ddit.service.ConsultingStudentService;
import kr.or.ddit.vo.ConsultingRequestVO;
@Service
public class ConsultingStudentServiceImpl implements ConsultingStudentService {
@Autowired
ConsultingStudentMapper consultingStudentMapper;
//상담 신청 조회
@Override
public int getTotal(Map<String, Object> map) {
return this.consultingStudentMapper.getTotal(map);
}
//상담 신청 조회
@Override
public List<ConsultingRequestVO> list(Map<String, Object> map) {
return this.consultingStudentMapper.list(map);
}
//상담 내역
@Override
public int getTotalHis(Map<String, Object> map) {
return this.consultingStudentMapper.getTotalHis(map);
}
//상담 내역
@Override
public List<ConsultingRequestVO> listHis(Map<String, Object> map) {
return this.consultingStudentMapper.listHis(map);
}
//상담 내역 (상세)
@Override
public ConsultingRequestVO consultstudetail(String consulReqNo) {
return this.consultingStudentMapper.consultstudetail(consulReqNo);
}
//상담 수정
@Override
public int updateAjax(ConsultingRequestVO consultingRequestVO) {
return this.consultingStudentMapper.updateAjax(consultingRequestVO);
}
}
출처
https://ccomccomhan.tistory.com/m/130