mybatis 는 정말로 쉽다.
러닝커브가 매우 짧으며
그 투자된 학습시간에 비해 높은 생산성을 보인다
단순 문자열로 SQL 이라는 중요한 소스코드를 관리한다는 것은 큰 문제가 있다.
Mybatis는 SQL문을 자바소스코드에서 분리함과 동시에
SQL 문을 재사용 가능하게 하며
SQL 문을 파일로 분리하여 유지보수성을 높히며
도메인 과 릴레이션의 매칭을 통해 oop와 sql간 사상차이를 극복할수있게 도와준다.
위 파일중 mapper.xml 파일 한개를 가져왔다
이 소스코드를 훑어보면서 mybatis사용법을 익혀보자
<?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">
mybatis mapper 파일임을 정의 하고 있다.
<!DOCTYPE mapper
.. 이하생략 .. .dtd>
이라고 문서 타입을 정의하므로서
해당 문서 타입에 벗어나는 문법을 잡아서 빨간줄을 띄워줌으로서
우리는 mybatis 문법에 대한 에러를 잡을수있다.
<mapper namespace="com.kimsoungryoul.persistence.myblog.studyBoardMapper">
해당 매퍼파일의 고유한 이름을 정의하고있다.
우리는 namespace에 정의된 값으로 통해 자바클래스에서 쿼리문을 가져다 쓸수있다.
마치 int a=5;
prinf("%d",a); 라는 코드에서 a 라는 고유한 변수명으로 5라는 값을 가져다 쓰듯이
com.kimsoungryoul.persistence.myblog.studyBoardMapper 라는 고유값을 통해
해당 mapper 아래 여러 쿼리문들을 가져다 쓰는것이다.
<insert id="insert">
INSERT INTO studyboard
(writer, title,subtitle,
contents)
VALUES
(#{writer}, #{title}, #{subTitle}, #{contents})
</insert>
쿼리문 작성.. 우리는 해당 쿼리문을
com.kimsoungryoul.persistence.myblog.studyBoardMapper.insert라는 id값을 추가하여 가져다쓸수 있다.
<select id="get" resultMap="BoardResultMap">
SELECT * FROM studyboard
where
no=#{no}
</select>
<select id="list" resultMap="BoardResultMap">
SELECT * FROM studyboard
where no > 0
order by regdate desc
limit #{pageStart}, #{perPageNum}
</select>
<select id="searchlist" parameterType="hashmap" resultMap="BoardResultMap">
select B.* from studyboard B
inner join tbl_hashtag H
on
H.tag=#{keyword} AND B.no=H.b_no
order by regdate desc
limit
#{pageStart}, #{perPageNum}
</select>
<update id="update">
UPDATE studyboard
SET
modifieddate = #{modifiedDate},
writer = #{writer},
title = #{title},
contents = #{contents}
WHERE no =
#{no}
</update>
<delete id="delete">
DELETE FROM studyboard
WHERE no=#{no}
</delete>
<delete id="deleteAll">
DELETE FROM studyboard
</delete>
<select id="getB_no" resultType="Integer">
select no from studyboard
where
no=LAST_INSERT_ID()
</select>
<update id="likePlus">
UPDATE
studyboard
SET
likecnt=likecnt + 1
WHERE
b_no=#{b_no}
</update>
<update id="viewplus">
UPDATE
studyboard
SET
viewcnt=viewcnt + 1
WHERE
b_no=#{b_no}
</update>
<resultMap id="BoardResultMap" type="StudyBoard">
<id property="no" column="no" />
<result property="regDate" column="regdate" />
<result property="modifiDate" column="modifidate" />
<result property="title" column="title" />
<result property="subTitle" column="subtitle" />
<result property="writer" column="writer" />
<result property="contents" column="contents" />
<result property="likeCnt" column="likecnt" />
<result property="replyCnt" column="replycnt" />
<result property="viewCnt" column="viewcnt" />
<collection property="hashTagList" select="selectHashTag"
column="{no=no}" javaType="java.util.ArrayList" />
<collection property="attachmentList"
select="com.kimsoungryoul.persistence.study.boardAttachmentMapper.list"
column="{sb_no=no}" javaType="java.util.ArrayList" />
</resultMap>
<insert id="insertHashTag" parameterType="hashmap">
INSERT INTO tbl_hashtag (b_no, tag)
VALUES
<foreach collection="hashTagList" item="tag" open="" close=""
separator=",">
(LAST_INSERT_ID(), #{tag})
</foreach>
</insert>
<select id="selectHashTag" resultType="String">
select tag from
tbl_hashtag
where b_no=#{no}
</select>
<select id="hashTagListInBoardMenu" resultType="HashTagDTO">
select tag, count(tag) as tagcnt from tbl_hashtag group by tag order by count(tag) desc limit 0,4
</select>
<delete id="deleteHashTag">
delete from tbl_hashtag
where b_no=#{no}
</delete>
<delete id="deleteAllHashTag">
delete from tbl_hashtag
</delete>
<sql id="whereSql">
<where>
<if test="title != null and title !='' ">
AND title = #{title}
</if>
<if test="subTitle !=null and subTitle!=''">
AND subtitle=#{subTitle}
</if>
<if test="writer != null and writer !='' ">
AND writer = #{writer}
</if>
<if test="contents!=null and contents != '' ">
AND contents=#{contents}
</if>
<if test="no !=null and no !=0 ">
AND no= #{no}
</if>
</where>
</sql>
</mapper>