'java'에 해당되는 글 28건
mybatis 에서 Oracle LONG, CLOB Select 시 에러날때 : getCLOB not implemented for class oracle.jdbc.driver.XXX
Java 2011. 8. 22. 14:37
MySQL 에서는 어떤지 잘 모르겠지만 아무튼 오라클에서는 Long Type이나 CLOB Type 컬럼을 select 할때 getCLOB() 가 구현되지 않았다면서 에러가 난다.
mybatis 에서 패치를 해줘야 되나 오라클에서 패치를 해 줘야 하나 쫌 거시기 하지만 아무튼 지금! 현재는 Long 을 가져오질 못한다 -_-
누군가는 패치를 해주긋지~
현재 라이브러리 버전은 요렇다.!
mybatis : 3.0.6-SNAPSHOT.jar
oracle jdbc driver : ojdbc6.jar (11.2.0.2.0)
지금 당장 하기는 해야 겠고 고쳐줄때 까지 기다릴수 없으니 해결하기 위해선 mybatis config 파일에서 LONG TYPE에 대해 TypeHandler 를 설정해 주면 된다.
mybatis config 파일
TypeHandler 는 org.apache.ibatis.type.TypeHandler 인터페이스를 implements 해서 간단하게 메소드 3개를 구현하면 된다.
stove99.handler.CLOBHandler 의 소스는 다음과 같다.
내 나름대로 이해하고 있는걸 적어놓은 것이니 미심쩍다는 사람들은 첨부파일 pdf 에서 14쪽을 참고하셈~
mybatis 에서 패치를 해줘야 되나 오라클에서 패치를 해 줘야 하나 쫌 거시기 하지만 아무튼 지금! 현재는 Long 을 가져오질 못한다 -_-
누군가는 패치를 해주긋지~
현재 라이브러리 버전은 요렇다.!
mybatis : 3.0.6-SNAPSHOT.jar
oracle jdbc driver : ojdbc6.jar (11.2.0.2.0)
지금 당장 하기는 해야 겠고 고쳐줄때 까지 기다릴수 없으니 해결하기 위해선 mybatis config 파일에서 LONG TYPE에 대해 TypeHandler 를 설정해 주면 된다.
mybatis config 파일
<?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> <typeHandlers> <typeHandler handler="stove99.handler.CLOBHandler" javaType="String" jdbcType="LONGVARCHAR"/> </typeHandlers> </configuration>설정을 보면 대략 알겠지만 LONG 타입을 뜻하는 LONGVARCHAR jdbcType 에 대하여 처리할 핸들러를 설정해 주는 것이다.
TypeHandler 는 org.apache.ibatis.type.TypeHandler 인터페이스를 implements 해서 간단하게 메소드 3개를 구현하면 된다.
stove99.handler.CLOBHandler 의 소스는 다음과 같다.
package stove99.handler; import java.io.StringReader; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; public class CLOBHandler implements TypeHandler{ @Override // 파라메터 셋팅할때 public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { String s = (String) parameter; StringReader reader = new StringReader(s); ps.setCharacterStream(i, reader, s.length()); } @Override // Statement 로 SQL 호출해서 ResultSet 으로 컬럼값을 읽어올때 public Object getResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } @Override // CallableStatement 로 SQL 호출해서 컬럼값 읽어올때 public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } }
내 나름대로 이해하고 있는걸 적어놓은 것이니 미심쩍다는 사람들은 첨부파일 pdf 에서 14쪽을 참고하셈~
'Java' 카테고리의 다른 글
Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
Java 2011. 8. 19. 23:30
JSON 문자열을 Map 이나 List Object 로 변환하는 것이랑
JSON 문자열을 xml 다루듯이 트래버싱 하는것,
Map 이나 List Object 를 JSON 문자열로 변환하는것 요래 정리를 해 보았다.
뭐 요정도만 알면 대충 할 수 있는건 다 할 수 있을듯하다. 뭐 필요하면 더 그때가서 더 찾아보면 되긋지~
JSON 문자열을 xml 다루듯이 트래버싱 하는것,
Map 이나 List Object 를 JSON 문자열로 변환하는것 요래 정리를 해 보았다.
뭐 요정도만 알면 대충 할 수 있는건 다 할 수 있을듯하다. 뭐 필요하면 더 그때가서 더 찾아보면 되긋지~
package test; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; public class Test { /** * @param args */ public static void main(String[] args) throws Exception{ // 테스트 데이터 : 맵에 string 2개랑 list 하나가 들어가 있는 형태 List<String> list = new ArrayList<String>(); list.add("list1"); list.add("list2"); list.add("list3"); Map<String, Object> d = new HashMap<String, Object>(); d.put("list", list); d.put("a", "va"); d.put("b", "vb"); //////////////////////////////////////////////// ObjectMapper om = new ObjectMapper(); // Map or List Object 를 JSON 문자열로 변환 String jsonStr = om.writeValueAsString(d); System.out.println("object to json : " + jsonStr); // JSON 문자열을 Map or List Object 로 변환 Map<String, Object> m = om.readValue(jsonStr, new TypeReference<Map<String, Object>>(){}); System.out.println("json to object : " + m); // JSON 문자열을 xml 다루는것과 비슷하게 트리로 맨들어서 트래버싱하기(Tree Model) JsonNode root = om.readTree(jsonStr); // 단일값 가져오기 System.out.println("b의 값 : " + root.path("b").getValueAsText()); // 배열에 있는 값들 가져오기 if( root.path("list").isArray() ){ Iterator<jsonnode> it = root.path("list").iterator(); // 요래 해도 됨 // Iterator<jsonnode> it = root.path("list").getElements() while(it.hasNext()){ System.out.println(it.next().getTextValue()); } } // 이외 getXXXValue() 시리즈, findParent(), findValue() 등등 유용한 함수 많음~ } }
'Java' 카테고리의 다른 글
Java JSON 처리 라이브러리 Jackson JSON Processor #1 : Map, List 를 JSON String으로~
Java 2011. 8. 12. 15:14
Java 에서 JSON 을 처리하기 위한 라이브러리는 많이 있겠지만 요즘은 사람들이 Jackson 라이브러리를 많이 쓰는것 같다.
프로젝트 홈페이지(http://jackson.codehaus.org/)에 가보면 "High-performance JSON processor!" 요런 문구가 제일 상단에 떡 있는걸 봐서는 성능도 좋은것 같다!
일단 그냥 써보자. 계속 쓰다보면 잘 알게 된다.
먼저 라이브러리를 써묵기 위해서 jar 파일을 받아야 한다. 프로젝트 홈페이지 다운로드 메뉴(http://wiki.fasterxml.com/JacksonDownload)로 가서
쭉 있는것들중에 core-asl 과 mapper-asl 을 다운로드 받아 클래스 패스가 참조하는 폴더에 복사해 주면된다.
웹 프로젝트 같은 경우 WEB-INF/lib 디렉토리에 복사하면 되긋다~
메이븐 프로젝트일 경우는 간단히 pom.xml 에
지금 현재 최신 버전이 1.8.5 이기 때문에 version 란에다 1.8.5를 적어준 것이고 나중에 또 업데이트가 될것이니
http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl 여기에서 확인해 보고 최신버전으로 바꿔주면 될것이다.
간단한 샘플을 보자.
생성된 고것을 가지고 Json 문자열을 객체로 변환한다던가 객체를 JSON 문자열로 변환한다던가 한다. 뭐 다른 쓸만한 것도 많을 것이다.
뭐 아직 많이 모르니깐~
아무튼 Map 이나 List에 들어가 있는 데이터들을 쪽바로 잘 변환해 준다.
물론 getter 와 setter 메소드 시리즈가 있는 도메인 오브젝트,
예를 들어 User, Account 뭐 이런 종류의 오브젝트도 writeValueAsString 메소드의 파라메터로 넣으면 잘 변환된다.
아무튼~ 각설하고~ List 인 경우도 한번 해보자
위의 샘플들은 오브젝트를 String으로 변환하는 샘플이고 String 으로 변환활 필요가 없으면(웹요청처리, JSON 파일로 저장하는 경우) ObjectMapper 클래스의 writeValue() 메소드를 이용해 OutputStream이나 Writer 에 Stream으로 출력해 버려도 된다.
프로젝트 홈페이지(http://jackson.codehaus.org/)에 가보면 "High-performance JSON processor!" 요런 문구가 제일 상단에 떡 있는걸 봐서는 성능도 좋은것 같다!
일단 그냥 써보자. 계속 쓰다보면 잘 알게 된다.
먼저 라이브러리를 써묵기 위해서 jar 파일을 받아야 한다. 프로젝트 홈페이지 다운로드 메뉴(http://wiki.fasterxml.com/JacksonDownload)로 가서
쭉 있는것들중에 core-asl 과 mapper-asl 을 다운로드 받아 클래스 패스가 참조하는 폴더에 복사해 주면된다.
웹 프로젝트 같은 경우 WEB-INF/lib 디렉토리에 복사하면 되긋다~
메이븐 프로젝트일 경우는 간단히 pom.xml 에
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.8.5</version> </dependency>를 추가해 주면 사용할 수 있다.
지금 현재 최신 버전이 1.8.5 이기 때문에 version 란에다 1.8.5를 적어준 것이고 나중에 또 업데이트가 될것이니
http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl 여기에서 확인해 보고 최신버전으로 바꿔주면 될것이다.
간단한 샘플을 보자.
// 맵에 데이터들이 들어가 있는 형태 Map dummyData1 = new HashMap(); dummyData1.put("value1", "값1"); dummyData1.put("value2", "값2"); ObjectMapper om = new ObjectMapper(); try { System.out.println(om.defaultPrettyPrintingWriter().writeValueAsString(dummyData1)); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }출력결과
{ "value1" : "값1", "value2" : "값2"}Jackson 라이브러리로 하는 짓들의 대부분은 ObjectMapper 라는 클래스의 인스턴스 생성을 한다음에 한다.
생성된 고것을 가지고 Json 문자열을 객체로 변환한다던가 객체를 JSON 문자열로 변환한다던가 한다. 뭐 다른 쓸만한 것도 많을 것이다.
뭐 아직 많이 모르니깐~
아무튼 Map 이나 List에 들어가 있는 데이터들을 쪽바로 잘 변환해 준다.
물론 getter 와 setter 메소드 시리즈가 있는 도메인 오브젝트,
예를 들어 User, Account 뭐 이런 종류의 오브젝트도 writeValueAsString 메소드의 파라메터로 넣으면 잘 변환된다.
아무튼~ 각설하고~ List 인 경우도 한번 해보자
// List 에 맵이 들어가 있는 형태 List dummyData2 = new ArrayList(); Map m = new HashMap(); m.put("value1", "값1"); m.put("value2", "값2"); dummyData2.add(m); m = new HashMap(); m.put("value1", "값3"); m.put("value2", "값4"); dummyData2.add(m); ObjectMapper om = new ObjectMapper(); try { System.out.println(om.defaultPrettyPrintingWriter().writeValueAsString(dummyData2)); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }출력결과
[ { "value1" : "값1", "value2" : "값2"}, { "value1" : "값3", "value2" : "값4"} ]역시 기대했던 대로 잘 변환된다.
위의 샘플들은 오브젝트를 String으로 변환하는 샘플이고 String 으로 변환활 필요가 없으면(웹요청처리, JSON 파일로 저장하는 경우) ObjectMapper 클래스의 writeValue() 메소드를 이용해 OutputStream이나 Writer 에 Stream으로 출력해 버려도 된다.
ObjectMapper om = new ObjectMapper(); om.writeValue(response.getWriter(), dummyData);