首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有农业/组合的Spring框架JDBC DAO

带有农业/组合的Spring框架JDBC DAO
EN

Stack Overflow用户
提问于 2010-06-21 13:39:49
回答 1查看 3.9K关注 0票数 4

我有一个应用程序,它已经在使用Spring Framework和Spring JDBC,其中有一个使用SimpleJdbcTemplate和RowMapper类的DAO层。对于从数据库读取的小类结构,这似乎工作得很好。但是,我们需要加载包含其他对象集合的对象,这些对象仍然包含其他对象的集合。

这个问题的“显而易见”解决方案是创建一个命名的RowMapper类或我们的对象,并在构造函数中传递对适当DAO对象的引用。例如:

代码语言:javascript
运行
AI代码解释
复制
public class ProjectRowMapper implements ParameterizedRowMapper {

    public ProjectRowMapper(AccountDAO accountDAO, ) {
        this.accountDAO = accountDAO;
    }

    public Project mapRow(ResultSet rs, int rowNum) throws SQLException {
        Project project= new Project ();
        project.setProjecttId( rs.getString("project_id") );
        project.setStartDate( rs.getDate("start_date") );
        // project.setEtcetera(...);

        // this is where the problems start
        project.setAccounts( accountDAO.getAccountsOnProject(project.getProjectId()) );
     }
}

问题是,即使ProjectDAO和Account DAO共享同一个DataSource实例(在我们的示例中,这是一个连接池),任何数据库访问都是通过不同的连接完成的。

如果对象层次结构甚至有三层深,使用此实现会导致(a)框架对datasource.getConnection()的多次调用,以及(2)更糟糕的结果,因为我们限制了连接池中允许的连接数量,当多个线程试图从数据库加载项目时,可能会出现竞争情况。

在Spring中有没有更好的方法(不需要另一个成熟的ORM工具)来实现这样的对象层次结构的加载?

谢谢,保罗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-26 13:36:37

我猜您不使用ORM是有原因的,ORM是解决这类问题的理想工具。

多个连接的问题是递归调用另一个DAO。为了避免使用额外的连接,Account对象应该在项目实例被获取之后检索。在获取项目时,帐户it也会被获取,但不会“实例化”到account实例-它们仍然是it列表,然后在项目DAO完成其工作后填充。

例如,您可以构建一个采用ID列表和DAO实现的自定义列表类型。该列表仅填充ProjectRowMapper中的is,并分配给项目的accounts属性。ID对于列表是私有的--它们不是列表的“内容”,而是以后产生真实内容的一种手段。

一旦Project DAO从RowMapper获取了项目,它就可以指示列表获取保存在列表中的in的帐户。这些帐户是作为的非嵌套操作获取的,因此整个过程在任何时候都只使用一个连接。然而,fetch是在DAO方法的作用域内完成的,所以fetch是急切地完成的-所以没有延迟加载问题需要处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3085124

