(spring) MyBatis
💼📝🔑⏰ 📙📓📘📒🎓
예제 프로젝트 : mvc-demoweb-starter
💼 MyBatis?
객체와 테이블을 매핑하는 ORM과는 다르게 객체와 SQL문을 매핑하는 프레임워크
- 독자적인 질의 언어를 지원하지 않고 SQL 사용
▪ 장점
- 저수준 JDBC 코드의 복잡성 제거
- 친근한 SQL 기반으로 초기 학습곡선 완만
- 기존 데이터베이스와 호환성 높음
- Spring 프레임워크와 통합 기능 제공
- 성능 우수
📝 MyBatis 클래스
SqlSessionFactoryBuilder
: SqlSessionFactory를 생성하는 객체,mybatis-config.xml 설정 파일 사용SqlSessionFactory
: SqlSession을 생성하는 객체SqlSession
: SQL을 실행하는 객체 Mapper 파일의 매핑 정보 사용
📝 MyBatis 연동 스프링 클래스
SqlSessionFactoryBean
- SqlSessionFactoryBuilder를 사용해서 SqlSessionFactory 생성
- 스프링의 FactoryBean 인터페이스 구현 → getObject 메서드 재정의를 통해 SqlSessionFactory 객체 반환
SqlSessionTemplate
: SqlSession을 Wrapping한 객체
🔑 FactoryBean이란?
FactoryBean
:
- new로 만들수 없는 것들을
- FactoryBean으로 만들어 의존 객체들을 전부 만들어주는 SPRING 인터페이스이다.
💼 MyBatis - 스프링 연동 설정
📝 1. 의존성 패키지 등록 (pom.xml)
MyBatis Spring
,MyBatis
복사 pom.xml에 등록 작업
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 마이바티스와 스프링을 연동하는 패키지 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
📝 2. mybatis-config.xml 설정 파일 작성
/resources/mybatis-config.xml
: 파일 생성- mapper.xml 파일들을 등록 해놓는 작업
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--mapper.xml에 들어갈 vo의 별칭 설정 -->
<typeAliases>
<typeAlias type="com.demoweb.vo.Member" alias="Member"/>
</typeAliases>
<!-- SQL 매핑 파일 경로 지정 -->
<mappers>
<mapper resource="com/demoweb/mapper/MemberMapper.xml"/>
</mappers>
</configuration>
설정파일 주요 구성 요소
mappers
: SQL 매핑 파일 경로 지정properties
: 다른 요소에서 재사용 할 수 있도록 설정 정보를 분리 정의typeAliases
: 패키지명을 포함하는 클래스의 전체 경로명 대신 사용할 별명 지정
📝 3. mapper.xml 파일 작성
- /resources/패키지경로/○○○○Mapper.xml 파일 생성
- Controller 갯수만큼? 뭐 자유이긴 하다.
- SQL문이 작성 부분
- VO 객체와 데이터베이스 TABLE에 변환작업을 해주는 파일이다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demoweb.mapper.MemberMapper">
<select id="selectMemberByIdAndPasswd" parameterType="hashmap" resultType="Member">
SELECT memberid, email, usertype, active, regdate
FROM member
WHERE memberid = #{memberId} AND passwd = #{passwd}
</select>
<insert id="insertMember" parameterType="Member">
INSERT INTO member (memberid, passwd, email)
VALUES (#{memberId}, #{passwd}, #{email})
</insert>
<update id="updateMember" parameterType="Member">
UPDATE member
SET passwd = #{passwd}, email = #{email}
WHERE memberid = #{memberId}
</update>
</mapper>
📝 4. root-contex.xml에 빈 추가
- MyBatis 설정 작업
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
- MyBatis를 사용할 DAO에 의존성 주입
<bean id="memberDao"
class="com.demoweb.dao.MemberDao">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"></property>
</bean>
- root-context.xml파일에서 Namesspaces 텝 클릭후 mybatis 선택후 마이바티스에게 알려주는 작업
<mybatis-spring:scan base-package="com.demoweb.mapper"/>
📝 6. Mapper 인터페이스 생성
@Mapper
public interface MemberMapper {
void insertMember(Member member);
Member selectMemberByIdAndPasswd(HashMap<String, Object> params);
void updateMember(Member member);
}
- Mapper 어노테이션을 붙이면 꼭 root-context.xml에 컴포넌트 스켄이 설정되어 있는지 확인해야 된다!
📝 7. Dao에서 호출하는 작업
- mapper인터페이스를 자동 주입하라.
public class MemberDao {
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
//TODO 2번째 작업
@Autowired
private MemberMapper memberMapper;
public void insertMember(Member member) {
memberMapper.insertMember(member);
}
public Member selectMemberByIdAndPasswd(String memberId, String passwd) {
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("memberId", memberId);
params.put("passwd", passwd);
Member member = memberMapper.selectMemberByIdAndPasswd(params);
return member; //조회된 데이터를 저장항 Member 객체 반환
}
public void updateMember(Member member) {
memberMapper.updateMember(member);
}
}
mapper를 사용하면 DAO를 대체하기 때문에 사용하지 말라는 권장사항이 있음.
댓글남기기