根据数据库代码自动生成的插件挺多的,这里主要分享两种:

1.根据database以及脚本代码自动生成

2.根据mybatis-generator-core自动生成(下一章节进行分享,包含sqlserver的注释获取)

这篇主要介绍的是database以及groovy脚本代码自动生成,可以自定义去除数据库表的前缀生成相应的类名,支持获取表的备注,字段备注,主键获取。

database以及脚本代码自动生成相对于mybatis-generator-core自动生成,其优点是不需要将生成的文件的代码嵌入到项目中,而是相当于IDEA的脚本插件使用,但是不好同时生成DO,DAO,SqlMapper文件,因为同时生成的话,反而使用mybatis-generator-core更加方便。

注:使用database以及脚本代码自动生成的时候得先生成DO文件,再DAO文件,最后生成SqlMapper文件,具体原因将在流程里面做介绍

废话不多,直接进入操作过程:

1.配置Database,链接数据库

这一步网上教程很多,也相对简单,这里不做详细介绍了,先选择数据源,这里使用MySql做介绍

接下来就是配置链接信息,需要填写的如下图,点击测试通过之后直接APPLY,OK即可

2.接下来创建脚本文件

跳转到脚本目录下新建三个文件,分别为生成DO,DAO,SQLMAPPER文件,代码如下:

Generate ModePOJOs.groovy

  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. * @Description 生成DO文件
  10. * @zsy
  11. * @Date 2020-07-13
  12. */
  13. packageName = ""
  14. tableComment = ""
  15. typeMapping = [
  16. (~/(?i)tinyint|smallint|mediumint|int/) : "Integer",
  17. (~/(?i)bigint/) : "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. // 只有后面紧接着的是"_"下滑线的表头会被处理,比如:t_estcolumn会被处理,testcolumn不会被处理
  27. tableHeaderRemoved = ["t","t_sys"]
  28. authorName = "zsy"
  29.  
  30. FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  31. SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
  32. }
  33.  
  34. def generate(table, dir) {
  35. def className = javaClassName(table.getName(), true)
  36. def fields = calcFields(table)
  37. packageName = getPackageName(dir)
  38. tableComment = table.getComment()
  39. if(tableComment==null){
  40. tableComment = ""
  41. }
  42. tableComment = tableComment.replaceAll("\n"," ")
  43. className = className +"DO"
  44. PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
  45. printWriter.withPrintWriter {out -> generate(out, className, fields,table)}
  46. }
  47.  
  48. // 获取包所在文件夹路径
  49. def getPackageName(dir) {
  50. return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
  51. }
  52.  
  53. def generate(out, className, fields,table) {
  54. out.println "package $packageName"
  55. out.println ""
  56. out.println "import java.io.Serializable;"
  57. out.println "import io.swagger.annotations.*;"
  58. out.println "import lombok.*;"
  59. Set types = new HashSet()
  60.  
  61. fields.each() {
  62. types.add(it.type)
  63. }
  64.  
  65. if (types.contains("Date")) {
  66. out.println "import java.util.Date;"
  67. }
  68.  
  69. if (types.contains("InputStream")) {
  70. out.println "import java.io.InputStream;"
  71. }
  72. out.println ""
  73. out.println "/**\n" +
  74. " * @Description ${tableComment} \n" +
  75. " * @Author ${authorName} \n" +
  76. " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
  77. " */"
  78. out.println ""
  79. out.println "@Data"
  80. out.println "@ApiModel(description= \"${tableComment}\")"
  81. out.println "public class $className implements Serializable {"
  82. out.println ""
  83. out.println genSerialID()
  84. i = 0
  85. fields.each() {
  86. out.println ""
  87. if(it.commoent==null){
  88. it.commoent = ""
  89. }
  90. it.commoent = it.commoent.replaceAll("\n","").replaceAll("\r","")
  91. // 输出注释
  92. if (isNotEmpty(it.commoent)) {
  93. out.println "\t/**"
  94. out.println "\t * ${it.commoent.toString()}"
  95. out.println "\t */"
  96. }
  97. out.println "\t@ApiModelProperty(value = \"${it.commoent}\", position = ${i})"
  98. // 输出成员变量
  99. out.println "\tprivate ${it.type} ${it.name};"
  100. i++
  101. }
  102. out.println ""
  103. out.println "}"
  104. }
  105.  
  106. def calcFields(table) {
  107. // 加载当前数据库主键
  108. def primaryKey = ""
  109. def prKey = DasUtil.getPrimaryKey(table);
  110. if (prKey != null) {
  111. def keyRef = prKey.getColumnsRef();
  112. if (keyRef != null) {
  113. def it = keyRef.iterate();
  114. while (it.hasNext()) {
  115. // 默认只处理单主键
  116. primaryKey = it.next();
  117. }
  118. primaryKey = javaName(primaryKey, false);
  119. }
  120. }
  121.  
  122. DasUtil.getColumns(table).reduce([]) { fields, col ->
  123. def spec = Case.LOWER.apply(col.getDataType().getSpecification())
  124. def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
  125. def colName = col.getName()
  126. def nameTemp = javaName(colName, false)
  127. // 当前列是否为主键
  128. def isPrimaryKey = nameTemp.equals(primaryKey)
  129. def comm =[
  130. colName : colName,
  131. name : nameTemp,
  132. type : typeStr,
  133. commoent: col.getComment(),
  134. isKey: isPrimaryKey,
  135. annos: "@Column(name = \""+col.getName()+"\" )"]
  136. fields += [comm]
  137. }
  138. }
  139.  
  140. // 去掉自定义的字符串,下面的javaName为原始的方法,不去除表头
  141. def javaClassName(str, capitalize) {
  142. def tempStr = str
  143. // 去除开头的指定字符串
  144. tableHeaderRemoved.each(){
  145. it = it.toLowerCase()
  146. if (isNotEmpty(it)){
  147. if (it.size() < tempStr.size()){
  148. def headTemp = tempStr[0..it.size() - 1]
  149. def underLineFlag = tempStr[it.size()..it.size()]
  150. if (it == headTemp.toLowerCase() && underLineFlag == "_") {
  151. tempStr = tempStr[it.size()..tempStr.size() - 1]
  152. return true
  153. }
  154. }
  155. }
  156. }
  157. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(tempStr)
  158. .collect { Case.LOWER.apply(it).capitalize() }
  159. .join("")
  160. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  161. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  162. }
  163.  
  164. def javaName(str, capitalize) {
  165. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  166. .collect { Case.LOWER.apply(it).capitalize() }
  167. .join("")
  168. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  169. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  170. }
  171.  
  172. def isNotEmpty(content) {
  173. return content != null && content.toString().trim().length() > 0
  174. }
  175.  
  176. static String changeStyle(String str, boolean toCamel){
  177. if(!str || str.size() <= 1)
  178. return str
  179.  
  180. if(toCamel){
  181. String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')
  182. return r[0].toLowerCase() + r[1..-1]
  183. }else{
  184. str = str[0].toLowerCase() + str[1..-1]
  185. return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')
  186. }
  187. }
  188.  
  189. static String genSerialID()
  190. {
  191. return "\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
  192. }

