<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>

          IDEA + Groovy 腳本一鍵生成實體類,用法舒服,高效!

          共 6678字,需瀏覽 14分鐘

           ·

          2021-10-30 11:05

          來自:CSDN,作者:悲涼的秋風

          鏈接:https://blog.csdn.net/qq_34371461/article/details/80571281


          idea 功能很強大,以前不知道有這樣的提升工作效率的方法,雖然有的工具確實可以直接生成實體類,mapper文件,還有dao接口,但是個人覺得涉及到復雜業(yè)務還是只生成實體類比較好,后面部分就自己搞定就可以了。

          一、連接數(shù)據(jù)庫

          打開項目:
          1、點擊右側的datesource圖標,要是沒有該圖標,請去自行百度
          2、點擊 + 號
          3、選擇 datasource
          4、選擇 mysql
          1、填寫一個連接名,隨便填什么都行
          2、不用選擇,默認就行
          3、填寫數(shù)據(jù)庫連接的 IP地址,比如本地數(shù)據(jù)庫可以填寫:localhost或者127.0.0.1
          4、填寫數(shù)據(jù)庫開放的端口號,一般沒設置的話默認都是3306
          5、填寫你需要連接的數(shù)據(jù)庫名
          6、填寫數(shù)據(jù)庫的用戶名
          7、填寫數(shù)據(jù)庫密碼
          8、這里會有一個驅動需要點擊下載,圖中是已經(jīng)下載好了
          9、填寫自己的數(shù)據(jù)庫連接url,然后可以點擊9所在按鈕進行測試連接,本地連接失敗檢查是否開啟了mysql服務
          連接好了如上圖所示,可以看到自己的數(shù)據(jù)庫和表,選擇一個表右鍵,網(wǎng)上教程一般到這里結束,都是選擇說Generate POJOs.groovy,然后在彈出窗口選擇需要生成的文件夾所在即可。
          我選擇一張表進行生成示例如下:
          表明去除了“_”然后以駝峰方式生成了類名,而且開始的package 路徑也不對,重點是沒有注釋,沒有注釋,沒有注釋!
          網(wǎng)上搜了一些方法,都不太行,要不就是到處報錯,沒轍只能自己瞎琢磨。沒想到最后也不難,下面就是實現(xiàn):
          右鍵選擇表,在選擇Generate POJOs.groovy 的下面那一項:
          進來只有Generate POJOs.groovy,右鍵新建另外一個比如我的叫做:
          Generate MyPOJOs.groovy,里面內(nèi)容如下:
          import?com.intellij.database.model.DasTable
          import?com.intellij.database.model.ObjectKind
          import?com.intellij.database.util.Case
          import?com.intellij.database.util.DasUtil
          import?java.io.*
          import?java.text.SimpleDateFormat
          ?
          /*
          ?*?Available?context?bindings:
          ?*???SELECTION???Iterable
          ?*???PROJECT?????project
          ?*???FILES???????files?helper
          ?*/

          packageName?=?""
          typeMapping?=?[
          ????????(~/(?i)tinyint|smallint|mediumint/)??????:?"Integer",
          ????????(~/(?i)int/)?????????????????????????????:?"Long",
          ????????(~/(?i)bool|bit/)????????????????????????:?"Boolean",
          ????????(~/(?i)float|double|decimal|real/)???????:?"Double",
          ????????(~/(?i)datetime|timestamp|date|time/)????:?"Date",
          ????????(~/(?i)blob|binary|bfile|clob|raw|image/):?"InputStream",
          ????????(~/(?i)/)????????????????????????????????:?"String"
          ]
          ?
          ?
          FILES.chooseDirectoryAndSave("Choose?directory",?"Choose?where?to?store?generated?files")?{?dir?->
          ????SELECTION.filter?{?it?instanceof?DasTable?&&?it.getKind()?==?ObjectKind.TABLE?}.each?{?generate(it,?dir)?}
          }
          ?
          def?generate(table,?dir)?{
          ????def?className?=?javaClassName(table.getName(),?true)
          ????def?fields?=?calcFields(table)
          ????packageName?=?getPackageName(dir)
          ????PrintWriter?printWriter?=?new?PrintWriter(new?OutputStreamWriter(new?FileOutputStream(new?File(dir,?className?+?".java")),?"UTF-8"))
          ????printWriter.withPrintWriter?{out?->?generate(out,?className,?fields,table)}
          ?
          //????new?File(dir,?className?+?".java").withPrintWriter?{?out?->?generate(out,?className,?fields,table)?}
          }
          ?
          //?獲取包所在文件夾路徑
          def?getPackageName(dir)?{
          ????return?dir.toString().replaceAll("\\\\",?".").replaceAll("/",?".").replaceAll("^.*src(\\.main\\.java\\.)?",?"")?+?";"
          }
          ?
          def?generate(out,?className,?fields,table)?{
          ????out.println?"package?$packageName"
          ????out.println?""
          ????out.println?"import?javax.persistence.Column;"
          ????out.println?"import?javax.persistence.Entity;"
          ????out.println?"import?javax.persistence.Table;"
          ????out.println?"import?java.io.Serializable;"
          ????out.println?"import?lombok.Getter;"
          ????out.println?"import?lombok.Setter;"
          ????out.println?"import?lombok.ToString;"
          ????Set?types?=?new?HashSet()
          ?
          ????fields.each()?{
          ????????types.add(it.type)
          ????}
          ?
          ????if?(types.contains("Date"))?{
          ????????out.println?"import?java.util.Date;"
          ????}
          ?
          ????if?(types.contains("InputStream"))?{
          ????????out.println?"import?java.io.InputStream;"
          ????}
          ????out.println?""
          ????out.println?"/**\n"?+
          ????????????"?*?@Description??\n"?+
          ????????????"?*?@Author??Hunter\n"?+
          ????????????"?*?@Date?"+?new?SimpleDateFormat("yyyy-MM-dd").format(new?Date())?+?"?\n"?+
          ????????????"?*/"
          ????out.println?""
          ????out.println?"@Setter"
          ????out.println?"@Getter"
          ????out.println?"@ToString"
          ????out.println?"@Entity"
          ????out.println?"@Table?(?name?=\""+table.getName()?+"\"?)"
          ????out.println?"public?class?$className??implements?Serializable?{"
          ????out.println?""
          ????out.println?genSerialID()
          ????fields.each()?
          {
          ????????out.println?""
          ????????//?輸出注釋
          ????????if?(isNotEmpty(it.commoent))?{
          ????????????out.println?"\t/**"
          ????????????out.println?"\t?*?${it.commoent.toString()}"
          ????????????out.println?"\t?*/"
          ????????}
          ?
          ????????if?(it.annos?!=?"")?out.println?"???${it.annos.replace("[@Id]",?"")}"
          ?
          ????????//?輸出成員變量
          ????????out.println?"\tprivate?${it.type}?${it.name};"
          ????}
          ?
          ????//?輸出get/set方法
          //????fields.each()?{
          //????????out.println?""
          //????????out.println?"\tpublic?${it.type}?get${it.name.capitalize()}()?{"
          //????????out.println?"\t\treturn?this.${it.name};"
          //????????out.println?"\t}"
          //????????out.println?""
          //
          //????????out.println?"\tpublic?void?set${it.name.capitalize()}(${it.type}?${it.name})?{"
          //????????out.println?"\t\tthis.${it.name}?=?${it.name};"
          //????????out.println?"\t}"
          //????}
          ????out.println?""
          ????out.println?"}"
          }
          ?
          def?calcFields(table)?{
          ????DasUtil.getColumns(table).reduce([])?{?fields,?col?->
          ????????def?spec?=?Case.LOWER.apply(col.getDataType().getSpecification())
          ?
          ????????def?typeStr?=?typeMapping.find?{?p,?t?->?p.matcher(spec).find()?}.value
          ????????def?comm?=[
          ????????????????colName?:?col.getName(),
          ????????????????name?:??javaName(col.getName(),?false),
          ????????????????type?:?typeStr,
          ????????????????commoent:?col.getComment(),
          ????????????????annos:?"\t@Column(name?=?\""+col.getName()+"\"?)"]
          ????????if("id".equals(Case.LOWER.apply(col.getName())))
          ????????????comm.annos?+=["@Id"]
          ????????fields?+=?[comm]
          ????}
          }
          ?
          //?處理類名(這里是因為我的表都是以t_命名的,所以需要處理去掉生成類名時的開頭的T,
          //?如果你不需要那么請查找用到了?javaClassName這個方法的地方修改為?javaName?即可)
          def?javaClassName(str,?capitalize)?{
          ????def?s?=?com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
          ????????????.collect?{?Case.LOWER.apply(it).capitalize()?}
          ????????????.join("")
          ????????????.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/,?"_")
          ????//?去除開頭的T??http://developer.51cto.com/art/200906/129168.htm
          ????s?=?s[1..s.size()?-?1]
          ????capitalize?||?s.length()?==?1??s?:?Case.LOWER.apply(s[0])?+?s[1..-1]
          }
          ?
          def?javaName(str,?capitalize)?{
          //????def?s?=?str.split(/(?<=[^\p{IsLetter}])/).collect?{?Case.LOWER.apply(it).capitalize()?}
          //????????????.join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/,?"_")
          //????capitalize?||?s.length()?==?1??s?:?Case.LOWER.apply(s[0])?+?s[1..-1]
          ????def?s?=?com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
          ????????????.collect?{?Case.LOWER.apply(it).capitalize()?}
          ????????????.join("")
          ????????????.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/,?"_")
          ????capitalize?||?s.length()?==?1??s?:?Case.LOWER.apply(s[0])?+?s[1..-1]
          }
          ?
          def?isNotEmpty(content)?{
          ????return?content?!=?null?&&?content.toString().trim().length()?>?0
          }
          ?
          static?String?changeStyle(String?str,?boolean?toCamel){
          ????if(!str?||?str.size()?<=?1)
          ????????return?str
          ?
          ????if(toCamel)
          {
          ????????String?r?=?str.toLowerCase().split('_').collect{cc?->?Case.LOWER.apply(cc).capitalize()}.join('')
          ????????return?r[0].toLowerCase()?+?r[1..-1]
          ????}else{
          ????????str?=?str[0].toLowerCase()?+?str[1..-1]
          ????????return?str.collect{cc?->?((char)cc).isUpperCase()???'_'?+?cc.toLowerCase()?:?cc}.join('')
          ????}
          }
          ?
          static?String?genSerialID()
          {
          ????return?"\tprivate?static?final?long?serialVersionUID?=??"+Math.abs(new?Random().nextLong())+"L;"
          }
          完成后,點擊此處,選擇project 切換回來:
          這時,我們再次選擇表,右鍵,選擇我們自己新建的 groovy,然后選擇生成存放的文件夾路徑,生成:
          可以看到,生成的類名,package路徑,以及已經(jīng)實現(xiàn)了序列化,也加上了注解,指明了每個屬性對應的表字段,如果@Table和@Column沒有引入包,還請在maven中添加相關依賴:

          ????javax.persistence
          ????persistence-api
          ????1.0.2

          關于 groovy ,個人也是懂得不多,很多東西都是照葫蘆畫瓢,歡迎各位拍磚共同交流,要是本文對你有所幫助,歡迎點贊支持一下,謝謝~~~

          逆鋒起筆是一個專注于程序員圈子的技術平臺,你可以收獲最新技術動態(tài)最新內(nèi)測資格BAT等大廠的經(jīng)驗精品學習資料職業(yè)路線副業(yè)思維,微信搜索逆鋒起筆關注!

          30 款 IDEA 寶貝插件

          IDEA 中的熱部署神器!

          IntelliJ IDEA 2021.2 正式發(fā)布

          IntelliJ IDEA 超級牛逼插件推薦

          10 個動圖, 你會喜歡上 idea 的自動補全!

          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产多毛视频 | 不卡高清中文字幕 | 一级日皮视频 | 久久一卡二卡 | av天天看 |