ABOUT ME

이상한 질문 많이 하고, 배움도 느리지만 조금이라도 더 나아가려는 사람.

Today
Yesterday
Total
  • MyBatis 쿼리 (Oracle, MySQL)
    Back-End/SQL 2025. 2. 18. 23:17
    쿼리 순서
    -- 조회
    <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);

     

Designed by Tistory.