2017-09-28 91 views
0

我已经非常高兴地使用Dapper构建了一些数据层。当然,维护所需的SQL字符串可能是一个问题,特别是当数据库模式更改时(重命名列等)。最小化/管理数据访问代码中的SQL字符串blob(例如Dapper)的最佳实践

我正在寻找一种策略来“移除”大多数SQL字符串blob(不使用EF或Linq)。要么找到/建立一个类型安全的查询API来生成SQL(如jooq)或想到某种类型的元生成。

我错过了什么?有最佳做法还是更好的方法?

谢谢

注意:使用EF或LINQ将解决这个问题,但我们正在努力尽可能接近SQL越好。

+1

曾听说过[存储过程](http://sqlmag.com/t-sql/t-sql-101-stored-procedures)? –

+1

Dapper创建粘性DAL。我使用Dapper-Extensions来最小化这个问题。请参阅这两个答案的示例代码。 stackoverflow.com/a/45460483/5779732; stackoverflow.com/a/45029588/5779732 –

回答

0

我完全同意John Wu的看法。存储过程是去这里的路。
您可以将存储过程视为封装数据库的一种方式 - 应用程序不需要知道数据如何存储,只需要知道存储过程是否可用以及它们的功能。

有很多好处:

  1. 这样可以使你的SQL语句出的应用程序代码。
  2. 您的查询已在数据库中编译并重新使用,因此您可以获得性能。
  3. 您的SQL登录可能有更严格的安全细节,使黑客更难以破坏您的数据库。
  4. 存储过程几乎消除了SQL注入的可能性(除非在内部使用动态SQL),因为必须使用参数将数据传递到存储过程。
  5. 无需重新编译软件就可以对数据库结构进行一些更改,因为它不再直接访问表。
  6. 使用存储过程可以更高效地完成很多SQL代码(例如,Inline sql不能使用表值参数)
  7. 使用存储过程可以让您的生活更轻松,如果您需要支持多个数据库供应商 - 例如,pl/sql和t-sql之间的差异不再是问题。

我敢肯定,有很多原因我没有涉及,还有一些原因是因为使用存储过程。 (例如,有人可能会说存储过程允许您将逻辑移动到数据库,并且这是放置逻辑的错误位置。我个人不同意这种说法 - 我认为某些逻辑必须位于数据库中。)

+0

谢谢Zohar非常好的答案。完全同意存储过程的优点。我的问题更多的是关于管理内联sql,确保它与db模式同步,而不是没有它。虽然有效。 – smv

+0

是的,好吧,这个答案有点不错 - 你不应该处理内联sql来开始:-) –