草庐IT

java - 在抽象访问的同时访问数据库中数据的最佳实践

coder 2023-12-24 原文

我正在尝试学习以下场景的最佳实践。

我有一组定义的数据对象,这些对象会随着更新而变化。其中一些对象中包含其他对象的数组。

使用 sqlite 我将数据库设置为以下模式:每个对象都在其表上。如果一个对象中有一个子对象,它就有一个到子表的fk

表格名称和对象可能会发生变化。因此,为了便于更改这些,我需要能够隐藏数据库调用。我还需要能够在插入数据库之前验证数据。此验证也因对象而异,并且每个对象可以有不同类型的验证。

目前我正在尝试为每个对象创建一个 DAO。并为每个使用 ContentProviders 的对象提供一个 DatabaseHelper 来访问数据库。然后,开发人员使用 DAO 来完成他们的工作。

它似乎变得非常丑陋和复杂。似乎还有一种更简单的方法......也许是 ContentProviders 的一些技巧。

那么,有没有办法更好地将 ContentProvider 集成到 DAO 模式中?还是有更好的方法来实现这个目标?

非常感谢任何建议。

最佳答案

我最近在 .net 中创建了一个数据访问层。我创建了一个 BusinessObjectBase 类以及一个 BusinessObjectsBase(复数)类。将通用功能移到这些类中比人们最初想象的更具挑战性。这里有一些提示。

1) 由于 .Net 是一种类型化语言(Java 也是),我需要获取有关基类虚函数所运行的派生类的类型信息。为了做到这一点,我使用了 Curiously Recurring Template Pattern(虽然我实际上并没有听说过它,直到我自己意识到它的用处):http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern

基本上,它是一个将自己的类型作为泛型参数的泛型类。

2) 我非常依赖反射(reflection)。不过,我不知道 java 必须以反射方式提供多少,或者它是否足够快以对数据访问层有用。由于 native 反射方法太慢,我不得不使用在网上找到的免费 fasterflect 库。

3) 我使用 PostSharp(Java 有 Spring 来做同样的事情)来处理变化跟踪,这样它只会在对象实际发生变化时更新它们。

4) 好的,这是最重要的部分:保持简单。尽管我使用了一种奇怪的通用模式、反射和面向方面的编程来完全实现我想要的,但我的 dll 的核心实际上比你想象的要简单。我做了很多研究来寻找完美的 orm 工具,但发现最后只写一些函数来动态生成我自己的 sql 语句并不困难。这就是反射派上用场的地方,因为我将属性放在表示数据库中表的类上,以及表示表中字段的属性上。这样,您只需在表或字段名称更改时更改属性,并且...

5) 我创建了一个简短的应用程序(几乎适合一个页面)来读取数据库表/字段并为每个表动态生成包含类的代码文件。

好的,所以您可能不想创建那么复杂的东西,但我想我会根据自己的经验提出一些想法,也许您会发现其中一个或多个有用:)

(作为旁注,我知道很多人会想知道:为什么你要经历所有这些麻烦而不是仅仅使用现有的 ORM。我发现现有的 ORM 使用起来过于麻烦,我的实现是比我研究过的任何 ORM 都更轻量、更快)

关于java - 在抽象访问的同时访问数据库中数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424532/

有关java - 在抽象访问的同时访问数据库中数据的最佳实践的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