はじめに
iciqlでPostGISのgeometry型を扱う方法についての覚え書きです。
検証環境
以下のバージョンで検証しています。
・JDK ... 8
・PostgreSQL ... 9.6
・PostGIS ... 2.3.1
・iciql ... 2.1.1
・その他依存ライブラリ
postgresql-9.4.1211.jar
postgis-jdbc-2.2.0.jar
DataTypeAdapterの実装
DataTypeAdapterを使います。
http://iciql.com/dta/
package sample.iciql;
import org.postgis.PGgeometry;
import com.iciql.Iciql.DataTypeAdapter;
import com.iciql.Iciql.Mode;
public class PgGeometryAdapter implements DataTypeAdapter<PGgeometry> {
Mode mode;
/* (non-Javadoc)
* @see com.iciql.Iciql.DataTypeAdapter#getDataType()
*/
@Override
public String getDataType() {
return "geometry";
}
/* (non-Javadoc)
* @see com.iciql.Iciql.DataTypeAdapter#getJavaType()
*/
@Override
public Class<PGgeometry> getJavaType() {
return PGgeometry.class;
}
/* (non-Javadoc)
* @see com.iciql.Iciql.DataTypeAdapter#setMode(com.iciql.Iciql.Mode)
*/
@Override
public void setMode(Mode mode) {
this.mode = mode;
}
/* (non-Javadoc)
* @see com.iciql.Iciql.DataTypeAdapter#serialize(java.lang.Object)
*/
@Override
public Object serialize(PGgeometry value) {
return value;
}
/* (non-Javadoc)
* @see com.iciql.Iciql.DataTypeAdapter#deserialize(java.lang.Object)
*/
@Override
public PGgeometry deserialize(Object value) {
return (PGgeometry)value;
}
}
Modelクラスの実装
package sample.iciql;
import java.io.Serializable;
import org.postgis.PGgeometry;
import com.iciql.Iciql.IQColumn;
import com.iciql.Iciql.IQSchema;
import com.iciql.Iciql.IQTable;
import com.iciql.Iciql.TypeAdapter;
@IQSchema("sample")
@IQTable(
name="sample_table",
primaryKey={ "id" })
public class SampleModel implements Serializable {
private static final long serialVersionUID = 1L;
@IQColumn(nullable=false)
public Integer id;
@IQColumn(nullable=true)
@TypeAdapter(PgGeometryAdapter.class)
public PGgeometry geometry;
public SampleModel() {
}
}
レコード挿入のサンプル
package sample.iciql;
import org.postgis.PGgeometry;
import com.iciql.Db;
public class IciqlSample {
public static void main(String[] args) throws Exception {
String url = "jdbc:postgresql://localhost:5432/sample";
String user = "sample";
String password = "xxxx";
try (Db db = Db.open(url, user, password)) {
SampleModel rec = new SampleModel();
rec.id = 1;
rec.geometry = new PGgeometry("POINT(10 11");
db.insert(rec);
}
}
}