https://qdgbjsdnb.tistory.com/228 저번 게시글에서 myBatis에서
사용하는 xml 파일을 게시했는데 그에대한 부연 설명
먼저 mybatis config, 기본설정 xml
<!-- 태그명-내용 = 키-값 처럼 쓰인다. -->
<!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을 따로 입력해준다.
'Spring Framework, MyBatis > 02. 사용법' 카테고리의 다른 글
[Spring Framework]02-12.Spring Framework Auto Wired, 객체 자동 생성, SqlSession 생성 - Spring IoC, Spring DI 관리에 대해서 (0) | 2019.02.03 |
---|---|
[Spring Framework]02-11.Spring Framework에서의 서블릿 연결 원리 (0) | 2019.01.31 |
[MyBatis]02-09. Mybatis를 이용한 SQL 쿼리 관리 (XML 파일 이용) (0) | 2019.01.20 |
[MyBatis]02-08. FrontController를 통한 페이지 맵핑 관리 (0) | 2019.01.20 |
[MyBatis]02-07. 인터페이스를 통한 Framework 구조 (0) | 2019.01.20 |