⑴总会有一些特殊的数据,例如数组,坐标,几何,向量,经纬度,数据等类型。这些数据如果用字符串表示,那或多或少在java里会有操作不便,因此会封装成专门的自定义实体类型处理。
⑵上面所说的数据,可以转成特殊格式的字符串,来存放到数据库的varchar类型的字段里。有一个问题,即使在数据库里用存用varchar存储⑴所说的数据,但在java编码使用,不一定都会用字符串,会用特定专门或自定义的实体类型来处理⑴所说的数据,这要怎么实现查询或插入时,调用自己编写的类型转换类呢?比如数据库里某个varchar存储坐标数据,字符串格式是 (x,y); 但在java里面,用带有x和y属性名的类来处理该类数据,例如point,更新到数据库,把point转成(x,y)格式的字符串,查询获得结果集时,把(x,y)转成point
⑶但还有另一个情况,不是所有的程序员都一定想用varchar类型来存这些数据,会用数据库专门处理的字段类型来存放这些类型的数据,这是因为数据库的select查询。不同的数据库有一些各自不同的专门存储该特定数据的字段类型,附带特定的查询函数来处理,比较,另外其数据库提jdbc驱动包里也有处理的实体。例如Postgresql的Polygon类型(多边形),在java这边驱动包里会提供PGpolygon,来提供java对数据库该类字段的获取和写入。
⑷ 基于⑶所说的情况,又有一个问题,有时候jdbc提供对特定字段的处理实体类型,一些程序员也不一定喜欢使用,总想自定义类型转换处理,例如postgresql的坐标字段在java里用jdbc驱动包提供的PGpoint字段进行插入和处理,但我觉得PGpoint不好用,我想用自己定义的point类处理,在java通过jdbc获得查询出结果集的时候,想把PGpoint转成我自己定义或扩展的point类,更新到数据库的时候,也是把我自己定义的point类转成PGpoint类
所以Jfinal 有类似mybatis 的TypeHandler的自定义类型转换处理么?或者有实现方法么?我不想在每次编写查询或插入代码的时候,都要编写一个手动调用转换的代码。我希望是转换方法要么写的表名映射的实体类里,要么写到专门的类型转换处理类,在使用jdbc时,根据“处理的实体类型”或“注解”调用相应的转换方法。
以下是我自己用mybatis的时候,处理多边形数据而编写的 类型转换处理类,用于PGpolygon与Points2D于转换的,查询postgresql数据库的polygon字段,java访问用PGpolygon字段处理,但我觉得不好用,我自己编写了一个Points2D,在访问数据库的时候,在jdbc那里与PGpolygon类型进行转换后,再访问到数据库里。代码如下
@MappedJdbcTypes({JdbcType.OTHER})
@MappedTypes({Points2D.class})
public class PGpolygonHandler extends BaseTypeHandler<Points2D> {
//更新插入处理
@Override
public void setNonNullParameter(PreparedStatement ps, int index, Points2D parameter, JdbcType jdbcType)
throws SQLException {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
sb.append("'(");
sb.append("(");
sb.append(parameter.getList().get(0).x);
sb.append(",");
sb.append(parameter.getList().get(0).y);
sb.append(")");
for(int i=1;i<parameter.getList().size();i++) {
sb.append(",");
sb.append("(");
sb.append(parameter.getList().get(i).x);
sb.append(",");
sb.append(parameter.getList());
sb.append(")");
}
sb.append(")'");
PGpolygon pg=new PGpolygon();
pg.points=new PGpoint[parameter.getList().size()];
for(int i=0;i<parameter.getList().size();i++) {
Point2D.Double t=parameter.getList().get(i);
pg.points[i]=new PGpoint(t.x,t.y);
}
ps.setObject(index, pg);
}
//查询处理
@Override
public Points2D getNullableResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
PGpolygon pg=(PGpolygon) rs.getObject(columnName);
if(pg==null||pg.points.length==0) {
return new Points2D();
}else {
return new Points2D(pg);
}
}
@Override
public Points2D getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
PGpolygon pg=(PGpolygon) rs.getObject(columnIndex);
if(pg==null||pg.points.length==0) {
return new Points2D();
}else {
return new Points2D(pg);
}
}
@Override
public Points2D getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
PGpolygon pg=(PGpolygon) cs.getObject(columnIndex);
if(pg==null||pg.points.length==0) {
return new Points2D();
}else {
return new Points2D(pg);
}
}
}