日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Intellij IDEA 通過數(shù)據(jù)庫表生成帶注解的實體類詳細(xì)步驟

 hongjing_z 2019-02-12

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

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

打開項目:

1、點擊右側(cè)的datesource圖標(biāo),要是沒有該圖標(biāo),請去自行百度

2、點擊 + 號

3、選擇 datasource

4、選擇 mysql

1、填寫一個連接名,隨便填什么都行

2、不用選擇,默認(rèn)就行

3、填寫數(shù)據(jù)庫連接的 IP地址,比如本地數(shù)據(jù)庫可以填寫:localhost或者127.0.0.1

4、填寫數(shù)據(jù)庫開放的端口號,一般沒設(shè)置的話默認(rèn)都是3306

5、填寫你需要連接的數(shù)據(jù)庫名

6、填寫數(shù)據(jù)庫的用戶名

7、填寫數(shù)據(jù)庫密碼

8、這里會有一個驅(qū)動需要點擊下載,圖中是已經(jīng)下載好了

9、填寫自己的數(shù)據(jù)庫連接url,然后可以點擊9所在按鈕進(jìn)行測試連接,本地連接失敗檢查是否開啟了mysql服務(wù)

 

連接好了如上圖所示,可以看到自己的數(shù)據(jù)庫和表,選擇一個表右鍵,網(wǎng)上教程一般到這里結(jié)束,都是選擇說Generate POJOs.groovy,然后在彈出窗口選擇需要生成的文件夾所在即可。

我選擇一張表進(jìn)行生成示例如下:

表明去除了“_”然后以駝峰方式生成了類名,而且開始的package 路徑也不對,重點是沒有注釋,沒有注釋,沒有注釋!

網(wǎng)上搜了一些方法,都不太行,要不就是到處報錯,沒轍只能自己瞎琢磨。沒想到最后也不難,下面就是實現(xiàn):

右鍵選擇表,在選擇Generate POJOs.groovy 的下面那一項:

