https://qdgbjsdnb.tistory.com/228 저번 게시글에서 myBatis에서


사용하는 xml 파일을 게시했는데 그에대한 부연 설명


먼저 mybatis config, 기본설정 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>
    <settings>
        <!-- 만약에 null로 데이터가 전달 되었다면 빈칸이 아닌 null로 인식해라 라는 뜻 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
   
    <!-- vo 객체들의 풀 네임을 사용하기 번거롭기 때문에 별칭을 등록하는 부분 -->
    <typeAliases>
        <!-- 클래스에 대한 별칭 -->
        <typeAlias type="com.kh.mb.member.model.vo.Member" alias="Member"/>
        <typeAlias type="com.kh.mb.board.model.vo.Board" alias="Board"/>
        <typeAlias type="com.kh.mb.board.model.vo.Reply" alias="Reply"/>
    </typeAliases>
   
    <!-- DB 연결할 설정에 대한 정보를 선언하는 부분 -->
    <environments default="firstDev">
        <environment id="firstDev">
            <!-- 트랙잭션 매니저는 JDBC 혹은 MANAGED 둘 중 하나를 선택할 수 있음 -->
            <!-- JDBC는 JDBC가 commit과 rollback의 기능을 직접 사용 가능하게 하는 옵션(수동 commit) -->
            <!-- MANAGED는 트랙잭션에 대해 어떤 영향도 행사하지 않는다는 뜻(자동 commit) -->
            <transactionManager type="JDBC"/>
           
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"></property>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
                <property name="username" value="mybatis"/>
                <property name="password" value="mybatis"/>
            </dataSource>
        </environment>
    </environments>
   
    <mappers>
        <mapper resource="resources/mappers/member-mapper.xml"/>
        <mapper resource="resources/mappers/board-mapper.xml"/>
    </mappers>
   
</configuration>

출처: https://qdgbjsdnb.tistory.com/ [하위^^]


<?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>
    <settings>
        <!-- 만약에 null로 데이터가 전달 되었다면 빈칸이 아닌 null로 인식해라 라는 뜻 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
   
    <!-- vo 객체들의 풀 네임을 사용하기 번거롭기 때문에 별칭을 등록하는 부분 -->
    <typeAliases>
        <!-- 클래스에 대한 별칭 -->
        <typeAlias type="com.kh.mb.member.model.vo.Member" alias="Member"/>
        <typeAlias type="com.kh.mb.board.model.vo.Board" alias="Board"/>
        <typeAlias type="com.kh.mb.board.model.vo.Reply" alias="Reply"/>
    </typeAliases>
   
    <!-- DB 연결할 설정에 대한 정보를 선언하는 부분 -->
    <environments default="firstDev">
        <environment id="firstDev">
            <!-- 트랙잭션 매니저는 JDBC 혹은 MANAGED 둘 중 하나를 선택할 수 있음 -->
            <!-- JDBC는 JDBC가 commit과 rollback의 기능을 직접 사용 가능하게 하는 옵션(수동 commit) -->
            <!-- MANAGED는 트랙잭션에 대해 어떤 영향도 행사하지 않는다는 뜻(자동 commit) -->
            <transactionManager type="JDBC"/>
           
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"></property>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
                <property name="username" value="mybatis"/>
                <property name="password" value="mybatis"/>
            </dataSource>
        </environment>
    </environments>
   
    <mappers>
        <mapper resource="resources/mappers/member-mapper.xml"/>
        <mapper resource="resources/mappers/board-mapper.xml"/>
    </mappers>
   
</configuration>




위와 같이 설정 파일을 구성하였다.


이해한대로 키워드를 설명하면


- mybatis를 사용하기 위한 기본 선언


<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">




- <configuration> 설정 파일 내용( 전체를 감싸고 있음 )


- <settings> mybatis 기본 설정 중 널처리에 관련된 설정


- <typeAliases> mybatis에서 프로그램단에서 작성한 객체를 사용하기 위한 선언


- <environments>, <transactionManager>, <dataSource>, <property> 사용할 DB에 대한 정보를 선언


- <mappers> DB를 사용하기 위한 정보와 쿼리문들을 선언한 xml 파일의 경로를 선언







다음은 쿼리문이 들어있는 xml 파일



