我希望我的Java层使用存储过程与我的数据库通信。存储过程充当兼容层,以便我可以运行两个不同版本的应用程序,期望在同一个数据库之上存在两个不同的模式。
为此,我想使用Orika从JDBC ResultSet快速映射到我的Beans上。
到目前为止,我已编写此测试代码: @测试 public void testSelectAndMap()throws Exception { Assert.assertNotNull(数据源); try(Connection con = dataSource.getConnection()){ try(Statement stmt = con.createStatement()){
try (ResultSet result = stmt.executeQuery("select 1 as internalTestPojoId, CURRENT_TIMESTAMP as now")) {
result.next();
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(ResultSet.class, InternalTestPojo.class)
.byDefault()
.field("internalTestPojoId:{getInt('internalTestPojoId')|getInt('internalTestPojoId')|type=" + int.class.getName() + "}", "internalTestPojoId")
.field("now:{getTimestamp('now')|getTimestamp('now')|type=" + Timestamp.class.getName() + "}", "now")
.register();
MapperFacade mapper = mapperFactory.getMapperFacade();
InternalTestPojo pojo = mapper.map(result, InternalTestPojo.class);
Assert.assertEquals(pojo.internalTestPojoId, 1);
Assert.assertEquals(pojo.now, new Timestamp(new Date().getTime() / 1000 * 1000));
}
这很好用它很快,但它并没有真正花费我的时间编写,然后自己将ResultSet写入Bean代码。但如果我可以自动生成映射,它将为我节省大量时间。
我看了IntrospectorPropertyResolver
。我写了这样的代码:
protected Property getProperty(java.lang.reflect.Type type, String expr,
boolean isNestedLookup, Property owner) throws MappingException {
Property property = null;
try {
property = super.getProperty(type, expr, isNestedLookup, null);
} catch (MappingException e) {
try {
property = super.resolveInlineProperty(type,
expr + ":{getInt('" + expr + "')|getInt('" + expr + "')|type=" + int.class);
} catch (MappingException subE) {
throw e; // throw the original exception
}
}
return property;
}
这很好,Orika自动确定bean上的属性名称,并在expr中将它提供给我。但它并没有告诉我这种类型。它也没有告诉我我想要映射到什么。我只需假装在这种情况下目标是ResultSet。
String
我将进行内联绑定调用ResultSet.getString("expr")
并告诉Orika使用java.lang.String
。如果是时间戳,我将进行内联绑定调用Resulset.getTimestamp("expr")
并告诉Orika使用Timestamp
ResultSet
映射到InternalTestPojo
而不是Map
到InternalTestPojo
?答案 0 :(得分:1)
我认为实现您要做的最简单的方法是使用扩展默认类的自定义类地图构建器,这样您就可以通过覆盖byDefault方法自动将字段添加到类地图中。
这是一个使用Orika注释的简单示例:https://gist.github.com/elaatifi/5212119
您不需要使用Reflection您可以使用PropertyResolver查找InternalTestPojo的所有属性,并为每个属性构建ResultSet的计数器部分属性并将其添加到类映射。
要构建计数器部件属性,可以使用Property.Builder。 属性的getter方法可以从类型中得出。
希望这有帮助!