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

Zac*_*ach 9 java design-patterns jpa jdbc

我想作为一个新手寻求建议,因为我正在努力养成良好的习惯.

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

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

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

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

Tah*_*tar 10

JPA可以是一个很好的长期解决方案.但是如果你更喜欢接近普通的SQL,你可以考虑其他选项,比如Spring Framework的JDBC支持.

注意,您不需要使用其他spring框架组件链接DI,MVC等就可以使用Spring JDBC.它安静易用,无需其他部件弹簧框架.当使用了Spring JDBC,你需要做下面的代码中的任务:

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

你需要做的是:

  1. 定义连接参数.(一旦)
  2. 指定SQL语句.(对于每个查询)
  3. 声明参数并提供参数值(使用预准备语句时)
  4. 为每次迭代完成工作.(spring执行结果集遍历,你只需要为单行提供逻辑)

spring-jdbc的另一个好处是它用未经检查的异常替换了JDBC检查的异常.


Mar*_*rvo 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)
Run Code Online (Sandbox Code Playgroud)

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

EmployeeJdbcDAO.create(Employee emp)
EmployeeJdbcDAO.update(Employee emp)
EmployeeJdbcDAO.delete(Employee emp)
Run Code Online (Sandbox Code Playgroud)

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