Spring 将J2EE应用程序从Sql转换为Oracle-有效方法的建议

Spring 将J2EE应用程序从Sql转换为Oracle-有效方法的建议,spring,jakarta-ee,ibatis,Spring,Jakarta Ee,Ibatis,我们有一个基于Struts2+spring+iBatis的J2EE应用程序;并非所有DAO都使用iBatis…有些代码仍然使用旧的JDBC方法与数据库交互。我们的DAO的所有调用存储过程都没有任何内联SQL。由于Oracle存储过程返回游标,我们必须彻底更改代码 对于我们来说,将当前的iBatis映射(sql)转换为oracle(使用groovy脚本)是相当容易的,而且转换调用sql中旧映射的Java代码也是很容易的 我们的问题是转换仍然使用JDBC方法的旧DAO。因为我们无论如何都要修改它们(

我们有一个基于Struts2+spring+iBatis的J2EE应用程序;并非所有DAO都使用iBatis…有些代码仍然使用旧的JDBC方法与数据库交互。我们的DAO的所有调用存储过程都没有任何内联SQL。由于Oracle存储过程返回游标,我们必须彻底更改代码

对于我们来说,将当前的iBatis映射(sql)转换为oracle(使用groovy脚本)是相当容易的,而且转换调用sql中旧映射的Java代码也是很容易的

我们的问题是转换仍然使用JDBC方法的旧DAO。因为我们无论如何都要修改它们(因为我们现在使用的是oracle),所以我们正在考虑将它们转换为iBatis映射。这是一个好方法吗?这将是我们方面的巨大努力

你认为解决这一巨大问题的最佳方法是什么

  • 我们应该开始工作并开始转换每个DAO中的每个方法吗
  • 我们是否应该尝试制作一些小脚本来查看每个方法,解析出相关信息,并从中生成iBatis映射
  • 出于维护和分离目的,我们是否应该为每个DAO设置1个iBatis映射

如果问题含糊不清,我很抱歉,但我只是想找一个以前经历过这类事情的人,他有一些建议或“经验教训”。

您应该做的第一件事是在测试中覆盖DAO层。这样你就能知道你在转换过程中是否弄坏了什么东西。如果要将存储过程从一个DBMS移动到Oracle,那么还应该使用类似的框架为其编写测试

您应该有一个测试数据库实例,其中填充了不变的样本数据。在运行完测试之后,您应该能够使用相同的样本数据集刷新此数据库。这将确保测试数据库处于已知状态。然后将输入参数与一些预期(正确)结果配对。您的测试将读取这些对,并针对测试DB实例执行它们,并确认返回了预期结果。假设您的测试改变了数据库,您将希望在测试套件的两次运行之间刷新数据库

第二,如果您已经进入并更改了Oracle的一些数据访问实现,为什么不利用这一机会将一些业务逻辑从数据库转移到Java中呢?在DBMS中维护大型代码库时,有许多文档记录良好的问题

我们是否应该尝试制作一些小脚本来查看每个方法,解析出相关信息,并从中生成iBatis映射

我不推荐这个。对于每种特殊情况,你花在调整脚本上的时间,再加上寻找它会引入的所有bug,最好是由一个有思想的人来完成转换

出于维护和分离目的,我们是否应该为每个DAO设置1个iBatis映射

好主意。然后,您可以在sqlMapConfig中将它们与


这将使映射更易于管理。只需确保在每个sqlMap中指定namespace属性,如下所示:

<sqlMap namespace="User">

因此,您可以重用sqlMaps之间的映射来实例化对象图(例如:加载用户及其权限时,User.xml sqlMap调用Permission.xml映射)

我们DAO的所有调用存储过程

我不明白iBatis在这里给你买了什么

也不清楚迁移是什么。您是说您已经决定将所有代码移动到存储过程中,这样就不再有内嵌SQL了?如果是这样的话,我会说不要使用iBatis。如果您已经在使用Spring,那么让它使用其对象调用Oracle,并将游标映射到对象中


关于创建JUnit或更好的TestNG测试的建议已经出台。在更改任何内容之前先这样做。

“…您应该做的第一件事是在测试中覆盖DAO层…”-请注意这一点。当您提到测试时…您是指单元测试吗?我的问题是……这些测试会自动运行吗?这意味着我必须进入每个jsp页面。单击触发DAO方法或测试的内容。或者这些测试将同时运行。如果一次完成所有操作,那么存储过程的参数是否会硬编码到测试中?@Omni:Junit和TestNG中有各种机制来设置测试套件。您可以在每次对代码进行更改后自动运行这些程序。这些将被更恰当地称为集成测试,因为您不仅要单独执行DAO impl,还要与DB实例一起执行。我建议您设置一个Maven目标、Ant任务、shell脚本或一些其他机制,只需单击一下(甚至在SCM签入时自动)就可以运行全套测试。如果速度太慢,请尝试将其移动到另一台机器或另一个时间表。此外,您也不希望硬编码参数。目标是您拥有一组参数及其预期结果。您可以将这些键/值对保存在XML中,并通过Commons配置轻松读取。然后您将拥有一个测试数据库实例,其数据不会更改。这一点很重要,因为如果您使用某个活动实例,数据更改可能会错误地中断您的测试。他们可能将其用于自动对象实例化,因此不必手动将结果集转换为对象实例。不,我们不会将代码移到存储过程。基本上,后端正在从SQL更改为Oracle,我们的代码也需要随之更改。即使在这次迁移之前,我们也在使用存储过程。现在的区别是SQL存储过程返回结果集,而oracle返回游标。这就是我们的代码需要更改的原因
<sqlMap namespace="User">