⑴总会有一些特殊的数据,例如数组,坐标,几何,向量,经纬度,数据等类型。这些数据如果用字符串表示,那或多或少在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); } } }