<?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="Member">
    <resultMap type="com.kh.mb.member.model.vo.Member" id="memberResultSet">
        <id property="mid" column="MID"/>
        <result property="userId" column="USER_ID"/>
        <result property="userPwd" column="USER_PWD"/>
        <result property="userName" column="USER_NAME"/>
        <result property="email" column="EMAIL"/>
        <result property="birthDay" column="BIRTHDAY"/>
        <result property="gender" column="GENDER"/>
        <result property="phone" column="PHONE"/>
        <result property="address" column="ADDRESS"/>
        <result property="enrollDate" column="ENROLL_DATE"/>
        <result property="modifyDate" column="MODIFY_DATE"/>
        <result property="status" column="STATUS"/>
    </resultMap>
   
    <select id="loginMember" parameterType="Member" resultMap="memberResultSet">
        SELECT *
        FROM MEMBER
        WHERE USER_ID = #{userId}
        AND USER_PWD = #{userPwd}
    </select>
   
    <insert id="insertMember" parameterType="Member">
        INSERT INTO member
        VALUES (SEQ_MID.NEXTVAL, #{userId}, #{userPwd}, #{userName}, #{email}, #{birthDay}, #{gender}, #{phone}, #{address}, SYSDATE, SYSDATE, DEFAULT)
    </insert>
   
   
</mapper>







- <mapper> mybatis config xml에서 불러올 부분, 이름을 지정해서 찾는다.


- <resultMap> Sql DB 조회 결과를 만들어둔 java 객체파일과 연결시켜서 해당하는 값 = 컬럼 관계를 선언


   id를 지정하여 사용, 여러개를 만들어 유동적으로 사용할 수 있다.( 같은 객체 또한 가능 )


- <select>, <insert>, <update> 등등 sql 쿼리문이 들어가는 영역, id를 지정하여 java에서 불러올 때 찾으며


   parameterType으로 매개변수를 설정하고 resultMap으로 반환할 대상을 정한다.






SQL 쿼리문이 들어가는 영역은 줄넘김을(Enter) 허용한다.


EL 태그와 비슷하게 메소드를 통해서 전달받은 객체를 사용할 수 있다.


또한 여기서 사용할 수 있는 태그 조건문 같은 태그가 따로 있다.


다음 예를 보자


    <!-- 게시글 수 조회용 쿼리문 -->
    <select id="selectListCount" resultType="_int">
        SELECT COUNT(*)
        FROM board
        WHERE status = 'Y'
    </select>
   
    <!-- 게시물 목록 조회용 쿼리문 -->
    <select id="selectBoardList" resultMap="boardResultSet">
        SELECT *
        FROM board b
        JOIN member m ON (b.bwriter = m.mid)
        WHERE b.status = 'Y'
        ORDER BY bid DESC
    </select>
   
    <!-- 조회수 증가용 쿼리문 -->
    <update id="updateBoardCount" parameterType="_int">
        UPDATE board
        SET bCount = (SELECT bCount FROM board WHERE bid = #{bid}) + 1
        WHERE bid = #{bid}
    </update>
   
    <!-- 상세보기용 쿼리문 -->
    <select id="selectBoardOne" parameterType="_int" resultMap="boardResultSet2">
        SELECT *
        FROM board b
        JOIN member m ON(b.bWriter = m.mid)
        LEFT JOIN reply r ON (r.ref_bid = b.bid)
        WHERE b.bid = #{bid}
        AND b.status = 'Y'
        ORDER BY rid DESC
    </select>
   
    <!-- 검색 결과 수 조회용 쿼리문 -->
    <select id="selectSearchResultCount" resultType="_int">
        SELECT COUNT(*)
        FROM board b
        JOIN member m ON (b.bWriter = m.mid)
        WHERE b.status = 'Y'
        <!-- <if test="writer != null">
            AND user_name = #{ writer }
        </if>
        <if test="title != null">
            AND bTitle LIKE '%' || #{title} || '%'
        </if>
        <if test="content != null">
            AND bContent Like '%' || #{content} || '%'
        </if> -->
        <choose>
            <when test="writer != null">
                AND user_name = #{writer}
            </when>
            <when test="title != null">
                AND bTitle LIKE '%' || #{title} || '%'
            </when>
            <otherwise>
                AND bContent LIKE '%' || #{content} || '%'
            </otherwise>
        </choose>
    </select>
   
    <!-- 만약 쿼리문 안에 < 기호가 포함된다면 연산자로 인식하지 않고 태그로 인식한다. -->
    <!-- 이걸 해결해 주기 위해서 쿼리문을 cdata 주석으로 감싸야 한다. -->
    <!--
    <![CDATA[
        <
    ]]>
     -->
     
     <!-- 게시물 검색 결과 조회용 메소드 -->
     <select id="selectSearchResultList" resultMap="boardResultSet">
         SELECT *
         FROM board b
         JOIN member m ON (b.bwriter = m.mid)
         WHERE b.status = 'Y'
         <choose>
             <when test="writer != null">
                 AND user_name = #{writer}
             </when>
             <when test="title != null">
                 AND bTitle LIKE '%' || #{title} || '%'
             </when>
             <otherwise>
                 AND bContent LIKE '%' || #{content} || '%'
             </otherwise>
         </choose>
         ORDER BY bid DESC
     </select>



#{ 객체 필드값 } 과 같이 값을 원하는 부분에 사용하고


<if> 태그, <choose>, <when>, <otherwise> 태그가 있고


    <![CDATA[

<
    ]]>


위의 CDATA를 통해서 xml에서 <> 꺽쇠 키워드를 방지 할 수 있다.




- <if> if는 java에서 사용하는 if와 같이 쓰인다. else는 따로 없는듯


- <choose>, <when>, <otherwise> java에서의 switch case 문과 비슷한 역할을 한다.




그런데 만약 choose 문에서 WHERE 라고 쓰고 조건문을 넣었는데


해당하는 조건이 없어서


SELECT * FROM 테이블 WHERE


위와같이 입력되면 안되기 때문에


아예 WHERE 키워드 뒤에 1=1 을 넣어서 방지하거나


<WHERE>태그를 사용하여 감싸면 조건이 true 일때 WHERE을 따로 입력해준다.




+ Recent posts