Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产精品久久久久久久专区,91热国内精品永久免费观看,国产精品区免费视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          IDEA 2021首個(gè)大版本發(fā)布,Java開(kāi)發(fā)者感動(dòng)哭了(附新亮點(diǎn)演示)

          欲善其事,必先利其器!

          就在不久之前,Java領(lǐng)域的開(kāi)發(fā)神器IntelliJ IDEA終于迎來(lái)2021年的一個(gè)重要的大版本更新:IntelliJ IDEA 2021.1

          現(xiàn)如今大量的Java開(kāi)發(fā)者深度依賴著這款開(kāi)發(fā)軟件,正如網(wǎng)上的段子所言:“可以毫不夸張地說(shuō),多少Java程序員離開(kāi)了IDEA就不會(huì)寫代碼了(狗頭)”,由此可見(jiàn)其使用的廣泛程度。

          新版本一出來(lái),我也迫不及待地想嘗試一番。當(dāng)然,主力開(kāi)發(fā)機(jī)我是不敢亂升級(jí)的,所以這兩天,我在一臺(tái)平時(shí)用來(lái)做測(cè)試的老開(kāi)發(fā)本子上更新了全新的IDEA。

          軟件啟動(dòng)界面打開(kāi)的那一瞬間,我就知道事情并不簡(jiǎn)單。


          全新的啟動(dòng)頁(yè)面

          更新后,全新的啟動(dòng)頁(yè)面更加花里胡哨了。

          軟件啟動(dòng)速度也是非常之快,就我這多年苦練的火箭般手速,都差點(diǎn)沒(méi)截來(lái)下面這張啟動(dòng)頁(yè)面圖。


          Space集成

          JetBrains提供的Space這個(gè)功能不知道大家有沒(méi)有聽(tīng)說(shuō)過(guò),講白了就是一套集成的團(tuán)隊(duì)協(xié)作環(huán)境,可以提供包括構(gòu)建交付、聊天協(xié)作、團(tuán)隊(duì)管理以及項(xiàng)目管理等在內(nèi)的一整套協(xié)作一體化解決方案。

          最新的IDEA 2021.1把Space環(huán)境給無(wú)縫地集成進(jìn)來(lái)了,現(xiàn)在屬于開(kāi)箱即用的狀態(tài),軟件的右上角就有快捷入口:


          支持WSL 2

          這個(gè)功能相信對(duì)于很多依賴Windows系統(tǒng)以及WSL功能的用戶來(lái)說(shuō),簡(jiǎn)直是喜大普奔!

          以前WSL就算再好用,但是你的IDE并沒(méi)有和它打通,多少總是一個(gè)遺憾。

          這下好了,二者直接打通了,IDEA支持WSL 2。你可以直接在新版IDEA 2021.1中運(yùn)行并開(kāi)發(fā)WSL 2中的Java項(xiàng)目,包括Gradle類型項(xiàng)目和Maven類型等項(xiàng)目均支持。


          Run Targets

          Run Targets這個(gè)功能的意思有點(diǎn)類似于上面剛聊過(guò)的WSL 2。它允許開(kāi)發(fā)者直接在遠(yuǎn)程主機(jī)甚至在Docker容器上運(yùn)行和調(diào)試項(xiàng)目。

          所以到目前為止,新版IDEA 2021允許開(kāi)發(fā)者可以在本地、WSL 2、SSH遠(yuǎn)程主機(jī)、Docker等目標(biāo)上運(yùn)行項(xiàng)目,可以說(shuō)賊香了!


          支持Java 16

          這也算是一個(gè)比較重磅的更新。

          近兩年來(lái),Java版本的發(fā)布速度也是快如老狗,我還在用Java 8,它都淦到Java 16了。

          關(guān)于Java 16的新特性,我還準(zhǔn)備寫篇文章來(lái)詳細(xì)聊一聊呢,包括比如:

          • Records特性轉(zhuǎn)正
          • instanceof模式匹配轉(zhuǎn)正
          • jpackage轉(zhuǎn)正
          • Unix域套接字通道
          • 彈性Metaspace
          • ZGC
          • 矢量API
          • 外部鏈接API
          • ...

          這次IDEA 2021版的一個(gè)很重要的更新就是加入了對(duì)Java 16的基本支持,注意是基本支持。

          除此之外IDEA還新增了幾項(xiàng)檢查機(jī)制,典型比如更加智能的數(shù)據(jù)流分析檢查。

          鏈?zhǔn)綐?gòu)造方式的優(yōu)化格式設(shè)置等等。

          目的都是為了幫助提升可讀性,進(jìn)一步提升用戶體驗(yàn)。


          Code With Me

          Code With Me是一項(xiàng)用于協(xié)作開(kāi)發(fā)與結(jié)對(duì)編程的服務(wù),可以實(shí)Host-Guest模式的“手摸手”(滑稽)結(jié)對(duì)編程和群體編程。

          目前,新版IDEA開(kāi)箱即用地支持了Code With Me功能,同時(shí)它還具有音頻通話和視頻通話功能,可以滿足隨時(shí)隨地的溝通需求,這操作簡(jiǎn)直騷到爆。

          版本控制

          版本控制這一塊目前做了不少的更新,包括可以更快地完成PR的創(chuàng)建提交,支持PR模板。

          變更提交至代碼庫(kù)前的自定義代碼檢查配置。

          以及支持自定義Git提交模板等等。


          其他用戶體驗(yàn)提升

          IDEA內(nèi)置HTML網(wǎng)頁(yè)預(yù)覽

          以前在IDEA中預(yù)覽網(wǎng)頁(yè)得跳到外部瀏覽器,而現(xiàn)如今IDE的編輯器內(nèi)部就支持Built-in級(jí)別的網(wǎng)頁(yè)預(yù)覽,只需要在右上角點(diǎn)那個(gè)IDEA小圖標(biāo)即可激活,而且可以編輯網(wǎng)頁(yè)源碼時(shí)做到同步更新和預(yù)覽。

          Windows版本任務(wù)欄增強(qiáng)

          在Windows平臺(tái)的新版IDEA上,可直接在任務(wù)欄(或開(kāi)始菜單)上右鍵快捷呼出最近使用的項(xiàng)目。

          搜索時(shí)自定義外部依賴項(xiàng)

          講白了,就是使搜索范圍更易于自定義,我們可以直接在設(shè)置中進(jìn)行Scope定義,自行選擇External Dependencies的范圍是否包含。

          窗口拆分優(yōu)化

          當(dāng)你對(duì)編輯器里的多個(gè)文件進(jìn)行垂直窗口拆分時(shí),雙擊某個(gè)Tab就可以將當(dāng)前文件窗口最大化,再次雙擊Tab則會(huì)還原。


          當(dāng)然除了這些之外,新版IDEA還新增了很多更新和增強(qiáng),比如:對(duì)Kotlin、Scala、JavaScript等語(yǔ)言的開(kāi)發(fā)優(yōu)化、對(duì)常見(jiàn)框架與技術(shù)的優(yōu)化和支持、對(duì)Kubernetes和Docker的更新支持和改進(jìn)、數(shù)據(jù)庫(kù)工具的更新支持等等,由于時(shí)間有限,在此就不一一贅述了,有需要的可以按需細(xì)究。

          最后,讓我們一起大喊一句:“IDEA,yyds!”

          Java代碼的時(shí)候,經(jīng)常會(huì)涉及到重復(fù)性的操作,這個(gè)時(shí)候就會(huì)想要是有這樣一個(gè)插件就好了,如果是大家都會(huì)遇到的場(chǎng)景,IDE或許已經(jīng)提供了,再不然也有可能有人編寫了相關(guān)的插件。

          要是這個(gè)操作是你們的編碼環(huán)境特有的,那就只能自己寫工具了。所以這里來(lái)學(xué)學(xué)如何編寫IDEA插件,讓自己的編程環(huán)境更加強(qiáng)大,更好的進(jìn)行裝x。

          開(kāi)發(fā)環(huán)境

          開(kāi)發(fā)IDEA插件有以下這些依賴:

          • IntelliJ IDEA Community Edition
          • IntelliJ IDEA Community Edition 源碼
          • Plugin DevKit 插件
          • IntelliJ Platform SDK

          安裝IntelliJ IDEA Community Edition

          你可能已經(jīng)安裝了Ultimate版本,但是你還是需要安裝[IDEA][]的社區(qū)版本。因?yàn)樯虡I(yè)版是閉源的,所以在調(diào)試時(shí)無(wú)法調(diào)試核心代碼。

          下載IntelliJ IDEA Community Edition源碼

          社區(qū)版的安裝包里是不包含源碼的,所以我們需要手動(dòng)從github上clone一份:

          git clone --depth 1 git://git.jetbrains.org/idea/community.git idea

          關(guān)于從源碼運(yùn)行IDEA的方法參考 Check Out And Build Community Edition:

          http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

          添加IDEA jdk

          雖然不知道原因,但是根據(jù)Check Out And Build Community Edition:

          http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

          我們需要建立一個(gè) IDEA jdk來(lái)運(yùn)行插件:

          除非你在Mac上使用官方JDK,否則你需要手動(dòng)添加 /lib/tools.jar到classpath中。關(guān)注微信公眾號(hào):匠心零度,在后臺(tái)回復(fù):idea,可以獲取我整最新 IDEA 教程,都是干貨。

          配置IntelliJ Platform SDK

          打開(kāi) File|ProjectStructure新建一個(gè) IntelliJPlatformSDK:

          Java SDK選擇我們剛剛建立的 IDEA jdk:

          然后我們可以把下載的IDEA社區(qū)版源碼添加到源碼路徑中,這樣在調(diào)試時(shí),就可以調(diào)試IDEA自身的代碼了:

          第一個(gè)插件

          我們來(lái)編寫一個(gè)最簡(jiǎn)單的插件來(lái)學(xué)習(xí)編寫一個(gè)插件的完整步驟。

          新建工程

          選擇 IntellJPlatformPlugin,然后Project SDK指定剛剛新建的plugin sdk:

          新建的插件項(xiàng)目:

          插件根目錄下有兩個(gè)目錄 src和 resources。src是插件代碼目錄, resource是插件資源目錄,其中 META-INF/plugin.xml是插件的描述文件,就像Java web項(xiàng)目的 web.xml一樣。

          plugin.xml默認(rèn)的內(nèi)容如下:

          <idea-plugin>    <id>com.your.company.unique.plugin.id</id>    <name>Plugin display name here</name>    <version>1.0</version>    <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>    <description><!\[CDATA\[      Enter short description for your plugin here.<br>        <em>most HTML tags may be used</em>      \]\]></description>    <change-notes><!\[CDATA\[      Add change notes here.<br>        <em>most HTML tags may be used</em>      \]\]>  </change-notes>    <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description -->  <idea-version since-build="145.0"/>    <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/plugin\_compatibility.html       on how to target different products -->  <!\-\- uncomment to enable plugin in all products  <depends>com.intellij.modules.lang</depends>    -->  <extensions defaultExtensionNs="com.intellij">      <!\-\- Add your extensions here -->  </extensions>    <actions>      <!\-\- Add your actions here -->  </actions>  </idea-plugin>  

          新建一個(gè)Action

          插件擴(kuò)展IDEA最常見(jiàn)的方式就是在菜單欄或者工具欄中添加菜單項(xiàng),用戶通過(guò)點(diǎn)擊菜單項(xiàng)來(lái)觸發(fā)插件功能。IDEA提供了 AnAction類,這個(gè)類有一個(gè)虛方法 actionPerformed,這個(gè)方法會(huì)在每次菜單被點(diǎn)擊時(shí)調(diào)用。

          新建一個(gè)自定義的Action有兩個(gè)步驟:

          1、 繼承 AnAction類,在 actionPerformed方法中實(shí)現(xiàn)插件邏輯 2、 注冊(cè)action,有兩種方式,通過(guò)代碼注冊(cè)和通過(guò) plugin.xml注冊(cè)

          我們先寫一個(gè)簡(jiǎn)單的Action類:

          publicclass TextBoxes extends AnAction {      // 如果通過(guò)Java代碼來(lái)注冊(cè),這個(gè)構(gòu)造函數(shù)會(huì)被調(diào)用,傳給父類的字符串會(huì)被作為菜單項(xiàng)的名稱    // 如果你通過(guò)plugin.xml來(lái)注冊(cè),可以忽略這個(gè)構(gòu)造函數(shù)    public TextBoxes() {          // 設(shè)置菜單項(xiàng)名稱        super("Text _Boxes");          // 還可以設(shè)置菜單項(xiàng)名稱,描述,圖標(biāo)        // super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png"));    }      public void actionPerformed(AnActionEvent event) {          Project project = event.getData(PlatformDataKeys.PROJECT);          String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon());          Messages.showMessageDialog(project, "Hello, " \+ txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon());      }  }  

          然后我們?cè)?plugin.xml中注冊(cè)這個(gè)Action:

          <actions>    <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu">      <add-to-group group-id="MainMenu" anchor="last"  />         <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" />    </group>  </actions>  

          這里我們新建了一個(gè)菜單組,其中text字符串的下劃線表示這個(gè)字母作為快捷鍵。這個(gè)菜單顯示的效果如下:

          除了手動(dòng)新建Action,IDEA還提供了快速新建的方法,在代碼目錄上點(diǎn)擊新建,可以看到Action:

          可以在這個(gè)面板中填寫你要新建的Action信息,IDEA會(huì)幫你新建類,還有在plugin.xml中幫你注冊(cè):

          運(yùn)行插件

          運(yùn)行插件特別簡(jiǎn)單,和運(yùn)行普通Java代碼一樣,點(diǎn)擊運(yùn)行或者調(diào)試的按鈕,就會(huì)啟動(dòng)一個(gè)新的IDEA實(shí)例,這個(gè)實(shí)例中插件是生效的。

          點(diǎn)擊Text Boxes就可以看到插件的效果了。

          asyCode

          EasyCode是一款專為IntelliJ IDEA設(shè)計(jì)的代碼生成工具插件,旨在通過(guò)自動(dòng)化和模板化的方式,極大地提高Java開(kāi)發(fā)者的編碼效率和代碼質(zhì)量。這款插件深度融合于IDEA的開(kāi)發(fā)環(huán)境中,為開(kāi)發(fā)者帶來(lái)全新的開(kāi)發(fā)體驗(yàn),讓編程變得更加輕松愉快。

          功能特點(diǎn)

          1. 智能代碼生成
          2. EasyCode基于模板引擎的原理,能夠快速生成標(biāo)準(zhǔn)化的代碼片段,包括類、方法、注釋、測(cè)試等。通過(guò)簡(jiǎn)單的配置和選擇,開(kāi)發(fā)者可以在幾秒鐘內(nèi)完成繁瑣的代碼編寫工作,如實(shí)體類的屬性、Getter和Setter方法、數(shù)據(jù)庫(kù)操作代碼等。
          3. 它支持自定義代碼模板,開(kāi)發(fā)者可以根據(jù)項(xiàng)目需求和團(tuán)隊(duì)編碼規(guī)范,定制適合自己的代碼模板,以最佳實(shí)踐的方式生成代碼,減少因格式問(wèn)題而浪費(fèi)的時(shí)間。
          4. 智能代碼補(bǔ)全
          5. 在編程過(guò)程中,開(kāi)發(fā)者只需輸入少量的關(guān)鍵字或方法名,EasyCode便能自動(dòng)補(bǔ)全剩余部分,不僅減少了輸入的工作量,還降低了出現(xiàn)拼寫錯(cuò)誤或語(yǔ)法錯(cuò)誤的可能性,提高了代碼的可讀性和穩(wěn)定性。
          6. 豐富的模板庫(kù)
          7. EasyCode提供了豐富的代碼模板庫(kù),涵蓋了常見(jiàn)的代碼結(jié)構(gòu)和設(shè)計(jì)模式。開(kāi)發(fā)者可以根據(jù)項(xiàng)目需求,選擇合適的模板快速生成代碼,節(jié)省了大量的編碼時(shí)間。
          8. 高效便捷的操作
          9. 插件支持通過(guò)快捷鍵和上下文菜單快速生成代碼。開(kāi)發(fā)者可以自定義快捷鍵組合,或在編輯器中選中代碼片段后,通過(guò)右鍵菜單選擇EasyCode的相關(guān)選項(xiàng),快速生成對(duì)應(yīng)的代碼。
          10. 其他實(shí)用功能
          11. EasyCode還提供了快速生成文檔注釋、自動(dòng)導(dǎo)入所需的包和類、代碼格式化等實(shí)用功能,幫助開(kāi)發(fā)者更加專注于解決問(wèn)題和實(shí)現(xiàn)功能,而不必在瑣碎的代碼編寫上花費(fèi)過(guò)多的時(shí)間和精力。

          優(yōu)缺點(diǎn)

          優(yōu)點(diǎn)

          • 簡(jiǎn)單容易上手:EasyCode與IDEA完美結(jié)合,界面操作簡(jiǎn)潔明了,操作起來(lái)簡(jiǎn)單方便。
          • 配置少,修改少:幾乎不需要手寫配置,只需修改模板文件,即可輕松適應(yīng)項(xiàng)目需求,生成所需代碼。
          • 提高開(kāi)發(fā)效率:通過(guò)自動(dòng)生成重復(fù)性的代碼,減少了手動(dòng)編寫代碼的時(shí)間和精力,使開(kāi)發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
          • 保持代碼一致性:使用EasyCode生成的代碼遵循統(tǒng)一的標(biāo)準(zhǔn)和規(guī)范,提高了代碼的一致性和可讀性。

          缺點(diǎn)

          • 精細(xì)度不夠:EasyCode主要基于數(shù)據(jù)庫(kù)表的字段生成代碼,但在實(shí)際開(kāi)發(fā)中,某些字段可能需要更精細(xì)的處理,如狀態(tài)字段的多種狀態(tài)表示、關(guān)聯(lián)字段的關(guān)聯(lián)關(guān)系等。
          • 團(tuán)隊(duì)共享性差:在團(tuán)隊(duì)中,如果某個(gè)成員修改了模板,需要手動(dòng)導(dǎo)出并分享給其他成員導(dǎo)入,才能獲得最新的模板,這在一定程度上影響了模板的共享性和更新效率。

          綜上所述,EasyCode作為一款高效的IDEA插件,通過(guò)自動(dòng)化和模板化的方式,為Java開(kāi)發(fā)者帶來(lái)了極大的便利和效率提升。盡管存在一些缺點(diǎn),但在大多數(shù)情況下,它仍然是提高開(kāi)發(fā)效率、保持代碼一致性的有力工具。

          ?

          其實(shí)這么古老的插件大家應(yīng)該都知道,我就簡(jiǎn)單講述一下。并且逆向生成也有很多的方式,這篇文章主要是記錄下生成的模板配置信息,方便后續(xù)使用。

          image.png

          使用教程

          1.通過(guò)IDEA自帶的數(shù)據(jù)庫(kù)工具連接上數(shù)據(jù)庫(kù)

          image.png

          image.png

          2.配置EasyCode生成的模板

          *注:點(diǎn)擊上面的+是創(chuàng)建分組,輸入分組名創(chuàng)建后點(diǎn)擊里面的+是創(chuàng)建該分組的模板,后續(xù)生成的時(shí)候選擇其分組就行

          3.選擇數(shù)據(jù)表,鼠標(biāo)右鍵選擇EasyCode來(lái)生成模板

          image.png

          image.png

          *注:Package和Path選到要生成的模塊級(jí)就行了(模塊包名會(huì)根據(jù)模板自動(dòng)創(chuàng)建,不要自己去創(chuàng)),比如:xxx/src/main/java/com/xx/包名

          Mybatis-plus模板:

          • controller.java.vm
          ##定義初始變量
          #set($tableName = $tool.append($tableInfo.name, "Controller"))
          ##設(shè)置回調(diào)
          $!callback.setFileName($tool.append($tableName, ".java"))
          $!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
          ##拿到主鍵
          #if(!$tableInfo.pkColumn.isEmpty())
              #set($pk = $tableInfo.pkColumn.get(0))
          #end
          
          #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
          
          import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
          import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
          import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
          import $!{tableInfo.savePackageName}.common.R;
          import org.springframework.web.bind.annotation.*;
          
          import jakarta.annotation.Resource;
          import java.io.Serializable;
          import java.util.List;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})控制層
           *
           * @author ycc
           * @since $!time.currTime()
           */
          @RestController
          @RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
          public class $!{tableName} {
          
              /**
               * 服務(wù)對(duì)象
               */
              @Resource
              private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
          
              /**
               * 分頁(yè)查詢所有數(shù)據(jù)
               */
              @GetMapping
              public R page(@RequestParam int current,@RequestParam int size){
                  Page<$!{tableInfo.name}> page=new Page<>(current,size);
                  return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.page(page));}
          
          
              /**
               * 通過(guò)主鍵查詢單條數(shù)據(jù)
               */
              @GetMapping("{id}")
              public R selectOne(@PathVariable Serializable id){
                  return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.getById(id));}
              
              /**
               * 新增數(shù)據(jù)
               */
              @PostMapping
              public R save(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
                  return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.save($!tool.firstLowerCase($tableInfo.name)));}
              
              /**
               * 修改數(shù)據(jù)
               */
              @PutMapping
              public R updateById(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
                  return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.updateById($!tool.firstLowerCase($tableInfo.name)));}
              
              /**
               * 單條/批量刪除數(shù)據(jù)
               */
              @DeleteMapping
              public R delete(@RequestParam List<Long> id){
                  return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.removeByIds(id));
              }
          }
          
          • service.java.vm
          ##定義初始變量
          #set($tableName = $tool.append($tableInfo.name, "Service"))
          ##設(shè)置回調(diào)
          $!callback.setFileName($tool.append($tableName, ".java"))
          $!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))
          
          ##拿到主鍵
          #if(!$tableInfo.pkColumn.isEmpty())
              #set($pk = $tableInfo.pkColumn.get(0))
          #end
          
          #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
          
          import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
          import com.baomidou.mybatisplus.extension.service.IService;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})服務(wù)接口
           *
           * @author ycc
           * @since $!time.currTime()
           */
          public interface $!{tableName} extends IService<$!tableInfo.name> {}
          
          • serviceImpl.java.vm
          ##定義初始變量
          #set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
          ##設(shè)置回調(diào)
          $!callback.setFileName($tool.append($tableName, ".java"))
          $!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))
          
          ##拿到主鍵
          #if(!$tableInfo.pkColumn.isEmpty())
              #set($pk = $tableInfo.pkColumn.get(0))
          #end
          
          #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
          
          import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
          import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
          import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
          import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
          import org.springframework.stereotype.Service;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})服務(wù)實(shí)現(xiàn)類
           *
           * @author ycc
           * @since $!time.currTime()
           */
          @Service
          public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}> implements $!{tableInfo.name}Service {}
          
          • mapper.java.vm
          ##定義初始變量
          #set($tableName = $tool.append($tableInfo.name, "Mapper"))
          ##設(shè)置回調(diào)
          $!callback.setFileName($tool.append($tableName, ".java"))
          $!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper"))
          
          ##拿到主鍵
          #if(!$tableInfo.pkColumn.isEmpty())
              #set($pk = $tableInfo.pkColumn.get(0))
          #end
          
          #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper;
          
          import com.baomidou.mybatisplus.core.mapper.BaseMapper;
          import $!{tableInfo.savePackageName}.domain.$!tableInfo.name;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})數(shù)據(jù)庫(kù)訪問(wèn)層
           *
           * @author ycc
           * @since $!time.currTime()
           */
           @Mapper
          public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {}
          
          • mapper.xml.vm
          ##引入mybatis支持
          $!{mybatisSupport.vm}
          
          ##設(shè)置保存名稱與保存位置
          $!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
          $!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
          
          ##拿到主鍵
          #if(!$tableInfo.pkColumn.isEmpty())
              #set($pk = $tableInfo.pkColumn.get(0))
          #end
          
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
          
              <resultMap type="$!{tableInfo.savePackageName}.domain.vo.$!{tableInfo.name}VO" id="$!{tableInfo.name}VOMap">
          #foreach($column in $tableInfo.fullColumn)
                  <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
          #end
              </resultMap>
              
          </mapper>
          
          • domain.java.vm
          ##引入宏定義
          $!{define.vm}
          
          ##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
          #save("/domain", ".java")
          
          ##使用宏定義設(shè)置包后綴
          #setPackageSuffix("domain")
          
          ##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
          import com.baomidou.mybatisplus.annotation.*;
          import lombok.AllArgsConstructor;
          import lombok.Data;
          import lombok.NoArgsConstructor;
          
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.comment})表
           *
           * @author ycc
           * @since $!time.currTime()
           */
          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          public class $!{tableInfo.name}{
          private static final long serialVersionUID= 1L;
          #foreach($column in $tableInfo.pkColumn)
              #if(${column.comment})/**
               * ${column.comment}
               */#end
          
              @TableId(value = "$!{column.obj.name}" , type = IdType.NONE)
              private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
          #end
          #foreach($column in $tableInfo.otherColumn)
          
              #if(${column.comment})
          /**
               * ${column.comment}
               */
              #end
          @TableField(value = "$!{column.obj.name}")
              private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
          #end
          }
          
          • dto.java.vm
          ##引入宏定義
          $!{define.vm}
          
          ##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
          #save("/domain/dto", "DTO.java")
          
          ##使用宏定義設(shè)置包后綴
          #setPackageSuffix("domain.dto")
          
          import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
          
          ##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
          import lombok.AllArgsConstructor;
          import lombok.Data;
          import lombok.NoArgsConstructor;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})DTO
           *
           * @author ycc
           * @since $!time.currTime()
           */
          ##使用宏定義實(shí)現(xiàn)類注釋信息
          @Data
          @NoArgsConstructor
          public class $!{tableInfo.name}DTO extends $!{tableInfo.name}{
              
          }
          
          • vo.java.vm
          ##引入宏定義
          $!{define.vm}
          
          ##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
          #save("/domain/vo", "VO.java")
          
          ##使用宏定義設(shè)置包后綴
          #setPackageSuffix("domain.vo")
          
          import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
          
          ##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
          import lombok.AllArgsConstructor;
          import lombok.Data;
          import lombok.NoArgsConstructor;
          
          /**
           * $!{tableInfo.comment}($!{tableInfo.name})VO
           *
           * @author ycc
           * @since $!time.currTime()
           */
          ##使用宏定義實(shí)現(xiàn)類注釋信息
          @Data
          @NoArgsConstructor
          public class $!{tableInfo.name}VO extends $!{tableInfo.name}{
              
          }
          

          VO/DTO/DOMAIN區(qū)別

          VO(View Object)、DTO(Data Transfer Object)和DOMAIN(領(lǐng)域模型)是三種常見(jiàn)的用于數(shù)據(jù)傳遞和處理的類型,它們各自在不同的場(chǎng)景下發(fā)揮著重要作用。下面分別解釋它們的區(qū)別和使用場(chǎng)景。

          1. VO(View Object)

          定義:VO通常用于表示視圖層(如JSP、HTML頁(yè)面等)與控制器(Controller)之間的數(shù)據(jù)傳輸對(duì)象。它封裝了需要展示給用戶的數(shù)據(jù),但不包含業(yè)務(wù)邏輯。

          使用場(chǎng)景

          • 當(dāng)需要將數(shù)據(jù)庫(kù)中的某些數(shù)據(jù)展示到頁(yè)面上時(shí),可以使用VO來(lái)封裝這些數(shù)據(jù)。
          • VO可以包含多個(gè)領(lǐng)域模型(Domain)的屬性,用于滿足特定視圖的展示需求。
          • 便于前端直接處理,減少數(shù)據(jù)轉(zhuǎn)換的復(fù)雜度。

          2. DTO(Data Transfer Object)

          定義:DTO是一種設(shè)計(jì)模式,用于在系統(tǒng)不同層(如表現(xiàn)層與業(yè)務(wù)層之間,或微服務(wù)之間的遠(yuǎn)程調(diào)用)之間傳輸數(shù)據(jù)。DTO主要用于封裝跨層或跨系統(tǒng)邊界傳輸?shù)臄?shù)據(jù)。

          使用場(chǎng)景

          • 在微服務(wù)架構(gòu)中,服務(wù)間的通信通常使用DTO來(lái)傳遞數(shù)據(jù)。
          • 當(dāng)需要在網(wǎng)絡(luò)間傳輸數(shù)據(jù)時(shí)(如REST API的返回?cái)?shù)據(jù)),DTO可以有效地封裝需要傳輸?shù)臄?shù)據(jù)。
          • DTO可以只包含需要的字段,減少數(shù)據(jù)傳輸?shù)娜哂啵岣咝阅堋?/span>
          • 在分層架構(gòu)中,DTO可以隔離層與層之間的數(shù)據(jù)依賴,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。

          3. DOMAIN(領(lǐng)域模型)

          定義:DOMAIN是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design, DDD)中的一個(gè)核心概念,表示業(yè)務(wù)領(lǐng)域內(nèi)的一組具有業(yè)務(wù)含義和規(guī)則的類及它們之間的關(guān)系。Domain類通常包含業(yè)務(wù)邏輯和狀態(tài)信息。

          使用場(chǎng)景

          • Domain模型是業(yè)務(wù)邏輯的核心,它封裝了業(yè)務(wù)領(lǐng)域的知識(shí)和規(guī)則。
          • 在復(fù)雜的業(yè)務(wù)系統(tǒng)中,Domain模型幫助開(kāi)發(fā)者理解和實(shí)現(xiàn)業(yè)務(wù)邏輯。
          • Domain模型可以直接與數(shù)據(jù)庫(kù)表映射(通過(guò)ORM工具),但更重要的是,它代表了業(yè)務(wù)邏輯和數(shù)據(jù)行為的抽象。
          • 相比DTO和VO,Domain模型更加側(cè)重于業(yè)務(wù)邏輯的實(shí)現(xiàn)和表達(dá)。

          總結(jié)

          • VO 專注于視圖展示,封裝展示層需要的數(shù)據(jù)。
          • DTO 專注于數(shù)據(jù)的跨層或跨系統(tǒng)傳輸,減少數(shù)據(jù)冗余,提高傳輸效率。
          • DOMAIN 專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),封裝業(yè)務(wù)領(lǐng)域的知識(shí)和規(guī)則。

          在實(shí)際項(xiàng)目中,應(yīng)根據(jù)具體需求和場(chǎng)景來(lái)選擇合適的類型,以達(dá)到最佳的開(kāi)發(fā)效率和系統(tǒng)性能。

          結(jié)語(yǔ)

          ?

          "非常感謝您一直觀看到現(xiàn)在,這些看似基礎(chǔ)的內(nèi)容,實(shí)則構(gòu)建了我們知識(shí)的基石。我驚喜地發(fā)現(xiàn),將這些基礎(chǔ)知識(shí)系統(tǒng)地記錄下來(lái),不僅是對(duì)自我學(xué)習(xí)的一種鞏固,也是一件非常有意義且值得分享的事情。您也完全可以這樣做,讓我們一起在基礎(chǔ)中深耕,發(fā)現(xiàn)更多可能。"


          原文:https://juejin.cn/post/7392513123860365339

          作者:世界哪有真情

          #記錄我的2024#


          主站蜘蛛池模板: 手机看片一区二区| 国产亚洲综合精品一区二区三区 | 女同一区二区在线观看| 内射白浆一区二区在线观看| 美女啪啪一区二区三区| 精品理论片一区二区三区| 久久4k岛国高清一区二区| 亚洲福利视频一区二区| 波多野结衣一区二区三区高清av| 精品无人区一区二区三区| 国产无码一区二区在线| 国产精品亚洲专一区二区三区| 亚洲一区精品视频在线| 亚洲A∨无码一区二区三区| 中文字幕一区在线| 国产天堂一区二区综合| 午夜无码视频一区二区三区| 国产精品成人一区二区三区| 精品国产一区二区三区av片| 波多野结衣一区视频在线| 亚洲国产日韩在线一区| 精品国产一区二区三区四区| 91秒拍国产福利一区| 高清国产AV一区二区三区| 国产AV午夜精品一区二区三区| 久久精品国产一区| 日本在线一区二区| 久久久精品人妻一区亚美研究所| 国产AV午夜精品一区二区三| 久久久久人妻一区精品果冻| 一区二区三区AV高清免费波多| 国产大秀视频一区二区三区| 国产精品一区二区综合| 国产激情一区二区三区在线观看| 国产婷婷色一区二区三区深爱网| 精品乱人伦一区二区| 国产福利电影一区二区三区,日韩伦理电影在线福 | 国产伦一区二区三区高清| 成人无码一区二区三区| 亚洲AV日韩精品一区二区三区| 欧洲精品码一区二区三区|