撸一段 SQL ? 还是撸一段代码?

简介:

  记得刚入公司带我的研发哥们能写一手漂亮的 SQL,搜索准确、执行快、效率高。

   配合Web项目中的查询展示数据的需求,基本是分分钟完成任务。

   那段时间基本是仰视的态度,每天都去讨教一点手写 SQL 的要点,翻看一些 SQL 优化调整的技巧。

   随着积累和实践,SQL 水平提高的很快,同时也写了很多,有兴趣的可以看看:http://www.cnblogs.com/

   随后经历了几个项目的打磨,不断去调整公司的框架,发现项目中大段 SQL 出现的概率越来越小。

   我不得不停下脚步,开始反思和总结出现这种现象的原因。如果你手上不忙并且感兴趣,请听我慢慢道来。

   下面是一个经典的系统权限数据库设计,作为例子来展开论述。

   组织机构、用户、角色、菜单作为4个主要设计对象,添加三张两两关系映射表。

   能很好的做到水平和纵向扩展,其中主要设计对象我只添加了几个需要的字段。

   该设计完全可以引入到你的项目中,根据项目实际使用人群和需求添加必要字段。

   然后配合 Shiro 或者 Spring -Security 能很完美的解决组织用户角色菜单的权限问题。

   言归正传,项目需求中有这个一个要求,需要推送当前用户所有的菜单项,SQL写法。

复制代码
      select a.uuid,a.name
        from menu a
        left join role_menu b
        on a.uuid = b.menuid
        left join role_user c
        on b.roleid = c.roleid
        where c.userid = '用户uuid';
复制代码

   你需要在数据库中执行好,粘贴到你的代码中,使用数据访问对象去数据库执行该SQL获取数据。

   下面看段相同逻辑的面向对象代码逻辑。

复制代码
        RoleUserPO roleUserPO = roleService.findUserRoleByUserId("用户ID");
        if (roleUserPO == null) {
            return "当前用户没有设置角色!";
        }

        List<RoleMenuPO> roleMenuPOs = roleService.findRoleMenusByRoleId(roleUserPO.getRoleid());
        if (roleMenuPOs == null) {
            return "当用户所在角色没有设置菜单!";
        }

        List<MenuPO> menuPOLis = new ArrayList<MenuPO>();
        for (RoleMenuPO roleMenuPO : roleMenuPOs) {
            menuPOLis.add(menuService.findMenuById(roleMenuPO.getMenuid()));
        }
        return menuPOLis;
复制代码

    上面这例子放在这里这样一对比是不是有感觉了,如果还不够强烈请在往下看看。

    项目需求中同样也有一个这样的要求,需要罗列特定角色在特定部门下的用户,SQL 写法。

复制代码
select a.*
  from user a
  LEFT JOIN role_user b
    on a.UUID = b.userid
  LEFT JOIN orga_user c
    on a.uuid = c.userid
 where b.ROLEID = 'c9845b33973511e6acede16e8241c0fe'
   and c.ORGAID = '75284c22973211e6acede16e8241c0fe'
复制代码

   同样撸段相同逻辑的面向对象代码逻辑。

复制代码
        List<UserPO> userPO1s = roleService.findUsersByRoleId("角色ID");
        if (userPO1s == null) {
            return "当前角色没有添加用户!";
        }

        List<UserPO> userPO2s = orgaService.findUsersByOrgaId("组织机构ID");
        if (userPO2s == null) {
            return "当前机构没有添加用户!";
        }

        List<UserPO> userPOList = new ArrayList<UserPO>();
        for (UserPO userPO1 : userPO1s) {
            for (UserPO userPO2 : userPO2s) {
                if (userPO1.getUuid().equals(userPO2.getUuid())) {
                    userPOList.add(userPO1);
                    break;
                }
            }
        }
        return userPOList;
复制代码

  有没有感觉出面向对象代码逻辑不仅读起来简单,而且能很清楚的提示出错的原因。

  而且现在主流的数据库还是面向关系的,而编程语言已经从面向过程发展为面向对象。

  也就是说两者完全不搭调,也就是现在 ORM 框架不断壮大的原因,编程中需要将数据表作为对象去对待和处理。

  代码中出现大段 SQL 与面向对象的设计思路完全是背道而驰。

  如果查询 SQL 出现问题,将后台打印的 SQL  粘贴到 SQL 执行工具中去执行,分析原因,两个工具切来切去,你不觉得费劲么?

  这应该就是后续我接触的项目,SQL 减少的主要原因,我们喜欢在一个面向对象的频道去编程。

  好了,就这样吧。以上都为个人思考总结所得,只作为抛砖引玉之说,如果你有不同意见,欢迎拍砖。

  本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5985916.html,如需转载请自行联系原作者

相关文章
|
5月前
|
SQL 存储 安全
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
67 1
|
5月前
|
SQL 数据库连接 索引
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
43 0
|
2月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
29 1
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
76 0
|
2月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
27 0
|
2月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
|
3月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之将RDS切换到PolarDB-X 2.0时,代码层的SQL该如何改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
SQL DataWorks 大数据
DataWorks操作报错合集之SQL代码行数过长产生报错,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
SQL 数据库
实时数仓 Hologres产品使用合集之如何找回之前的SQL查询代码
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
下一篇
无影云桌面