这是我的问题。我们公司决定从专有数据访问系统转向使用弹簧数据访问。我们的大多数代码更改只是改变了我们调用存储过程的方式。例如。
输入:
public DataSet myMethodName1(Integer inputint1) {
DAOInfo info = _newDAOInfo();
info.setProperty(PROP_PROCNAME, "sp_name");
info.addParameter("sp_param1", PARAMETER_TYPE_INPUT, DATATYPE_INT, inputint1);
return _executeDAO(info);
}
public DataSet myMethodName2(String inputchar1, String inputchar2) {
DAOInfo info = _newDAOInfo();
info.setProperty(PROP_PROCNAME, "sp_name");
info.addParameter("sp_param1", PARAMETER_TYPE_INPUT, DATATYPE_CHAR, inputchar1);
info.addParameter("sp_param2", PARAMETER_TYPE_INPUT, DATATYPE_CHAR, inputchar2);
return _executeDAO(info);
}
输出:
public DataSet myMethodName1(Integer inputint1) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
jdbcCall.setReturnValueRequired(true);
jdbcCall.declareParameters(new SqlParameter("sp_param1", Types.INTEGER));
jdbcCall.declareParameters(new SqlReturnResultSet(DATASET_PARAMETER_NAME, new DataSetResultSetExtractor()));
Map<String, Object> in = new HashMap<String, Object>();
in.put("sp_param1", profileId);
return executeSP(jdbcCall, inputint1);
}
public DataSet myMethodName2(String inputchar1, String inputchar2) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
jdbcCall.setReturnValueRequired(true);
jdbcCall.declareParameters(new SqlParameter("sp_param1", Types.CHAR));
jdbcCall.declareParameters(new SqlParameter("sp_param2", Types.CHAR));
jdbcCall.declareParameters(new SqlReturnResultSet(DATASET_PARAMETER_NAME, new DataSetResultSetExtractor()));
Map<String, Object> in = new HashMap<String, Object>();
in.put("sp_param1", inputchar1);
in.put("sp_param2", inputchar2);
return executeSP(jdbcCall, in);
}
我不是要求任何人解决问题。我只是在寻找可以帮助我解决这个问题的工具或工具的建议。意识到任何一种方法中的参数数量可以在0到30之间变化。
上面的例子有两种方法。我有一个包含100种方法的文件,就像这两种方法一样。还有其他较小的文件需要这些。所以值得花几个小时的时间。这是计算机要做得更好,更一致的事情,然后我手动做一堆重复的剪贴。
看起来好像有一段时间我可以制作一个TextPad宏来完成这项工作。但由于TextPad宏不可编辑,因此非常烦人。我可以使用的工具是Windows7,RAD,TextPad,Java或任何其他免费工具。感觉好像有一个免费的编辑器允许你编辑宏,这可能很容易。
更新:我忘了提到这个代码在jar中,需要向后兼容,所以我不需要解决方法来修复我的代码。
感谢您的想法或想法。
答案 0 :(得分:2)
我的第一次尝试是将SimpleJdbcCall
包裹在DAOInfo
内,以保持API完全相同,并在内部使用新功能。
如果你想迁移到Spring,那么我建议考虑使用POJO而不是30参数方法,再加上JPA注释来将它们映射到SQL。 JPA 2.1 includes support for stored procedures
使用POJO有许多优点。旧代码:
foo.method("hello","what","is","this",....);
新代码:
UpdateFoo foo = new UpdateFoo();
foo.setName("hello");
foo.setQuestion("what");
foo.setVerb("is");
foo.setTarget("this");
foo.execute();
- &GT;你将停止混合参数。
现在,某些流程可以实现自动化。 You can use the standalone Eclipse Java compiler to parse Java code。这为您提供了抽象语法树(AST) - 您可以分析和转换的Java代码的内存模型。重构使用它将一种形式的代码转换为另一种形式。
这种方法功能强大,但需要一些时间才能习惯使用AST。
另一种方法是使用正则表达式。您将获得更快的成功,但它们只能解析递归代码。如果你使用正则表达式,那么我建议用Java编写转换器:
如果你想要一个非常强大的解决方案,请看看jOOQ。 jOOQ 3.0 has support to call stored procedures代码生成器将为您构建大部分代码。
答案 1 :(得分:1)
这种变化远非微不足道 - 编写正确的解析器或正则表达式或宏或......可能比通过代码并手动进行更改需要更多的时间。
特别是,如果有一些注释,正则表达式将无法轻松工作,您将需要实际解析代码......
然而,一个正则表达式可能会处理你需要的70%,你可以手动完成其余的工作。
例如:
DAOInfo info = _newDAOInfo();
info.setProperty(PROP_PROCNAME, "sp_name");
变为:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
jdbcCall.setReturnValueRequired(true);
在Netbeans中,您可以使用以下正则表达式((?s)
允许多行匹配 - 您可以使用\n
手动插入换行符或使用与我下面示例中相同的缩进字段):
查找
(?s)DAOInfo\s+(.*?)\s*=\s*_newDAOInfo\(\);(\s+)(.*?)\.setProperty\(PROP_PROCNAME\, \"(.*?)\"\);
取代:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("$4");$2jdbcCall.setReturnValueRequired(true);
您可能需要清除格式。