728x90

 

현상: MyBatis에서 아래처럼 SQL시 테이블 별명을 사용하려고 했다. 

SELECT 
  M.CLUB_NO,
  C.CLUB_NM,
  M.I_DATE,
  M.I_USER,
  M.U_DATE,
  M.U_USER,
  M.USE_YN,
  M.USER_AUTH,
  M.USER_NO
  
  FROM 테이블1 M, 테이블2 C
   		WHERE 
   			M.USER_NO = 유저번호
   			AND M.USE_YN = 'Y'
        AND C.USE_YN = 'Y'
        AND M.CLUB_NO = C.CLUB_NO;
        

 

Oracle DB로 개발 중이므로, Sqldeveloper에서 쿼리 실행시에는 문제가 없었는데,

MyBatis로 동작시키니 BadSqlGrammarException:~~~ 이 뜨면서 에러가 발생했다.

 

해결: 다른 프로젝트에서 <!cdata[  ~~~~~ ]>를 사용하는건 문제가 없길래 그대로 적용해보니 해결되었다.

 

 

Q. 그렇다면 <!cdata는 왜 쓰는걸까?

 

출처: https://javacpro.tistory.com/5 [버물리의 IT공부]

 

Mybatis 사용시 쿼리문에 문자열 비교연산자나 부등호를 처리할 때가있습니다.

그러면 < 와 같은 기호를 괄호인지 아니면 비교연산자 인지 확인이 되지않아요.

이외에도 특수문자 사용하는데 제한이있습니다.

 

<select id ="list" parameterType="int" resultType="board.test.testDto>

select *

from employees

where salary > 100

</select>

 

 

대략 이런식으로요 

 

