오라클 NUMBER 형 컬럼의 데이터를 HashMap 타입으로 받아 java에서 사용하려고 할때 오류 발생

java.math.BigDecimal cannot be cast to java.lang.String 


MySQL 의 INT형 컬럼 데이터를 HashMap 타입으로 받아 java에서 사용하려고 할때오류 발생


java.lang.Integer cannot be cast to java.lang.String



iBatis xml 부분
 <SELECT id="selectQue" resultClass="java.util.HashMap" parameterClass="java.util.HashMap"> Query statement </SELECT>

HashMap 으로 결과를 받는 부분
String seq = (String) map.get("SEQ"));



NUMBER(INT) 타입을 곧바로 String으로 캐스트 변환하려고 할때 발생

해결:  캐스트 변환이 아닌, String 클래스의 valueOf (Object) 메소드를 이용해 처리

String seq = String.valueOf(map.get("SEQ"));



'Java > iBatis' 카테고리의 다른 글

[iBatis] Dynamic SQL, iterate  (1) 2010.02.03
[iBATIS] iBatis int 형 데이타 값이 NULL 일때 예외 발생  (1) 2009.12.11
Posted by finewoo
,

iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어
"select * from tableName where idx in ('3','6','9')"
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.

먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.


ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);


그리고 iBatis query.xml 파일에 아래처럼 작성한다.


<select id="getList" parameterClass="idxMap" resultClass="dataVO">
   select * from table
  <dynamic prepend="where">
    <isNotEmpty prepend="and" property="idxArr">
      <iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
        #idxArr[]#
      </iterate>
    </isNotEmpty>
  </dynamic>
</select>


그러면 iBatis에서 내부적으로
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.


$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다.





Posted by finewoo
,

iBatis로 데이터베이스 테이블의 int형 컬럼값을 가져올때
컬럼의 값이 NULL이거나 값이 없을 경우 예외가 발생하게 된다.
char형 컬럼은 상관이 없다.

이런 현상은 int가 객체가 아니기 때문에 매핑시 에러가 발생하게 된다고 한다.
이 오류를 해결하기 위해서 물론 쿼리에서 null일경우 0으로 치환할 수는 있다.
하지만, 개인적인 생각으로는 null과 0은 분명히 다른 값이므로 임의로 null을 쿼리에서 0으로 변환하는 것은 그닥 추천할 만한 방법은 아닌듯 싶다.

그래서, 테이블 생성할때 컬럼속성이 int형인 경우는 테이블 생성시 제약조건에서 디폴트 값을 0 또는 다른 값으로 미리 지정하는 방법이 나을 것 같다.




'Java > iBatis' 카테고리의 다른 글

[iBatis] NUMBER(INT) 타입 컬럼 처리 시 cast 오류 발생  (1) 2011.03.29
[iBatis] Dynamic SQL, iterate  (1) 2010.02.03
Posted by finewoo
,

탄생배경

1996년, SUN은 자바를 위한 소프트웨어 컴포넌트 모델을 정의한 자바빈즈(JavaBeans) 1.00-A 명세를 발표했다.
이는 재사용이 가능한 자바객체를 이용해 복잡한 어플리케이션을 쉽게 구성할 수 있게 하는 일련의 코딩정책을 정의한 것이다.
그리고 앤터프라이즈급 어플리케이션의 개발을 위해 1998년 자바빈즈(EJB: Enterprise JavaBeans) 명세 1.0을 발표했다.
하지만, EJB는 어플리케이션 개발을 쉽게 구성하겠다는 본래의 의도를 벗어나게 됐다.
엔터프라이즈급의 서비스 제공을 위해 코드 및 개발이 점점 복잡해지고 어려워졌다.

이러한 분위기속에서 애스팩트 지향 프로그래밍(AOP: aspect-oriented programming), 종속객체 주입(DI: dependency injection) 같은 새로운 프로그래밍 기법으로 이전 EJB로만 가능했던 부분이 평범한 자바 객체(POJO: plain-old Java objects)로도 구현이 가능하게 됐다.

스프링 프레임워크는 이러한 가벼운 POJO 기반 개발 진영의 선두에 있다고 볼 수 있다.