复制
相关文章
Swift 全局导入Module
我们有时候需要全局导入一个Module,因为这个组件在每个文件都使用很频繁。在OC的时代,PCH做的工作,Swift怎么办呢
星宇大前端
2019/04/01
1.4K0
Swift 4 新特性
private 权限扩大 在 Swift 4 中,extension 可以读取 private 变量了。 Swift 3 中,如果将主体函数的变量定义为 private,则其 extension 无法读取此变量,必须将其改为 filePrivate 才可以。 单向区间 单向区间是一个新的类型,主要分两种:确定上限和确定下限的区间。直接用字面量定义大概可以写成 …6和 2… 例如 let intArr = [0, 1, 2, 3, 4] let arr1 = intArr[...3] // [0,
BY
2018/05/11
9060
Swift 4 新特性
Swift 3 中,如果将主体函数的变量定义为 private,则其 extension 无法读取此变量,必须将其改为 filePrivate 才可以。
零式的天空
2022/03/25
4820
Swift基础 关于Swift
Swift 是编写软件的绝佳方式,无论是手机、台式机、服务器还是任何其他运行代码的内容。这是一种安全、快速和互动的编程语言,它结合了现代语言思维的最佳与更广泛的苹果工程文化的智慧以及开源社区的各种贡献。编译器针对性能进行了优化,语言也针对开发进行了优化,同时不影响两者。
郭顺发
2023/07/17
1310
4.Swift教程翻译系列——Swift基本运算符[通俗易懂]
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427
全栈程序员站长
2022/07/07
7620
Swift进阶一:Swift简介
Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递,所以我们可以使用Swift来进行函数式编程,另外Swift也提供了很多高阶函数来辅助我们进行函数式编程;Swift也提供了属性的权限限定等面向对象的基础设置,因此在Swift中也可以面向对象来编程。
拉维
2020/07/09
2.9K0
Swift进阶一:Swift简介
Swift4 String的用法
本文语法为Swift4 获取字符串的长度 let str = "窗前明月光,疑是地上霜"; let length = str.count; 正则获取字符串 let str = "哈哈[呵呵]嘿嘿" if let range = str.range( of: "\\[[^\\[^\\]]+\\]", options: NSString.CompareOptions.regularExpression, range: nil, locale: nil ){ if
码客说
2019/10/22
5220
【Swift4】(7) 枚举 | 应用
前端修罗场
2023/10/07
1540
Swift
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118291.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/13
2.1K0
Swift 入门:编译 Swift 源码(1)
编程语言的很多特性都是依赖于编译器的。比如,与 C 语言的枚举相比,Swift 的枚举就依赖编译器实现了关联值等高级特性。
酷酷的哀殿
2020/11/07
6.5K1
Swift 统一导入三方库
此时在Swift中的宏定义那就只能找个文件直接let了,比如Const.swift之类的。
韦弦zhy
2018/09/11
2.1K0
Swift 入门:编译 Swift 源码(2)
我们曾经在上一篇文章中 https://cloud.tencent.com/developer/article/1744552 提到 Swift 及相关组件的编译会耗费大量的磁盘空间。
酷酷的哀殿
2020/11/15
2K0
Swift 入门:编译 Swift 源码(2)
Swift和OC互调(一)Swift调用OCOC调用Swift
整理之前学习swift的笔记,虽然现在看起来很简单,但还是想分享出来。 (一)Swift调用OC 假设:我们的项目是Swift的。项目中用到了OC写的一些类。那么怎么让Swift调用OC类呢?如下图:
VV木公子
2018/06/05
13.6K0
Swift4语法新特性 原
      随着iPhone X的来到,iOS11的发布,Swift语言也更新到了第4个版本。在Swift4中,无论是代码风格还是编程理念都更进一步的融合了许多现代编程的思想。对于熟悉传统语言的开发者来说(尤其是Objective-C、Java和C++),可能会感觉这些特性并没有多大的价值反而非常不习惯,但是我们依然可以茶余饭后(没事干的时候),一窥Swift4语言的玩法,体验一下Swift语言的设计思想和编码风格。
珲少
2018/08/15
1.7K0
Swift2转Swift3
接触swift 已经有一年多的时间了,由最初的OC代码转为 swift 代码,然后从 swift 2.3 转为 swift 3。每次的转换都感觉是将项目整个的翻新了一遍,每次的转换代码都是一次改朝换代。
onety码生
2018/11/21
2K0
使用 Swift Package Manager 创建 Swift 包
image.png Using the Package Manager 官网 https://swift.org/getting-started/#using-the-package-manager 进入准备创建 Swift 包文件位置 image.png 创建新的Swift包,首先要创建并输入一个名为的目录 perfect-Qiniu: image.png 进入刚才创建的 perfect-Qiniu 文件
LeeCen
2018/10/11
1.4K0
使用 Swift Package Manager 创建 Swift 包
【Swift4】(4) 控制流 for | switch | if-else
前端修罗场
2023/10/07
1820
Swift-?-!
上面了解到的是普通值,接下来Optional值要上场了。Optional其实是个enum,里面有None 和Some两种类型。其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会 通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值) 的原因,也是Playground会把Optional值显示为类似{Some”hello world”}的原因,这里是 enum Optional的定义:
用户3004328
2018/09/06
9190
Swift Runtime ?
你肯定也想过       在OC中相信每一个iOS开发都知道Runtime, 现在Swift也更新到4.0版本了,要是你也学习过Swift的话你可能也会想过这样一个问题,OC大家都知道是有动态性的,你能通过Runtime 的API获取你想要的属性方法等等,那Swift呢?是不是也和OC一样呢?       这个问题在我看Swift的时候也有想过,带着这个问题就总结出了今天这篇文章。       先说说这个Runtime,在自己之前的文章中有总结过关于OC的Runtime以及它API的一些基本的方法和在项目中
Mr.RisingSun
2018/02/06
5K0
Swift Runtime ?
swift set
set是一个Set类型的集合,集合中只能出现String类型的数据,如果放入了其他类型,会报错。但是如果没有指定集合中的数据类型,那就没有关系。
赵哥窟
2018/09/13
7550
swift set

相似问题

如何在游乐场中导入Swift软件包?

49

无法将Firebase导入Swift游乐场

20

Swift软件包管理器- Swift 4语法

13

Swift4游乐场凯撒密码错误

23

无法使用Swift 4软件包管理器导入包

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档