이럴때 사용한것이 <![CDATA[  입니다.

CDATA 안에 들어가는 문장을 문자열로 인식하게 합니다.

 

 

<select id = "list" parameterType="int" resultType="board.test.testDto>

<![CDATA[

select *

from employees

where salary > 100

]]>

</select> 

 

이렇게 사용하면 SQL안에 특수문자가 들어가도 문자열로 인식하기때문에

문제를 해결할수있습니다. 



출처: https://javacpro.tistory.com/5 [버물리의 IT공부

 

 

 

<![CDATA[ 로 해결되었다는건, 그냥 <select>문 안에 쓰게 되면, mapper가 테이블 별명을 제대로 해석을 못하는건가 싶다.

728x90
728x90

<내가 사용한 방법>

- Oracle DB 기준, Sequnce 사용 방법

 + insert문에 sysdate 추가

<?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="com.test.dao.PersonInterface">
    
     <insert id="insertUserInfo" parameterType="HashMap">
	    <selectKey keyProperty="user_no_seq" resultType="integer" order="BEFORE">
	   		 select USER_NO_SEQ.nextval FROM DUAL
  		</selectKey>
	     
    	INSERT INTO PERSON 
    		(USER_NO, C_EMAIL, C_NAME, JOIN_DATE, OS_TYPE)
    		VALUES(
    			   #{user_no_seq},
    			   #{C_EMAIL},
    			    #{C_NAME},
    			   sysdate,
    			   #{OS_TYPE}
    			   )
    </insert>
   
</mapper>

 

 

 

+ 참고

출처: https://taetaetae.github.io/2017/04/04/mybatis-useGeneratedKeys/

 

# selectKey 옵션

Oracle 같은 경우는 Auto Increment 가 없고 Sequence를 사용해야만 하기 때문에 위 옵션을 사용할수가 없다. 하지만 다른 우회적인(?) 방법으로 위와같은 효과를 볼수가 있다.

파라미터의 모델이나 java구문은 위와 동일하고 xml 쿼리 부분만 아래와 같이 설정해주면 된다.

<insert id="insertStudents" parameterType="Student">

<selectKey keyProperty="id" resultType="int" order="BEFORE">

select SEQ_ID.nexyval FROM DUAL

</selectKey>

insert into Students

(id, name , email)

values

(#{id}, #{name}, #{email})

</insert>

위와같은 코드에서 쿼리가 실행되기 전에 id값에 Sequence에 의해 값을 셋팅하게 되고, 자동적으로 해당 값을 Student의 id에 set하게 되서 동일한 결과를 볼수가 있다.

 

 

---------------------------------------------------------------------------------------------------

하단은 추가 참고 사항

 

DBMS 별 selectKey 방법

 

출처 : http://kamsi76.egloos.com/377946

 

MySql

<insert id="insertContent" parameterClass="content">
    <![CDATA[
    INSERT INTO CONTENT (
        CREATED_DATE, TITLE, CONTENT, CONTENT_TYPE
    ) VALUES (
        now(), #{title}, #{content}, #{contentType}
    )
    ]]>
    <selectKey keyProperty="seqId" resultClass="int">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>



MSSQL

<insert id="createProjectBasicInfo" parameterClass="prjIdx">
    <selectKey keyProperty="prj_info_seq" resultClass="int">

        INSERT INTO PRJ_INFO (
            ...
        ) VALUES (
             ...
        ) 
        SELECT SCOPE_IDENTITY()

    </selectKey>
</insert>


Oracle

<insert id="insert_message" parameterClass="java.util.HashMap">
    <selectKey keyProperty="message_id" resultClass="Integer">
        SELECT message_id_seq.nextval FROM DUAL
    </selectKey>
    INSERT INTO guestbook_message (message_id, guest_name, password, message)
    VALUES(#{message_id}, #{gName}, #{pw}, #{ms})
 </insert>

[출처] MyBatis 에서 selectkey 사용 방법|작성자 moonv11

 

 

 

Reference

https://blog.naver.com/moonv11/60181183377

728x90
728x90

1. MyBatis는?

- 기존 JDBC코드는 Connection과 Statement를 통해 쿼리를 전송하면 연결받고 Close하는 방식을 사용.

 ==> 이를 프레임워크화를 하여 캡슐화를 한것이 mybatis. 

- JDBC 코드를 간편하게 사용할 수 있고 SQL문장과 프로그래밍 코드가 분리되어 있어 사용하는데 있어 편리

- 또한 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일이 간단히 처리가능 


2. iBATIS -> MyBatis : 이름 변경의 이유?

Apache Proejct팀이 iBATIS를 ~2.3까지 개발 하였음.

이후 해당 팀이 google code 팀으로 이동하면서, 이름을 MyBatis로 변경하여 2.5부터 개발 진행중.

 

3. 차이점

1) Java 요구사항 차이점

iBATIS : JDK 1.4 이상 가능
MyBatis : JDK 1.5 이상 가능(MyBatis 3.2 이상 버전은 JDK 1.6 이상 요구)

 

2) 패키지 내부 구조 변경

iBATIS : com.ibatis.*

MyBatis : org.apache.ibatis.*

 

3) sqlMap.xml 내부구조 변경

iBATIS: parameterMap

MyBatis: parameterType (dtd 변경 - http://mybatis.org/dtd/mybatis-3-mapper.dtd) 

 

4) pom.xml 설정

<!-- iBATIS pom.xml -->
<dependency>
    <groupid>org.apache.ibatis</groupid>
   <artifactid>ibatis-sqlmap</artifactid>
   <version>2.3.4.726</version>
</dependency>
<!-- MyBatis pom.xml -->
<dependency>
    <groupid>org.mybatis</groupid>
   <artifactid>mybatis</artifactid>
   <version>3.4.5</version>
</dependency>
 
<dependency>
   <groupid>org.mybatis</groupid>
   <artifactid>mybatis-spring</artifactid>
    <version>1.3.1</version>
</dependency>

(상위버전이 필요하다면 maven repository에서 확인)

5) 네임스페이스 방식 변경

iBATIS : <sqlMap namespace=”User”>

MyBatis : <mapper namespace=”myBatis.mapper.UserMapper”>

네임스페이스 사용은 필수, userStatementNameSpace설정 제거



 

 

Reference

https://sdevstudy.tistory.com/18

https://uwostudy.tistory.com/19

https://hunit.tistory.com/200

 

728x90

+ Recent posts