Generate DaoPOJOs.groovy

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

    /**
    * @Description 生成Dao文件,生成此文件请先生成DO文件
    * @Author zsy
    * @Date 2020-07-13
    */
    packageName = ""
    tableComment = ""
    modelNameSpace = ""
    typeMapping = [
    (~/(?i)tinyint|smallint|mediumint|int/) : "Integer",
    (~/(?i)bigint/) : "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"
    ]

    //自定义需要去除的表头,根据自己的数据库表头自定义。自定义作者名称
    // 只有后面紧接着的是"_"下滑线的表头会被处理,比如:t_estcolumn会被处理,testcolumn不会被处理
    tableHeaderRemoved = ["t","t_sys"]
    authorName = "ZhengSiyuan"
    //项目路径不能包含中文
    modelCreateDir = "mybatis-generator-test\\code-generato\\src\\main\\java\\com\\zsy\\codegenerato\\models"

    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)
    tableComment = table.getComment()
    def modelDirPath = getSqlMapperModelNameSpace(dir)
    getModelNameSpace(modelDirPath, className)
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + "DAO.java")), "UTF-8"))
    printWriter.withPrintWriter {out -> generateSqlMapper(out, className, fields,table)}
    }

    // 获取包所在文件夹路径
    def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
    }

    //获取Model的项目保存地址
    def getSqlMapperModelNameSpace(dir){
    def nameTemp = modelCreateDir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
    def nameList = nameTemp.split('\\.')
    def projectName = nameList[0]
    def allDirPath = dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
    def index = allDirPath.toString().indexOf(projectName)
    def commonPath = allDirPath[0..index-1]
    return "${commonPath}${nameTemp}".replaceAll("\\.", "\\\\")
    }

    def getModelNameSpace(modelDir, className){
    def modelPathTemp = new File(modelDir)
    modelPathTemp.eachFileRecurse{directory->createModelNameSpace(directory, className)}
    }

    def createModelNameSpace(directory, className){
    def judgeName = className+"DO.java"
    if(directory.toString().indexOf(judgeName.toString())>0){
    modelNameSpace = directory.toString().replaceAll("\\\\", ".")
    .replaceAll("/", ".")
    .replaceAll("^.*src(\\.main\\.java\\.)?", "")
    modelNameSpace = modelNameSpace[0..modelNameSpace.size()-6]
    }
    }

    def generateSqlMapper(out, className, fields,table) {
    out.println "package ${packageName}"
    out.println ""
    out.println "import ${modelNameSpace};"
    out.println "import com.huitu.service.enums.DbEnum;"
    out.println "import java.util.List;"
    out.println "import org.springframework.stereotype.Component;"
    out.println ""
    def componentName = firstCharToLow(className)+"DAO"
    out.println "@Component(\"${componentName}\")"
    out.println "public interface ${className}DAO {"
    out.println ""
    out.println "}"
    }

    def calcFields(table) {
    // 加载当前数据库主键
    def primaryKey = ""
    def prKey = DasUtil.getPrimaryKey(table);
    if (prKey != null) {
    def keyRef = prKey.getColumnsRef();
    if (keyRef != null) {
    def it = keyRef.iterate();
    while (it.hasNext()) {
    // 默认只处理单主键
    primaryKey = it.next();
    }
    primaryKey = javaName(primaryKey, false);
    }
    }

    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 colName = col.getName()
    def nameTemp = javaName(colName, false)
    // 当前列是否为主键
    def isPrimaryKey = nameTemp.equals(primaryKey)
    def comm =[
    colName : colName,
    name : nameTemp,
    type : typeStr,
    commoent: col.getComment(),
    isKey: isPrimaryKey,
    annos: "@Column(name = \""+col.getName()+"\" )"]
    fields += [comm]
    }
    }

    // 去掉自定义的字符串,下面的javaName为原始的方法,不去除表头
    def javaClassName(str, capitalize) {
    def tempStr = str
    // 去除开头的指定字符串
    tableHeaderRemoved.each(){
    it = it.toLowerCase()
    if (isNotEmpty(it)){
    if (it.size() < tempStr.size()){
    def headTemp = tempStr[0..it.size() - 1]
    def underLineFlag = tempStr[it.size()..it.size()]
    if (it == headTemp.toLowerCase() && underLineFlag == "_") {
    tempStr = tempStr[it.size()..tempStr.size() - 1]
    return true
    }
    }
    }
    }
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(tempStr)
    .collect { Case.LOWER.apply(it).capitalize() }
    .join("")
    .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
    }

    def javaName(str, capitalize) {
    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 firstCharToUp(String str){
    String r = str[0..0]
    if(((char)r).isLowerCase()){
    return "${r.toUpperCase()}${str[1..str.length()-1]}"
    }
    return str
    }

    //首字母转为小写
    static String firstCharToLow(String str){
    String r = str[0..0]
    if(((char)r).isUpperCase()){
    return "${r.toLowerCase()}${str[1..str.length()-1]}"
    }
    return str
    }

    static String genSerialID()
    {
    return "\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
    }

  1.  

Generate MapperPOJOs.groovy

  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. * @Description 生成SqlMapper文件,生成此文件请先生成DO、DAO文件
  10. * @Author zsy
  11. * @Date 2020-07-13
  12. */
  13. packageName = ""
  14. tableComment = ""
  15. modelNameSpace = ""
  16. daoNameSpace = ""
  17. tableName = ""
  18. typeMapping = [
  19. (~/(?i)tinyint|smallint|mediumint|int/) : "Integer",
  20. (~/(?i)bigint/) : "Long",
  21. (~/(?i)bool|bit/) : "Boolean",
  22. (~/(?i)float|double|decimal|real/) : "Double",
  23. (~/(?i)datetime|timestamp|date|time/) : "Date",
  24. (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
  25. (~/(?i)/) : "String"
  26. ]
  27.  
  28. //自定义需要去除的表头,根据自己的数据库表头自定义。自定义作者名称
  29. // 只有后面紧接着的是"_"下滑线的表头会被处理,比如:t_estcolumn会被处理,testcolumn不会被处理
  30. tableHeaderRemoved = ["t","t_sys"]
  31. authorName = "ZhengSiyuan"
  32. //项目路径不能包含中文
  33. modelCreateDir = "mybatis-generator-test\\code-generato\\src\\main\\java\\com\\zsy\\codegenerato\\models"
  34. daoCreateDir = "mybatis-generator-test\\code-generato\\src\\main\\java\\com\\zsy\\codegenerato\\mapper"
  35.  
  36. FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  37. SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
  38. }
  39.  
  40. def generate(table, dir) {
  41. tableName = table.getName()
  42. def className = javaClassName(tableName, true)
  43. def fields = calcFields(table)
  44. packageName = getPackageName(dir)
  45. tableComment = table.getComment()
  46. def modelDirPath = getModelAndDaoSavePath(dir, modelCreateDir)
  47. def daoDirPath = getModelAndDaoSavePath(dir, daoCreateDir)
  48. getNameSpace(modelDirPath, className, "DO.java")
  49. getNameSpace(daoDirPath, className, "DAO.java")
  50. PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + "Mapper.xml")), "UTF-8"))
  51. printWriter.withPrintWriter {out -> generateSqlMapper(out, className, fields,table)}
  52. }
  53.  
  54. // 获取包所在文件夹路径
  55. def getPackageName(dir) {
  56. return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
  57. }
  58.  
  59. //获取Model的项目保存地址
  60. def getModelAndDaoSavePath(dir, savePath){
  61. def nameTemp = savePath.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
  62. def nameList = nameTemp.split('\\.')
  63. def projectName = nameList[0]
  64. def allDirPath = dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
  65. def index = allDirPath.toString().indexOf(projectName)
  66. def commonPath = allDirPath[0..index-1]
  67. return "${commonPath}${nameTemp}".replaceAll("\\.", "\\\\")
  68. }
  69.  
  70. def getNameSpace(modelDir, className, suffix){
  71. def modelPathTemp = new File(modelDir)
  72. modelPathTemp.eachFileRecurse{directory->createModelNameSpace(directory, className, suffix)}
  73. }
  74.  
  75. def createModelNameSpace(directory, className, suffix){
  76. def judgeName = className+suffix
  77. if(directory.toString().indexOf(judgeName.toString())>0){
  78. def tempNameSpace = directory.toString().replaceAll("\\\\", ".")
  79. .replaceAll("/", ".")
  80. .replaceAll("^.*src(\\.main\\.java\\.)?", "")
  81. if(suffix=="DO.java"){
  82. modelNameSpace = tempNameSpace[0..tempNameSpace.size()-6]
  83. }else if(suffix=="DAO.java"){
  84. daoNameSpace = tempNameSpace[0..tempNameSpace.size()-6]
  85. }
  86. }
  87. }
  88.  
  89. def generateSqlMapper(out, className, fields,table) {
  90. out.println "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
  91. out.println "<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\""
  92. out.println "\t\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">"
  93. out.println "<mapper namespace=\"${daoNameSpace}\">"
  94. out.println "\t<resultMap id=\"BaseResultMap\" type=\"${modelNameSpace}\">"
  95. fields.each() {
  96. if(it.isKey){
  97. out.println "\t\t<id column=\"${it.colName}\" jdbcType=\"${it.typeOrg.toUpperCase()}\" property=\"${it.name}\" />"
  98. }else{
  99. out.println "\t\t<result column=\"${it.colName}\" jdbcType=\"${it.typeOrg.toUpperCase()}\" property=\"${it.name}\" />"
  100. }
  101. }
  102. out.println "\t</resultMap>"
  103. def filesId = firstCharToLow(className)+"Fields";
  104. out.println "\t<sql id=\"${filesId}\">"
  105. def filesIdStr = ""
  106. def count = 1
  107. def keyColumnName = ""
  108. def keyName = ""
  109. def keyType = ""
  110. fields.each(){
  111. if(filesIdStr==""){
  112. filesIdStr = it.colName
  113. }else{
  114. filesIdStr = filesIdStr+",${it.colName}"
  115. if(count==10 || count == 20 || count == 30 || count == 40){
  116. filesIdStr = filesIdStr+"\n\t\t"
  117. }
  118. }
  119. if(it.isKey){
  120. keyColumnName = it.colName
  121. keyName = it.name
  122. keyType = it.type
  123. }
  124. count = count+1
  125. }
  126. out.println "\t\t${filesIdStr}"
  127. out.println "\t</sql>"
  128. if(keyColumnName != ""){
  129. out.println "\t<select id=\"get${className}By${firstCharToUp(keyName)}\" parameterType=\"${keyType}\" resultType=\"${modelNameSpace}\">"
  130. out.println "\t\tSELECT"
  131. out.println "\t\t<include refid=\"${filesId}\" />"
  132. out.println "\t\tFROM ${tableName} WITH(NOLOCK)"
  133. out.println "\t\tWHERE ${keyColumnName} = #{${keyName}}"
  134. out.println "\t</select>"
  135. }
  136. out.println "</mapper>"
  137. }
  138.  
  139. def calcFields(table) {
  140. // 加载当前数据库主键
  141. def primaryKey = ""
  142. def prKey = DasUtil.getPrimaryKey(table);
  143. if (prKey != null) {
  144. def keyRef = prKey.getColumnsRef();
  145. if (keyRef != null) {
  146. def it = keyRef.iterate();
  147. while (it.hasNext()) {
  148. // 默认只处理单主键
  149. primaryKey = it.next();
  150. }
  151. primaryKey = javaName(primaryKey, false);
  152. }
  153. }
  154.  
  155. DasUtil.getColumns(table).reduce([]) { fields, col ->
  156. def spec = Case.LOWER.apply(col.getDataType().getSpecification())
  157. def typeStrOrg = spec.toString().replaceAll(/\((.*?)\)/, "")
  158. def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
  159. def colName = col.getName()
  160. def nameTemp = javaName(colName, false)
  161. // 当前列是否为主键
  162. def isPrimaryKey = nameTemp.equals(primaryKey)
  163. def comm =[
  164. colName : colName,
  165. name : nameTemp,
  166. type : typeStr,
  167. typeOrg : typeStrOrg,
  168. commoent: col.getComment(),
  169. isKey: isPrimaryKey,
  170. annos: "@Column(name = \""+col.getName()+"\" )"]
  171. fields += [comm]
  172. }
  173. }
  174.  
  175. // 去掉自定义的字符串,下面的javaName为原始的方法,不去除表头
  176. def javaClassName(str, capitalize) {
  177. def tempStr = str
  178. // 去除开头的指定字符串
  179. tableHeaderRemoved.each(){
  180. it = it.toLowerCase()
  181. if (isNotEmpty(it)){
  182. if (it.size() < tempStr.size()){
  183. def headTemp = tempStr[0..it.size() - 1]
  184. def underLineFlag = tempStr[it.size()..it.size()]
  185. if (it == headTemp.toLowerCase() && underLineFlag == "_") {
  186. tempStr = tempStr[it.size()..tempStr.size() - 1]
  187. return true
  188. }
  189. }
  190. }
  191. }
  192. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(tempStr)
  193. .collect { Case.LOWER.apply(it).capitalize() }
  194. .join("")
  195. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  196. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  197. }
  198.  
  199. def javaName(str, capitalize) {
  200. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  201. .collect { Case.LOWER.apply(it).capitalize() }
  202. .join("")
  203. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  204. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  205. }
  206.  
  207. def isNotEmpty(content) {
  208. return content != null && content.toString().trim().length() > 0
  209. }
  210.  
  211. static String changeStyle(String str, boolean toCamel){
  212. if(!str || str.size() <= 1)
  213. return str
  214.  
  215. if(toCamel){
  216. String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')
  217. return r[0].toLowerCase() + r[1..-1]
  218. }else{
  219. str = str[0].toLowerCase() + str[1..-1]
  220. return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')
  221. }
  222. }
  223.  
  224. //首字母转成大写
  225. static String firstCharToUp(String str){
  226. String r = str[0..0]
  227. if(((char)r).isLowerCase()){
  228. return "${r.toUpperCase()}${str[1..str.length()-1]}"
  229. }
  230. return str
  231. }
  232.  
  233. //首字母转为小写
  234. static String firstCharToLow(String str){
  235. String r = str[0..0]
  236. if(((char)r).isUpperCase()){
  237. return "${r.toLowerCase()}${str[1..str.length()-1]}"
  238. }
  239. return str
  240. }
  241.  
  242. static String genSerialID()
  243. {
  244. return "\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
  245. }

