package org.nutz.dao.impl.jdbc.psql;
import java.sql.Array;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.nutz.dao.jdbc.ValueAdaptor;
/**
* 为 PostgreSQL 数据库封装对数组类型的支持
* <p/>
* 注意,需要给 POJO 添加<b>带一个参数的静态工厂方法</b>或者<b>带一个参数的构造函数</b>,<br>
* 显示的使用 java.sql.ResultSet 来创建该 POJO,不然会出现无法映射的错误。
* <p/>
* <pre>
* public class Pet {
*
* public static Pet getInstance(ResultSet rs) throws SQLException {
* Pet pet = new Pet();
* pet.setId(rs.getInt("id"));
* pet.setPayByQuarter((Integer[]) rs.getArray("pay_by_quarter").getArray());
* return pet;
* }
*
* @Column("pay_by_quarter")
* @ColDefine(customType = "integer[]", type = ColType.PSQL_ARRAY)
* private Integer[] payByQuarter;
*
* // ... 省略后面代码,包括字段声明以及 getter 和 setter
* }
*
* public class Jone {
*
* public Jone(ResultSet rs) throws SQLException {
* this.id = rs.getInt("id");
* this.schedule = (String[]) rs.getArray("schedule").getArray();
* }
*
* @ColDefine(customType = "varchar[]", type = ColType.PSQL_ARRAY)
* private String[] schedule;
*
* // ... 省略后面代码,包括字段声明以及 getter 和 setter
* }
* </pre>
*
*/
public class PsqlArrayAdaptor implements ValueAdaptor {
private String customDbType;
public PsqlArrayAdaptor(String customDbType) {
this.customDbType = customDbType;
}
public Object get(ResultSet rs, String colName) throws SQLException {
return rs.getObject(colName);
}
public void set(PreparedStatement stat, Object obj, int index) throws SQLException {
if (null == obj) {
stat.setNull(index, Types.NULL);
} else {
String typeName = customDbType.substring(0, customDbType.length() - 2);
Array array = stat.getConnection().createArrayOf(typeName, (Object[]) obj);
stat.setObject(index, array, Types.ARRAY);
}
}
}