Java JDBC vs JPA用于数据库应用程序

时间:2011-07-22 00:41:15

标签: java design-patterns jpa jdbc

我想在序言中说我有点像新手一样寻求建议,因为我正在努力养成良好的习惯。

我正在开发的应用程序是一个高度集成的数据库应用程序。当我开发和探索并实现每个实体的需求时,我发现我的类只是用代码爆炸,以不同的方式在每个实体上运行查询。

虽然现在可能不是一件坏事,但在维护方面,我预见我的应用程序是调试和更新的噩梦。

是否有任何JDBC专家对设计模式有任何建议,有助于减少锅炉板类型代码以处理所有这些查询?或者我应该完全偏离并使用JPA?

我过去曾尝试过实施JPA,但在复杂的实体关系方面遇到了麻烦。我应该只读一本JPA书并从那里开始吗?

5 个答案:

答案 0 :(得分:10)

JPA可以是一个很好的长期解决方案。但是如果您希望更接近普通SQL,可以考虑其他选项,如Spring Framework's JDBC support

注意,您不需要使用其他spring框架组件链接DI,MVC等就可以使用Spring JDBC。它安静易用,无需其他部件弹簧框架。 使用spring jdbc时,需要在代码中执行以下任务:

  1. 打开连接。
  2. 准备并执行声明。
  3. 设置循环以迭代结果(如果有)。
  4. 处理任何异常。
  5. 处理交易。
  6. 关闭连接,语句和结果集。
  7. 您需要做的是:

    1. 定义连接参数。 (一次)
    2. 指定SQL语句。 (对于每个查询)
    3. 声明参数并提供参数值(使用预准备语句时)
    4. 为每次迭代完成工作。 (spring执行结果集遍历,您只需要提供单行操作的逻辑)
    5. spring-jdbc的另一个好处是它用未经检查的异常替换了JDBC检查的异常。

答案 1 :(得分:6)

无论您使用哪种解决方案,无论是直接使用JDBC还是JPA,都要确保将代码分解为可以在更改技术时轻松换出的代码。

JDBC的缺点是你最终可能会遇到特定于实现的代码(Oracle,MS,MySQL等)。如果你决定改变一些事情,这可能是一个真正的痛苦。

我最后研究了Hibernate,这本书Harnessing Hibernate让我有了很多方法来进行这种开发(并且还带来了Spring和Maven的搭载,以慢慢建立的方式)彼此。)

无论采用什么方法,你最终应该得到的是:

  • DAO对象 - 这些数据访问对象将执行您的CRUD操作(创建,更新和删除),并且应该与数据库无关。

  • 模型对象 - 这些应该代表您的数据,并且可能看起来很像数据库表中单行的Java表示。 DAO类将返回这些或这些列表。

利用Hibernate在后面的章节中描述了一个模式(在它向你抛出Spring之后),你将基本上使用两层DAO类。最高级别的DAO类将实例化(或允许注入)特定于实现的DAO类。

所以,让我们假装你有一个EMPLOYEE数据库表。因此,您创建一个名为Employee的模型对象,该对象保存EMPLOYEE表中的一行中的所有数据。现在,您创建一个名为EmployeeDAO的DAO类,它实现以下内容:

EmployeeDAO.createEmployee(Employee emp)
EmployeeDAO.updateEmployee(Employee emp)
EmployeeDAO.deleteEmployee(Employee emp)

您最初的想法是将JDBC调用放在那里。但是不要这样做。相反,您现在为Employee编写另一个DAO,并且这个DAO将实现所有JDBC调用。 (假设你去了JDBC):

EmployeeJdbcDAO.create(Employee emp)
EmployeeJdbcDAO.update(Employee emp)
EmployeeJdbcDAO.delete(Employee emp)

现在EmployeeDAO中的方法?它们只是实例化EmployeeJdbcDAO,并调用适当的方法。当用Hibernate切换到Oracle时,你需要创建一个名为EmployeeOrHibDAO的新DAO类,在那里编写Hibernate和Oracle特定代码,然后在EmployeeDAO中调用EmployeeJdbcDAO,而不是实例化EmployeeOrHibDAO。 (使用Spring,您甚至不需要更改代码。您只需更改Spring DI配置。)

答案 2 :(得分:2)

不是真正的答案,但是,我认为在混合中添加更多可能有助于找到良好中间立场的选项非常重要。我建议这是因为对于没有公平分享战斗伤痕的人来说,对现有数据库进行JPA实现会有很多复杂性和查询,这可能会有点麻烦。考虑以下内容,但进行研究并构建一些跟踪子弹应用程序;

  1. Spring JDBCTemplate and DAO Pattern喜欢这个解决方案,其中JPA \ Hibernate没有意义。
  2. MyBatis再次,另一个很好的中间地带,对SQL
  3. 有更多的控制权

答案 3 :(得分:0)

如果你想养成良好的习惯,我会读Steve McConnell的Code Complete 2

答案 4 :(得分:0)

不要丢弃active record pattern作为选项。这不一定是EJB实体方法。这种模式值得一提IMHO