스프링 4버젼에는 MyBatis/iBATIS(MyBatis의 옛날 이름)와의 연동기능이 포함되어 있지 않지만, MyBatis가 제공하는 모듈을 이용해 DataSource 및 트랜잭션 관리 기능을 MyBatis에 적용할 수 있다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis p91-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<!-- mybatis와 spring을 연결하는 역할 -->
<version>1.3.2</version>
</dependency>
<!-- p91 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id = "sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
<bean id = itemDao
class="패키지명.MyBatisItemDao">
<property name = "sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
<bean id = "purchaseOrderDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name = "mapperInterface"
value = "패키지명.PurchaseOrderDao"/>
<property name = "sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
다수의 매퍼 인터페이스를 검색해 자동으로 빈으로 등록할 때 사용됨
DB를 연결해주는 DAO 인터페이스를 만들면 mybatis의 스캔 기능에 의해 자동으로 Bean 객체로 등록된다.
매퍼 스캔 기능을 사용하려면 <mybatis:scan> 태그를 사용한다.
root-context.xml에 등록
<mybatis:scan base-package = "패키지 주소"/>
<!-- 예시 -->
<mybatis-spring:scan base-package="org.doit.ik.mapper"/>
package org.doit.ik.mapper;
import java.sql.SQLException;
import org.doit.ik.domain.MemberVO;
public interface MemberMapper {
public MemberVO getMember(String id) throws ClassNotFoundException, SQLException;
public int insert(MemberVO member) throws ClassNotFoundException, SQLException;
}
<?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="org.doit.ik.mapper.MemberMapper">
<!-- select는 반드시 resultType이 필요 -->
<select id = "getMember" resultType="org.doit.ik.domain.MemberVO">
SELECT *
FROM MEMBER
WHERE ID = #{id}
</select>
<insert id = "insert">
INSERT INTO MEMBER(ID, PWD, NAME, GENDER, BIRTH, IS_LUNAR, CPHONE, EMAIL, HABIT, REGDATE)
VALUES( #{id}, #{pwd}, #{name}, #{gender}, #{birth}, #{is_lunar}, #{cphone}, #{email}
, #{habit}, SYSDATE)
</insert>
</mapper>
package org.doit.ik.mapper;
import java.sql.SQLException;
import java.util.List;
import org.doit.ik.domain.NoticeVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public interface NoticeMapper {
//검색한 결과의 총 레코드 수를 반환하는 메서드
public int getCount(String field, String query) throws ClassNotFoundException, SQLException;
//페이징+공지사항 목록
public List<NoticeVO> getNotices(int page, String field, String query) throws ClassNotFoundException, SQLException;
//공지사항 삭제
public int delete(String seq) throws ClassNotFoundException, SQLException;
//공지사항 수정
public int update(NoticeVO notice) throws SQLException;
//공지사항 상세보기
public NoticeVO getNotice(String seq) throws ClassNotFoundException, SQLException;
//공지사항 작성
public int insert(NoticeVO notice) throws ClassNotFoundException, SQLException;
/*
* //트랜젝션 처리를 하기 위한 메서드 추가 public void insertAndPointUpOfMember(NoticeVO notice,
* String id) throws ClassNotFoundException, SQLException;
*/
void hitUp(String seq);
int getHit(String seq);
}
<?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="org.doit.ik.mapper.NoticeMapper">
<!-- select는 반드시 resultType이 필요 -->
<select id = "getCount" resultType="Integer">
<!-- ${전달된 값 그대로 적용} -->
<!-- #{전달된 값의 자료형에 맞게 변환} -->
SELECT COUNT(*) CNT
FROM NOTICES
WHERE ${field} LIKE '%${query}%'
<!-- field는 첫번째 매개변수라서 ${param1}이라고 쓸 수도 있다. -->
<!-- query는 두번째 매개변수라서 ${param2}이라고 쓸 수도 있다. -->
</select>
<select id = "getNotices" resultType="org.doit.ik.domain.NoticeVO">
<!-- int srow = 1 + (page-1)*15; // 1, 16, 31, 46, 61, ... an = a1 + (n-1)*d -->
<!-- int erow = 15 + (page-1)*15; //15, 30, 45, 60, 75, ... -->
SELECT *
FROM
(SELECT ROWNUM NUM, N.*
FROM (
SELECT *
FROM NOTICES
WHERE ${field} LIKE '%${query}%'
ORDER BY REGDATE DESC
) N
)
WHERE NUM BETWEEN (1 + (#{page}-1)*15) AND (15 + (#{page}-1)*15)
<!-- 여기는 전달받은 값이 들어가야 하니까 #{page} 사용 -->
</select>
<delete id = "delete">
DELETE
NOTICES
WHERE SEQ= #{seq}
</delete>
<update id = "update">
UPDATE NOTICES
SET TITLE= #{title}, CONTENT= #{content}
<if test="filesrc != null">
, FILESRC= #{filesrc}
</if>
WHERE SEQ= #{seq}
</update>
<select id = "getNotice" resultType="org.doit.ik.domain.NoticeVO">
SELECT *
FROM NOTICES
WHERE SEQ= #{seq}
</select>
<update id="hitUp">
UPDATE notices
SET hit = hit + 1
WHERE seq = #{ seq }
</update>
<select id="getHit" resultType="Integer">
SELECT hit
FROM notices
WHERE seq = #{ seq }
</select>
<insert id = "insert">
<selectKey order = "BEFORE" resultType="String" keyProperty="seq">
SELECT MAX(TO_NUMBER(SEQ))+1
FROM NOTICES
</selectKey>
INSERT INTO NOTICES
( SEQ, TITLE, CONTENT, WRITER, REGDATE, HIT, FILESRC)
VALUES
( #{seq}, #{title}, #{content}, #{writer}, SYSDATE, 0,
<!-- 첨부된 파일이 없을 경우 처리하는 코드 -->
#{filesrc, javaType=String, jdbcType=VARCHAR} )
</insert>
</mapper>
@Autowired
private MemberMapper memberDao;
@Autowired
private NoticeMapper noticeDao;