Java 如何在不使用ORM和直接JDBC(或等效工具)的情况下处理这些常见问题?
在使用JDBC时,我通常需要考虑以下问题。我不想太难,只是让一些东西工作,但我想知道,没有ORM或其他库,人们是如何处理这些问题的Java 如何在不使用ORM和直接JDBC(或等效工具)的情况下处理这些常见问题?,java,orm,jdbc,jakarta-ee,Java,Orm,Jdbc,Jakarta Ee,在使用JDBC时,我通常需要考虑以下问题。我不想太难,只是让一些东西工作,但我想知道,没有ORM或其他库,人们是如何处理这些问题的 快速加载与延迟加载: 您是否只有一个域对象,并且依赖子对象为null,并让调用方负责在需要时调用DAO来加载这些子对象?还是只对同一个域对象使用多个传输对象?这也意味着您必须为急切情况和懒惰情况维护单独的SQL查询 域对象和传输对象: 您甚至需要域对象和传输对象吗?对于上述情况,通过传输对象使用域对象的不同表示可能更容易实现。最后,如果使用传输对象,相关对象会被“分
至于我为什么要问这个问题,你知道有些开发团队是如何“害怕”使用ORM的,或者出于任何原因不喜欢ORM(通常是因为他们不理解ORM),所以有时候JDBC是你唯一的选择…嗯,底线是每个问题都有不同的解决方案,而适合你的方法将取决于上下文:没有一种适合所有人的方法 例如,对于数字3,我们有一个表,它为每个类型维护一个唯一的id计数器(每个实体类型一行):当您需要id时,为类型选择当前值,然后在数据库中递增它。这个解决方案很简单,但扩展性不好:如果您想改进它,那么您可以让应用层批量分配这些ID的负载(比如说,每种类型一次分配50个),然后在插入新数据时根据需要分发它们,只有在数据库的池耗尽时才返回数据库。这本质上是一种类似的模拟 对于第四个,与另一个实体类型有关系的每个实体类(包装单个表的类)负责级联删除等
归根结底,ORM只是一个抽象,所以如果你仔细看,所有这些问题都已经被库实现者解决了。在这种情况下,你只需要做腿部工作 好吧,底线是每个问题都有不同的解决方案,适合你的解决方案取决于具体情况:没有一种适合所有人的方法 例如,对于数字3,我们有一个表,它为每个类型维护一个唯一的id计数器(每个实体类型一行):当您需要id时,为类型选择当前值,然后在数据库中递增它。这个解决方案很简单,但扩展性不好:如果您想改进它,那么您可以让应用层批量分配这些ID的负载(比如说,每种类型一次分配50个),然后在插入新数据时根据需要分发它们,只有在数据库的池耗尽时才返回数据库。这本质上是一种类似的模拟 对于第四个,与另一个实体类型有关系的每个实体类(包装单个表的类)负责级联删除等
归根结底,ORM只是一个抽象,所以如果你仔细看,所有这些问题都已经被库实现者解决了。在这种情况下,你只需要做腿部工作 因此,作为一种扩展,在没有反射和代理等的情况下解决这些问题是可能的,这就是ORM的引擎盖下如何处理大量此类东西?@GreenieMeanie:答案是你可以,但不一定以这样一种通用的方式。我的意思是,你可以为每个问题设计策略并手工实现,但是如果没有这些功能,你很难写出一些通用的东西来完成繁重的工作。如果你使用C++之类的静态语言,你最接近的是代码生成脚本。你的解决方案是获取ID的防弹性吗?select必须确保锁定以防止重复ID,对吗?Oracle有序列,SQLServer有身份密钥,为什么不直接使用它们呢?是的,我肯定会使用DBMS的密钥生成机制以及getGeneratedKeys()。因此,作为扩展,不需要反射和代理等就可以解决这些问题,这就是ORM如何在引擎盖下处理大量此类东西?@GreenieMeanie:答案是你可以,但不一定是以这样一种通用的方式。我的意思是,你可以为每个问题设计策略并手工实现,但是如果没有这些功能,你很难写出一些通用的东西来完成繁重的工作。如果你使用C++之类的静态语言,你最接近的是代码生成脚本。你的解决方案是获取ID的防弹性吗?select必须确保锁定以防止重复ID,对吗?Oracle有序列,SQLServer有身份密钥,为什么不直接使用它们呢?是的,我肯定会使用DBMS的密钥生成机制以及getGeneratedKeys()。这被称为“艰难之路”。-)这叫做“艰难之路”。-)