其中项目配置路径需要注意,项目路径不能包含中文,..\\models下可以包含子文件夹,但不需要把文件名写在配置中。

  1. modelCreateDir = "mybatis-generator-test\\code-generato\\src\\main\\java\\com\\zsy\\codegenerato\\models"

3.使用脚本生成代码,生成顺序为DO=>DAO=>SqlMapper,因为DAO文件需要用到DO的地址,SqlMapper需要用到DO以及DAO文件地址。

右键选中表,选择相应的脚本文件:

选择需要存放文件的文件夹,点击OK即可,生成其他文件步骤也是一样的。

小结:使用此方法最大的好处就是可以按需生成,而且不需要将生成代码整合在项目当中。一般使用此方法生成DO文件,而DAO跟SqlMapper根据业务需要自己编写。

参考资料:

https://blog.csdn.net/Javajiaojiaozhe/article/details/107062497

Java IDEA根据database以及脚本代码自动生成DO,DAO,SqlMapper文件(一)的更多相关文章

  1. mybatis自动生成mapper,dao映射文件

    利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...

  2. C# 脚本代码自动登录淘宝获取用户信息

    C# 脚本代码自动登录淘宝获取用户信息   最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...

  3. 代码自动生成工具MyGeneration之一(程序员必备工具)

    代码自动生成工具MyGeneration之一(程序员必备工具) 转 分类: C#2008-08-06 18:12 16064人阅读 评论(12) 收藏 举报 工具数据库相关数据库stringbrows ...

  4. MyBatis代码自动生成

    MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实 ...

  5. Mybatis代码自动生成(含测试)

    一.建立数据库 create database shixun; use shixun; create table user( id int primary key auto_increment , u ...

  6. webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

    首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...

  7. 代码自动生成工具_java版

    项目结构: 这里要实现的功能是,当我们给出了bean,如:Admin,User,People等实体类后, 我想用代码自动生成我想要的代码,最后生成的效果: 也就是说为每一个bean都生成相应的Dao, ...

  8. mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap【转】

    由于mybatis简单易学,比起Hibername来,更容易上手,代码也能自动生成.这几天研究了下代码自动生成的,参考: http://0609xiaohua.iteye.com/blog/14535 ...

  9. 基于eclipse的mybatis映射代码自动生成的插件

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

随机推荐

  1. Redis中的跳表

    date: 2020-10-15 14:58:00 updated: 2020-10-19 17:58:00 Redis中的跳表 参考网址1 参考网址2 redis 数据类型 zset 实现有序集合, ...

  2. 常用的实现Javaweb页面跳转的方式

    我们有两大种方式来实现页面跳转:1.JS(javascript):2.jsp跳转 先说jsp(金j三s胖p):1.转发:request.getRequestDispatcher("1.jsp ...

  3. Spark为什么只有在调用action时才会触发任务执行呢(附算子优化和使用示例)?

    Spark算子主要划分为两类:transformation和action,并且只有action算子触发的时候才会真正执行任务.还记得之前的文章<Spark RDD详解>中提到,Spark ...

  4. 【新阁教育】基于ModbusTCP实现西门子1200PLC定位控制案例

    1. 引言 今天新阁教育给大家分享一个<基于ModbusTCP实现西门子1200PLC定位控制案例>,从PLC输入输出及步进电机接线开始,到PLC运动控制程序编写,再到后续的ModbusT ...

  5. P3065 [USACO12DEC]First! G

    题意描述 [USACO12DEC]First! G 不错的一道题. 给你 \(N\) 个字符串,要求你求出可能的字典序最小的字符串. 对于 可能的最小的字符串,你可以任意排列 \(26\) 个字母,使 ...

  6. 文件流转blob并播放

    axios 这里是请求了个mp3做例子: this.$axios({ methods:"GET", url:"/api/music/soures/双笙.mp3" ...

  7. Typora设置Vue主题

    平时看视频,发现好多老师使用 Typora 时,界面跟我的不一样,好看一些,后来查了下才知道老师使用了Vue主题,接下来我就记录下设置Vue主题的步骤吧 一.下载Vue主题 地址:http://the ...

  8. 832. Flipping an Image —— weekly contest 84

    Flipping an Image Given a binary matrix A, we want to flip the image horizontally, then invert it, a ...

  9. vue API 知识点(2)---选项总结

    一.选项 / 数据 1.data 当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例,如果 data 仍然是一个纯碎的对象,则所有的实例将被共享引用同一个 ...

  10. MATLAB-simulink实现逻辑组合电路--全加器

    author: ZKe 全加器的原理这里就不讲了,不知道的还是去看看数字逻辑课本吧,这里主要记录一下simulink实现逻辑组合电路的方法 首先我们需要知道它的电路图,如下(借用慕课赵贻竹老师的PPT ...