码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何使用 Jdbc 模板映射一对多


    我遇到了弗拉德在推特上提到的一个堆栈溢出问题。 如何在春季 jdbc 模板中映射一对多关系。

    第一个问题是,使用 RowMapper 接口实际上只能映射一对一的关系,因为它假定一个 ResultSet 行将映射到一个对象。

    正如RowMapper接口所述:

    用于在每行的基础上映射结果集的行... 此接口执行将每行映射到结果对象的实际工作

    为了能够映射通常使用联接恢复的一对多,您需要能够将多行聚合到一个对象中。ResultSetExtractor将允许跨 Merge 工作,然后返回一个集合。ResultSet

    对于结果集处理,RowMapper 通常是一个更简单的选择,它每行映射一个结果对象,而不是整个结果集映射一个结果对象。

    您可以使用根对象 ID 更改来检测新对象何时启动。 代码看起来像。

    1. List users = new ArrayList<>();
    2. User currentUser = null;
    3. while(rs.next()) {
    4. long id = rs.getLong("id");
    5. if (currentUser == null) { // initial object
    6. currentUser = mapUser(rs);
    7. } else if (currentUser.getId() != id) { // break
    8. users.add(currentUser);
    9. currentUser = mapUser(rs);
    10. }
    11. currentUser.addRole(mapRole(rs));
    12. }
    13. if (currentUser != null) { // last object
    14. users.add(currentUser);
    15. }

    这还不错,但随着您添加更多联接,复杂性会迅速增加。

    幸运的是,SimpleFlatMapper已经解决了这个问题。 您需要做的就是使用JdbcTemplateMapperFactory 创建 aage。ResultSetExtractor

    1. private final ResultSetExtractor> resultSetExtractor =
    2. JdbcTemplateMapperFactory
    3. .newInstance()
    4. .addKeys("id") // the column name you expect the user id to be on
    5. .newResultSetExtractor(User.class);

    您现在可以使用它来映射您的一对多。resultSetExtractor

    1. String query =
    2. "SELECT u.id as id, u.username, u.id as adverts_id, ad.text as adverts_text"
    3. + "FROM user u LEFT OUTER JOIN advert ad ON ad.account_id = ac.id order by id "
    4. List results = template.query(query, resultSetExtractor);

    请注意,sfm 使用根 id 中断作为其聚合的基础,因此查询的顺序很重要。

    自6.2.0以来的更新是一个新选项允许使用无序结果集进行联接映射。unorderedJoin()

    如果要将角色列表保留在用户对象之外,该怎么办?

    无需使用User类和UserWithRole类,您只需将查询映射到ausing sfm元组或jOOL。Tuple2>

    1. private final ResultSetExtractor>> resultSetExtractor =
    2. JdbcTemplateMapperFactory
    3. .newInstance()
    4. .addKeys("id") // the column name you expect the user id to be on
    5. .newResultSetExtractor(new TypeReference>> {});

    然后

    1. String query =
    2. "SELECT u.id as id, u.username, u.id as adverts_id, ad.text as adverts_text"
    3. + "FROM user u LEFT OUTER JOIN advert ad ON ad.account_id = ac.id order by id "
    4. List>> results = template.query(query, resultSetExtractor);

    每个元组 2 都有用户及其关联的角色。

    总结

    您不需要使用复杂的 ORM 将 sql 查询映射到对象,即使有多个一对多关系也是如此。 SimpleFlatMapper已经为您处理了所有的复杂性,因此请放弃编写手动RowMapper,并花时间编写业务逻辑而不是样板映射代码。

  • 相关阅读:
    [nodemon] app crashed - waiting for file changes before starting...解决方法
    Kotlin语法入门-密封类和密封接口(11)
    java毕业生设计校园招聘管理系统计算机源码+系统+mysql+调试部署+lw
    音视频开发15 FFmpeg FLV封装格式分析
    Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案
    109.网络安全渗透测试—[权限提升篇7]—[Windows Mysql UDF提权]
    使用idea开发工具maven 缺失依赖
    刷题记录(NC24623 Tree Decoration,NC16612 [NOIP2009]靶形数独,NC16665 [NOIP2004]虫食算)
    sklearn MLP红酒分类
    websocket多线程发送消息报错TEXT_PARTIAL_WRITING--自旋锁替换synchronized独占锁的使用案例
  • 原文地址:https://blog.csdn.net/allway2/article/details/127585808
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号