Category Archives: Ibatis/MyBatis

[spring/mybatis] 오라클(oracle) 프로시저(procedure) 파라미터가 배열(array)일 경우 mybatis typehandler 예제

By | 12월 28, 2023

oracle type object CREATE OR REPLACE TYPE 스키마."VARR" IS TABLE OF VARCHAR2(2048); TypeHandler import oracle.jdbc.Oracleconnection; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType public class VarrTypeHandler extends BaseTypeHandler<Object> { /** * DB에서 관리중인 Type의 이름 * – DB에 이 이름으로 Type Object가 미리 준비되어 있어야 함. */ private static final String TYPE_NAME = "VARR"; /** * 최초 구현하지 않았던… Read More »

[링크] mybatis 에서 package 단위의 typealias를 정의할 때 wildcard (*) 사용하기

By | 7월 15, 2022

요약 아래의 형태 가능 (since mybatis-spring 2.0.1) mybatis.type-aliases-package=com.example.**.model mybatis.type-handlers-package=com.example.*.typehandler mybatis-config.xml 에서는 지원하지 않음 그냥 mybatis 가 아니라 mybatis-spring에서 지원하는 기능이기 때문 원글 https://github.com/mybatis/spring-boot-starter/issues/314

[ibatis/oracle] 내장 반복문을 통해 대량(배치, batch) insert 를 하는 샘플

By | 10월 21, 2021

Mybatis 아니고, 골동품인 Ibatis 입니다. 생각지도 못한 에러들이 나와서 (ora-00933 등..) 삽질을 했네요. (시간 아깝 ㅠ.ㅡ) <insert id="BatchDAO.insertMemberRest" parameterClass="java.util.HashMap"> INSERT ALL /* BatchDAO.insertMemberRest */ <iterate property="mberList" conjunction=" "> INTO COMTNGNRLMBERREST ( MBER_ID, PASSWORD ) VALUES ( #mberList[].MBER_ID#, #mberList[].PASSWORD# ) </iterate> SELECT * FROM DUAL </insert> 그런데 하다 보니 이것도 조심해야 할 것 같다는 생각이 들었다.… Read More »

Mybatis 오라클 프로시저 (Oracle Stored Procedure) 호출시, ‘java.sql.SQLException: 해당 위치에 지원되지 않는 SQL92 토큰: 1:’ 오류 발생 케이스.

By | 8월 20, 2021

이 케이스는 그야말로 황당 그 자체! 결론부터 말하면 mybatis xml 에서, 중괄호와 소괄호를 다른 라인에 위치시켜서 발생 한 문제이다. 그것도 같은 프레임워크에서 돌리는 MariaDB 프로시저 호출시는 문제가 없는데, ‘오라클 프로시저 호출시에만’ 이 문제가 발생했다. 전혀 예상 못하고 헤멜뻔 했는데, 인터넷에 또 선구자가 계셔서 해결할 수 있었다. 잘못된 예 { CALL PKG_A.PROC_TEST( #{rsltcode, mode=OUT, jdbcType=VARCHAR}, #{rsltmsg,… Read More »

MyBatis insert 문 사용시 PK 획득하기 (useGeneratedKeys)

By | 9월 25, 2021

mybatis query xml <insert id="insertBook" useGeneratedKeys="true" keyProperty="bookId"> INSERT /* insertBook */ INTO book ( book_title ) VALUES ( #{bookTitle} ) </insert> 쿼리 이후 result 객체가 아닌 parameter 객체에서 bookId 를 참조하면 PK 획득. 이 테이블의 PK는 book_id 이지만 auto increment 이기 때문에 쿼리에는 기재되지 않았음. 대신 keyProperty 에 프로퍼티명이 명시되어 있음 mybatis config에 mapUnderscoreToCamelCase 가… Read More »

Mybatis 오류 어리둥절 케이스 (Error setting non null for parameter #12 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Could not set parameter at position 12 (values was ‘1’))

By | 6월 23, 2021

이 오류의 해결을 위해서 한참을 헤멨는데, mybatis mapper config 의 jdbcTypeForNull 을 NULL로 해 주라느니 등등 이것저것 해 봤지만 아무리 해도 듣지 않았다. 변수 바인딩 표현식 #{}도 오타/누락 등의 문제 없었고, 파라미터 갯수도 문제 없고. 그러다가 그냥 기존 xml 쿼리를 밀고 다시 짰더니 됐다. -_-… 뭐지..뭐였지…

[링크] MyBatis 1:N select 결과 매핑하는 예제 (e.g. 게시물 목록조회시 게시물당 첨부파일목록을 함께 조회하여 그룹핑, group, collection, one to many)

By | 7월 8, 2021

[Mybatis] 1:N 관계 데이터 처리 data concatenation 주의사항 resultMap > collection 을 사용할 경우 collection 의 요소가 두 개 이상일 경우(거의 그렇겠지만) 평범한 페이징으로는 오류가 날 수 밖에 없다. offset, limit 등은 그룹핑 후에 걸어야 하는데, collection의 경우 쿼리가 다 끝나고 그룹핑 되므로 그래서 나는 그냥 resultMap-collection 패턴을 포기하고 주 레코드만 select 후, select된 목록의… Read More »

Ibatis 쿼리 수행시 java.util.NoSuchElementException 이 발생하는 경우

By | 9월 11, 2013

Case 1.     가장 흔한 경우로, 바인딩변수 메타문자인 #을 열어놓고 닫지 않은 경우이다. (ex: #userId => #userId#)     내 경험상 이럴 때는 컴파일단계에서 오류가 발생했던 것 같다. Case 2.     이 경우는 좀 드문 경우였는데, 쿼리 내에서 괄호() 를 정상적으로 열고 닫지 않았을 경우에 발생했다.     내 경우에는 NVL()함수를 사용하는데 앞… Read More »

[펌글] iBatis에서 procedure 실행시 register output parameters failed 에러

By | 11월 19, 2012

– 출처 : http://yep1004.blog.me/100070785016 –  Never used it with stored procedure calls, but I would try defining the OUT parameter as a BigDecimal and see what happens. Oracle tends to return numerics as BigDecimals.즉, procedure에서 선언된 ‘NUMBER’ 타입의 변수는 oracle 내부적으로 BigDecimal 로 변환한다는 것!따라서 parameterMap에서 아래와 같이 선언해 주어야 한다.<parameter property=”outValue”  jdbcType=”DECIMAL” mode=”OUT” javaType=”long”/>이는 IN/OUT 전체에서 발생하므로,… Read More »

ibatis 에서 쿼리 문장 내에 #이 포함되어 있을 경우 escape 방법

By | 6월 21, 2011

select ‘#ABC’ from dual  위와 같은 SQL문을 ibatis로 실행하려 할 경우, ibatis는 #이후를 바인딩 변수로 인식하려 하기 때문에 오류를 발생시키게 된다. 이 경우는 #앞에 #을 한 번 더 붙여 주면 첫 번째 #은 escape character로만 작용하고 이후 #을 일반 문자열로 인식하게 된다. select ‘##ABC’ from dual 

Ibatis에서 select한 CLOB 데이타를 String으로 얻어오기

By | 6월 23, 2009

– 출처 : http://anarchi.tistory.com/34 – 위 글의 요점은 다음과 같다. (CLOB이 select 쿼리에 포함되어 있다는 전제하에) 1. <select id=”selectXXXX” resultClass=”java.util.HashMap”>  처럼     바로 HashMap으로 들어가지 말고, 별도의 resultMap을 정의할 것     => <select id=”selectXXXX” resultMap=”xxxxResultMap”> 2. resultMap 정의시 쿼리 순서와 resultMap 정의 순서가 동일해야 함 3. resultMap이나 쿼리나 CLOB 항목은 제일 마지막에 두어야 함. 4. resultMap에서 CLOB에 관한… Read More »

resultMap의 상속(extends) 이용하기

By | 3월 2, 2009

– 출처 : http://blog.daum.net/uttiboy/13497132 – 예제) 내용을 포함하지 않은 message 객체     <resultMap id=”message-result” class=”message”>         <result property=”messageId” column=”MESSAGE_ID”/>         <result property=”boardId” column=”BOARD_ID” />         <result property=”title” column=”TITLE” />         ….     </resultMap>        내용을 포함한 message 객체     <resultMap id=”message-contents-result” extends=”message-result” class=”message”>         <result property=”contents” column=”CONTENTS” javaType=”string” jdbcType=”CLOB” />     </resultMap>