스프링이란?

스프링(Spring)은 로드 존슨(Rod Johnson)이 그의 책 『Expert One-on-One: J2EE Design and Development』을 통해 소개되었다.
스프링의 특징을 간단하게 요약하면

스프링은 가벼운 DI 및 AOP기반 컨테이너이자 프레임워크이다.


종속객체 주입(DI: dependency injection)
: 객체가 의존관계에 있는 다른 객체를 컨테이너에서 찾아오는 것이 아니라 인스턴스가 생성되면 컨테이너가 그 객체에 필요한 종속객체를 찾아주는 것이다. 따라서 낮은 결합도를 유지하게 해준다.


애스팩트 지향 프로그래밍(AOP: aspect-oriented programming)
: 애플리케이션 개발에 있어 비즈니스 로직과 트랜잭션관리, 로깅등 시스템 서비스 관련 작업을 분리해 응집도 높은 개발을 가능하게 한다. 


DI와 AOP를 근간으로 한 결합도가 낮은 애플리케이션이라 함은 개발시 테스트의 용이함 뿐만 아니라 관리시에도 상당한 편의성을 제공한다.




스프링 프레임워크는 코어 컨테이너 계층 위에 여러가지 계층으로 이루어져 있다. 이는 곧 애플리케이션 개발시 필요한 개별 모듈을 선택적으로 사용할 수 있다는 의미이다.

이 여러 계층 중 몇가지만 살펴보기로 한다.



The Core package is the most fundamental part of the framework and provides the IoC and Dependency Injection features.
The basic concept here is the BeanFactory, which provides a sophisticated implementation
of the factory pattern which removes the need for programmatic singletons and allows you to decouple the configuration and specification of dependencies from your actual program logic.

코어 컨테이너(core container)
- 코어 컨테이너는 IoC와 DI를 제공하는 스프링 프레임워크의 기본을 구성한다. 이 모듈에 있는 BeanFactory는 스프링을 컨테이너로서의 역할을 하게 한다.



The Context package build on the solid base provided by the Core package: it provides a way to access objects in a framework-style manner in a fashion somewhat reminiscent of a JNDI-registry.
The context package inherits its features from the beans package and adds support for internationalization (I18N) (using for example resource bundles), event-propagation, resource-loading, and the transparent creation of contexts by, for example, a servlet container.

컨텍스트 계층(웹 계층)
- Context package는 Core package위에 위치하며 BeanFactory 형태를 확장하여 국제화(I18N), 애플리케이션 생명주기 이벤트, 유효성 검증, 이메일, JNDI 액세스, 리모팅 등 여러 서비스를 제공한다.



The DAO package provides a JDBC-abstraction layer that removes the need to do tedious JDBC coding and parsing of database-vendor specific error codes. Also, the JDBC package provides a way to do programmatic as well as declarative transaction management, not only for classes implementing special interfaces, but for all your POJOs (plain old Java objects).

DAO 계층
- JDBC 추상화를 제공하는 DAO계층은 반복되는 데이터베이스 코드를 간단하고 깔끔하게 만들어 주며, AOP모듈을 이용해 트랜잭션 관리 서비스도 가능하며 데이터베이스 관련 각종 오류를 해결하는데 도움을 준다.



Spring's MVC package provides a Model-View-Controller (MVC) implementation for web-applications.
Spring's MVC framework is not just any old implementation; it provides a clean separation between domain model code and web forms, and allows you to use all the other features of the Spring Framework.

Spring's MVC 계층
- Spring's MVC 는 웹어플리케이션에 Model-View-Controller (MVC)를 적용할 수 있게 한며 애플리케이션의 결합도를 낮춰주는 역할을 한다.



스프링 프레임워크의 철학은 다른 프레임워크와 마찬가지로 개발자로 하여금 여타 불필요하거나 반복적인 작업으로 시간낭비하는 부분을 지양하게 한다. 그리고 스프링 자체의 가벼움은 기존API 및 JDBC, iBATIS, 하이버네이트, Struts, JSF등 기존 프레임워크와도 비교적 쉽게 통합하는 특징을 가진다.



Posted by finewoo
,