package org.nutz.dao.impl.jdbc.psql; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.nutz.dao.jdbc.ValueAdaptor; import org.nutz.json.Json; import org.nutz.json.JsonFormat; /** * 为 PostgreSQL 数据库封装对 Json 类型的支持 * <p/> * 数据库里面的 Json 类型的值自动为 String 类型。 * <p/> * 注意,必要的时候需要给 POJO 添加<b>带一个参数的静态工厂方法</b>或者<b>带一个参数的构造函数</b>,<br> * 显示的使用 java.sql.ResultSet 来创建该 POJO,不然会出现无法映射的错误。 * <p/> * <pre> * public class Pet { * * public static Pet getInstance(ResultSet rs) throws SQLException { * // 需要把所有字段从 ResultSet 取出,不然该属性无法映射 * Pet pet = new Pet(); * pet.setId(rs.getInt("id")); * pet.setData(NutMap.WRAP(rs.getString("data"))); * return pet; * } * * @Id * private int id; * * @ColDefine(customType = "json", type = ColType.PSQL_JSON) * private NutMap data; * * // ... 省略后面代码,包括字段声明以及 getter 和 setter * } * * public class Jone { * * public Jone(ResultSet rs) throws SQLException { * // 需要把所有字段从 ResultSet 取出,不然该属性无法映射 * this.id = rs.getInt("id"); * this.info = Json.fromJson(Information.class, rs.getString("info")); * } * * @Id * private int id; * * @ColDefine(customType = "json", type = ColType.PSQL_JSON) * private Information info; * * // ... 省略后面代码,包括字段声明以及 getter 和 setter * } * </pre> * */ public class PsqlJsonAdaptor implements ValueAdaptor { 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 { stat.setObject(index, Json.toJson(obj, JsonFormat.tidy()), Types.OTHER); } } }