PostgerSql Array и Java

Java разбира се предлага мапинг за базовите типове данни в PostgreSql, но има един интересен - Array. По какъв начин можем да подадем Array в PostgreSql функция?
Необходимо е да използваме интерфейса java.sql.Array, но как? Този интерфейс ни задължава да имплементираме хиляда и един метода, кой от кой по непонятно изглеждащи. Може да загубите часове проследявайки връзките кое какво е, при това без явен напредък. Аз поне доста се измъчих, но накрая успях. Ето как може да се справите. Лично за мен способът е потресаващ :-):
import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
public class PgArray implements Array{
public static final String TEXT = "text";
public static final String INTEGER = "int4";
private String m_pgArray;
private String m_dataType;
public PgArray(ArrayList<Object> array, String dataType)throws SQLException{
m_dataType = dataType;
StringBuilder sb = new StringBuilder("{");
for(Object obj : array){
sb.append(escape(obj.toString()));
sb.append(',');
}
if(sb.length() > 1){
sb.deleteCharAt(sb.length()-1);
}else{
throw new SQLException("Array is empty");
}
sb.append("}");
m_pgArray = sb.toString();
}
private String escape(String text){
text = text.replace(",", "\\,");
text = text.replace("'", "\\'");
return text;
}
@Override
public int getBaseType() throws SQLException {
if(TEXT.equals(m_dataType)) return java.sql.Types.VARCHAR;
}else if(INTEGER.equals(m_dataType)){
return java.sql.Types.INTEGER;
}
return -1;
}
@Override
public String getBaseTypeName() throws SQLException {
return m_dataType;
}
public String toString(){
return m_pgArray;
}
// ...
//тук следват 1000 метода,
//които оставяте с празно съдържание
}
За този, който би се зачудил какво толкова странно има тук, ще сложа този линк към документацията за Array интерфейса:
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Array.html
И така, на практика единствения използван метод от предлаганите от интерфейса е getBaseTypeName(), който указва от какъв тип е съдържанието на масива(на java типа String отговаря text). Другото, което се прави е, да се пренапише toString(), така че връщаното от него да представя масива в "{...,...,...,...}" формат.
Вярвате или не, това нещо работи.

0 коментара:
Публикуване на коментар
<< Начална страница