進(jìn)來只有Generate POJOs.groovy,右鍵新建另外一個比如我的叫做:Generate MyPOJOs.groovy,里面內(nèi)容如下:

  1. import com.intellij.database.model.DasTable  
  2. import com.intellij.database.model.ObjectKind  
  3. import com.intellij.database.util.Case  
  4. import com.intellij.database.util.DasUtil  
  5. import java.io.*  
  6. import java.text.SimpleDateFormat  
  7.   
  8. /* 
  9.  * Available context bindings: 
  10.  *   SELECTION   Iterable<DasObject> 
  11.  *   PROJECT     project 
  12.  *   FILES       files helper 
  13.  */  
  14. packageName = ""  
  15. typeMapping = [  
  16.         (~/(?i)tinyint|smallint|mediumint/)      : "Integer",  
  17.         (~/(?i)int/)                             : "Long",  
  18.         (~/(?i)bool|bit/)                        : "Boolean",  
  19.         (~/(?i)float|double|decimal|real/)       : "Double",  
  20.         (~/(?i)datetime|timestamp|date|time/)    : "Date",  
  21.         (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",  
  22.         (~/(?i)/)                                : "String"  
  23. ]  
  24.   
  25.   
  26. FILES.chooseDirectoryAndSave("Choose directory""Choose where to store generated files") { dir ->  
  27.     SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }  
  28. }  
  29.   
  30. def generate(table, dir) {  
  31. //    def className = javaClassName(table.getName(), true)  
  32.     def className = javaName(table.getName(), true)  
  33.     def fields = calcFields(table)  
  34.     packageName = getPackageName(dir)  
  35.     PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))  
  36.     printWriter.withPrintWriter {out -> generate(out, className, fields,table)}  
  37.   
  38. //    new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields,table) }  
  39. }  
  40.   
  41. // 獲取包所在文件夾路徑  
  42. def getPackageName(dir) {  
  43.     return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";" 
  44. } 
  45.  
  46. def generate(out, className, fields,table) { 
  47.     out.println "package $packageName" 
  48.     out.println "" 
  49.     out.println "import javax.persistence.Column;" 
  50.     out.println "import javax.persistence.Entity;" 
  51.     out.println "import javax.persistence.Table;" 
  52.     out.println "import java.io.Serializable;" 
  53. //    out.println "import lombok.Getter;" 
  54. //    out.println "import lombok.Setter;" 
  55. //    out.println "import lombok.ToString;" 
  56.     Set types = new HashSet() 
  57.  
  58.     fields.each() { 
  59.  
  60.         types.add(it.type) 
  61.     } 
  62.  
  63.     if (types.contains("Date")) { 
  64.         out.println "import java.util.Date;" 
  65.     } 
  66.  
  67.     if (types.contains("InputStream")) { 
  68.         out.println "import java.io.InputStream;" 
  69.     } 
  70.     out.println "" 
  71.     out.println "/**\n" + 
  72.             " * @Description  \n" + 
  73.             " * @Author  zhj\n" + 
  74.             " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" + 
  75.             " */" 
  76.     out.println "" 
  77. //    out.println "@Setter" 
  78. //    out.println "@Getter" 
  79. //    out.println "@ToString" 
  80.     out.println "@Entity" 
  81.     out.println "@Table ( name =\""+table.getName() +"\" )"  
  82.     out.println "public class $className  implements Serializable {"  
  83.     out.println ""  
  84.     out.println genSerialID()  
  85.     fields.each() {  
  86.         out.println ""  
  87.         // 輸出注釋  
  88.         if (isNotEmpty(it.commoent)) {  
  89.             out.println "\t/**"  
  90.             out.println "\t * ${it.commoent.toString()}"  
  91.             out.println "\t */"  
  92.         }  
  93.   
  94.         if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"  
  95.   
  96.         // 輸出成員變量  
  97.         out.println "\tprivate ${it.type} ${it.name};"  
  98.     }  
  99.   
  100.     // 輸出get/set方法  
  101.     fields.each() {  
  102.         out.println ""  
  103.         out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"  
  104.         out.println "\t\treturn this.${it.name};"  
  105.         out.println "\t}"  
  106.         out.println ""  
  107.   
  108.         out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"  
  109.         out.println "\t\tthis.${it.name} = ${it.name};"  
  110.         out.println "\t}"  
  111.     }  
  112.     out.println ""  
  113.     out.println "}"  
  114. }  
  115.   
  116. def calcFields(table) {  
  117.     DasUtil.getColumns(table).reduce([]) { fields, col ->  
  118.         def spec = Case.LOWER.apply(col.getDataType().getSpecification())  
  119.   
  120.         def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value  
  121.         def comm =[  
  122.                 colName : col.getName(),  
  123.                 name :  javaName(col.getName(), false),  
  124.                 type : typeStr,  
  125.                 commoent: col.getComment(),  
  126.                 annos: "\t@Column(name = \""+col.getName()+"\" )"]  
  127.         if("id".equals(Case.LOWER.apply(col.getName())))  
  128.             comm.annos +=["@Id"]  
  129.         fields += [comm]  
  130.     }  
  131. }  
  132.   
  133. // 處理類名(這里是因為我的表都是以t_命名的,所以需要處理去掉生成類名時的開頭的T,  
  134. // 如果你不需要那么請查找用到了 javaClassName這個方法的地方修改為 javaName 即可)  
  135. def javaClassName(str, capitalize) {  
  136.     def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)  
  137.             .collect { Case.LOWER.apply(it).capitalize() }  
  138.             .join("")  
  139.             .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")  
  140.     // 去除開頭的T  http://developer.51cto.com/art/200906/129168.htm  
  141.     s = s[1..s.size() - 1]  
  142.     capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]  
  143. }  
  144.   
  145. def javaName(str, capitalize) {  
  146. //    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }  
  147. //            .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")  
  148. //    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]  
  149.     def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)  
  150.             .collect { Case.LOWER.apply(it).capitalize() }  
  151.             .join("")  
  152.             .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")  
  153.     capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]  
  154. }  
  155.   
  156. def isNotEmpty(content) {  
  157.     return content != null && content.toString().trim().length() > 0  
  158. }  
  159.   
  160. static String changeStyle(String str, boolean toCamel){  
  161.     if(!str || str.size() <= 1)  
  162.         return str  
  163.   
  164.     if(toCamel){  
  165.         String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')  
  166.         return r[0].toLowerCase() + r[1..-1]  
  167.     }else{  
  168.         str = str[0].toLowerCase() + str[1..-1]  
  169.         return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')  
  170.     }  
  171. }  
  172.   
  173. static String genSerialID()  
  174. {  
  175.     return "\tprivate static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"  
  176. }  

完成后,點擊此處,選擇project 切換回來:

這時,我們再次選擇表,右鍵,選擇我們自己新建的 groovy,然后選擇生成存放的文件夾路徑,生成:

可以看到,生成的類名,package路徑,以及已經(jīng)實現(xiàn)了序列化,也加上了注解,指明了每個屬性對應(yīng)的表字段,如果@Table和@Column沒有引入包,還請在maven中添加相關(guān)依賴:

  1. <dependency>
  2. <groupId>javax.persistence</groupId>
  3. <artifactId>persistence-api</artifactId>
  4. <version>1.0.2</version>
  5. </dependency>

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多