zoukankan      html  css  js  c++  java
  • Intellij IDEA 通过数据库表生成带注解的实体类详细步骤

    前言:idea 功能很强大,以前不知道有这样的提升工作效率的方法,虽然有的工具确实可以直接生成实体类,mapper文件,还有dao接口,但是个人觉得涉及到复杂业务还是只生成实体类比较好,后面部分就自己搞定就可以了。

    一、连接数据库

    打开项目:

    1、点击右侧的datesource图标,要是没有该图标,请去自行百度

    2、点击 + 号

    3、选择 datasource

    4、选择 mysql

     

    1、填写一个连接名,随便填什么都行

    2、不用选择,默认就行

    3、填写数据库连接的 IP地址,比如本地数据库可以填写:localhost或者127.0.0.1

    4、填写数据库开放的端口号,一般没设置的话默认都是3306

    5、填写你需要连接的数据库名

    6、填写数据库的用户名

    7、填写数据库密码

    8、这里会有一个驱动需要点击下载,图中是已经下载好了

    9、填写自己的数据库连接url,然后可以点击9所在按钮进行测试连接,本地连接失败检查是否开启了mysql服务

     连接好了如上图所示,可以看到自己的数据库和表,选择一个表右键,网上教程一般到这里结束,都是选择说Generate POJOs.groovy,然后在弹出窗口选择需要生成的文件夹所在即可。

    我选择一张表进行生成示例如下:

     

    表明去除了“_”然后以驼峰方式生成了类名,而且开始的package 路径也不对,重点是没有注释,没有注释,没有注释!

    网上搜了一些方法,都不太行,要不就是到处报错,没辙只能自己瞎琢磨。没想到最后也不难,下面就是实现:

    右键选择表,在选择Generate POJOs.groovy 的下面那一项:

     进来只有Generate POJOs.groovy,右键新建另外一个比如我的叫做:Generate MyPOJOs.groovy,里面内容如下:

    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<DasObject>
     *   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 = javaName(table.getName(), true)+"Entity"
      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 "/**
    " +
              " * @Description  
    " +
              " * @Author  zouhui
    " +
              " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 
    " +
              " */"
      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 "	/**"
          out.println "	 * ${it.commoent.toString()}"
          out.println "	 */"
        }
    
        if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"
    
        // 输出成员变量
        out.println "	private ${it.type} ${it.name};"
      }
    
      // 输出get/set方法
    //    fields.each() {
    //        out.println ""
    //        out.println "	public ${it.type} get${it.name.capitalize()}() {"
    //        out.println "		return this.${it.name};"
    //        out.println "	}"
    //        out.println ""
    //
    //        out.println "	public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
    //        out.println "		this.${it.name} = ${it.name};"
    //        out.println "	}"
    //    }
      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: "	@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 "	private static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"
    }
    

    完成后,点击此处,选择project 切换回来:

     这时,我们再次选择表,右键,选择我们自己新建的 groovy,然后选择生成存放的文件夹路径,生成:

    可以看到,生成的类名,package路径,以及已经实现了序列化,也加上了注解,指明了每个属性对应的表字段,如果@Table和@Column没有引入包,还请在maven中添加相关依赖:

    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0.2</version>
    </dependency>

    原文链接:https://blog.csdn.net/qq_34371461/java/article/details/80571281

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/jichuang/p/12582066.html
Copyright © 2011-2022 走看看