MyBatis 쿼리 (Oracle, MySQL)

쿼리 순서
-- 조회
<select id="selectBoardList" parameterType="java.lang.String" resultType="com.example.BoardVO">
    SELECT id, title, contents, count(created_id), created_date
      FROM board
     WHERE created_date = #{createdDate}
     -- created_id 를 기준으로 grouping 하는 나머지 컬럼들
     GROUP 
        BY id, title, contents, created_date
    -- grouping 하는것들의 조건
    HAVING count(created_id) > 0
    -- id로 내림차순, title 로 오름차순
     ORDER 
        BY id DESC, title ASC
     -- 0번째부터 10개 제한해서 보여줌 (한페이지에 게시글 열개인 첫번째 페이지)
     LIMIT 10 OFFSET 0
</select>

-- 리스트 파라미터로 조회
<select id="selectBoardList" parameterType="map" resultType="com.example.BoardVO">
    SELECT id, title, contents, count(created_id), created_date
      FROM board
     WHERE IN
        <foreach collection="boardList" item="id" separator="," open="(" cloes=")">
          #{id}
        </foreach>
</select>

-- 단건 삽입
<insert id="insertUser" parameterType="com.example.Board">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT 
      INTO board (id, title, contents, created_id, created_date) 
    VALUES (#{id}, #{title}, #{contents}, #{createdId}, #{createdDate})
</insert>

-- 다건 삽입
<insert id="insertUser" parameterType="map">
    INSERT 
      INTO board (id, title, contents, created_id, created_date) 
    VALUES
      	<foreach collection="boardList" item="board" separator="," open="(" cloes=")">
          #{id}, #{title}, #{contents}, #{createdId}, #{createdDate}
        </foreach>
</insert>

-- 수정
<update id="updateBoard" parameterType="com.example.UpdateBoard">
	UPDATE board
       SET title = #{title}
         , contents = #{contents}
         , update_date = NOW() -- MySQL
                         SYSTIMESTAMP AT TIME ZONE 'UTC' -- Oracle
</update>

 

문자열 연결
-- Oracle
-- LIKE 를 사용하여 '%' 를 붙이면 id 변수값으로 시작하는 모든 걸 검색 가능
SELECT * FROM board
WHERE id LIKE #{id}||'%'

-- MySQL
-- LIKE 를 사용하여 CONCAT 으로 '%' 를 붙이면 id 변수값으로 시작하는 모든 걸 검색 가능
SELECT * FROM board
WHERE id LIKE CONCAT(#{id}, '%')

 

if 문
-- MyBatis 는 if 문을 중첩해서 쓸 수 없으므로 choose 문 사용할 것.
SELECT * FROM board
<if test="abc != null and !''.equals(abc)">
	<choose>
    	<when test="letter == '알파벳'">
        	WHERE abc = #{letter}
        </when>
    	<when test="letter == '한글'">
        	WHERE ganada = #{letter}
        </when>
        <otherwise></otherwise>
    </choose>
</if>

 

 

Oracle 에서는 NULL은 NULL 하나만을 의미하지만 MySQL 에서는 NULL 과 ''(Empty String)과 'null' 이 다르다. 자바단에서 null 을 넘겨주면 문자열 null 이 들어가기 때문에 반드시 ''(Empty String) 으로 초기화해주고 체크하는 것이 좋다.

 

Mapper.xml 파일
-- Mapper 에서 MyBatis 의 xml 을 매핑 시킬 때
<mapper namespace="[Mapper.xml 파일 경로부터 이름 및 확장자까지]">

 . . .

</mapper>

 

Mapper.java 파일
// 조회
BoardVO selectBoardList(String createdDate);

// 리스트 파라미터로 조회
BoardVO selectBoardList(@Param("boardList") List<Long> boardList);

// 단건 삽입
Long insertUser(Board board);

// 다건 삽입
Long insertUser(@Param("boardList") List<Board> boardList);