<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          擼一段 SQL ? 還是擼一段代碼?

          共 2758字,需瀏覽 6分鐘

           ·

          2020-06-14 23:21

          點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

          設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨。

          以下都為個(gè)人思考總結(jié)所得,只作為拋磚引玉之說,一定會(huì)有不同意見,如果你有不同看法,歡迎拍磚。記得剛?cè)牍編业难邪l(fā)哥們能寫一手漂亮的 SQL,搜索準(zhǔn)確、執(zhí)行快、效率高。配合Web項(xiàng)目中的查詢展示數(shù)據(jù)的需求,基本是分分鐘完成任務(wù)。那段時(shí)間基本是仰視的態(tài)度,每天都去討教一點(diǎn)手寫 SQL 的要點(diǎn),翻看一些 SQL 優(yōu)化調(diào)整的技巧。隨著積累和實(shí)踐,SQL 水平提高的很快,同時(shí)也寫了很多,隨后經(jīng)歷了幾個(gè)項(xiàng)目的打磨,不斷去調(diào)整公司的框架,發(fā)現(xiàn)項(xiàng)目中大段 SQL 出現(xiàn)的概率越來越小。我不得不停下腳步,開始反思和總結(jié)出現(xiàn)這種現(xiàn)象的原因。如果你手上不忙并且感興趣,請(qǐng)聽我慢慢道來。下面是一個(gè)經(jīng)典的系統(tǒng)權(quán)限數(shù)據(jù)庫設(shè)計(jì),作為例子來展開論述。3e503ea62e0b658398a7d9ff0af1d20c.webp組織機(jī)構(gòu)、用戶、角色、菜單作為4個(gè)主要設(shè)計(jì)對(duì)象,添加三張兩兩關(guān)系映射表。能很好的做到水平和縱向擴(kuò)展,其中主要設(shè)計(jì)對(duì)象我只添加了幾個(gè)需要的字段。該設(shè)計(jì)完全可以引入到你的項(xiàng)目中,根據(jù)項(xiàng)目實(shí)際使用人群和需求添加必要字段。然后配合 Shiro 或者 Spring -Security 能很完美的解決組織用戶角色菜單的權(quán)限問題。言歸正傳,項(xiàng)目需求中有這個(gè)一個(gè)要求,需要推送當(dāng)前用戶所有的菜單項(xiàng),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';
          你需要在數(shù)據(jù)庫中執(zhí)行好,粘貼到你的代碼中,使用數(shù)據(jù)訪問對(duì)象去數(shù)據(jù)庫執(zhí)行該SQL獲取數(shù)據(jù)。下面看段相同邏輯的面向?qū)ο蟠a邏輯。
          RoleUserPO?roleUserPO?=?roleService.findUserRoleByUserId("用戶ID");
          ????????if?(roleUserPO?==?null)?{
          ????????????return?"當(dāng)前用戶沒有設(shè)置角色!";
          ????????}

          ????????List?roleMenuPOs?=?roleService.findRoleMenusByRoleId(roleUserPO.getRoleid());
          ????????if?(roleMenuPOs?==?null)?{
          ????????????return?"當(dāng)用戶所在角色沒有設(shè)置菜單!";
          ????????}

          ????????List?menuPOLis?=?new?ArrayList();
          ????????for?(RoleMenuPO?roleMenuPO?:?roleMenuPOs)?{
          ????????????menuPOLis.add(menuService.findMenuById(roleMenuPO.getMenuid()));
          ????????}
          ????????return?menuPOLis;

          上面這例子放在這里這樣一對(duì)比是不是有感覺了,如果還不夠強(qiáng)烈請(qǐng)?jiān)谕驴纯础?/span>

          項(xiàng)目需求中同樣也有一個(gè)這樣的要求,需要羅列特定角色在特定部門下的用戶,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'

          同樣擼段相同邏輯的面向?qū)ο蟠a邏輯。

          List?userPO1s?=?roleService.findUsersByRoleId("角色I(xiàn)D");
          ????????if?(userPO1s?==?null)?{
          ????????????return?"當(dāng)前角色沒有添加用戶!";
          ????????}

          ????????List?userPO2s?=?orgaService.findUsersByOrgaId("組織機(jī)構(gòu)ID");
          ????????if?(userPO2s?==?null)?{
          ????????????return?"當(dāng)前機(jī)構(gòu)沒有添加用戶!";
          ????????}

          ????????List?userPOList?=?new?ArrayList();
          ????????for?(UserPO?userPO1?:?userPO1s)?{
          ????????????for?(UserPO?userPO2?:?userPO2s)?{
          ????????????????if?(userPO1.getUuid().equals(userPO2.getUuid()))?{
          ????????????????????userPOList.add(userPO1);
          ????????????????????break;
          ????????????????}
          ????????????}
          ????????}
          ????????return?userPOList;

          有沒有感覺出面向?qū)ο蟠a邏輯不僅讀起來簡(jiǎn)單,而且能很清楚的提示出錯(cuò)的原因。而且現(xiàn)在主流的數(shù)據(jù)庫還是面向關(guān)系的,而編程語言已經(jīng)從面向過程發(fā)展為面向?qū)ο蟆?/span>

          也就是說兩者完全不搭調(diào),也就是現(xiàn)在 ORM 框架不斷壯大的原因,編程中需要將數(shù)據(jù)表作為對(duì)象去對(duì)待和處理。代碼中出現(xiàn)大段 SQL 與面向?qū)ο蟮脑O(shè)計(jì)思路完全是背道而馳。

          如果查詢 SQL 出現(xiàn)問題,將后臺(tái)打印的 SQL 粘貼到 SQL 執(zhí)行工具中去執(zhí)行,分析原因,兩個(gè)工具切來切去,你不覺得費(fèi)勁么?

          這應(yīng)該就是后續(xù)我接觸的項(xiàng)目,SQL 減少的主要原因,我們喜歡在一個(gè)面向?qū)ο蟮念l道去編程。

          作者:Orson

          cnblogs.com/java-class/p/5985916.html

          ——End——

          后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

          后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。

          推薦閱讀


          這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營
          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色日本视频 | 69精品无码一区二区三区 | 亚洲123区 | 五月天综合在线 | 国产激情终合 |