Java IDEA根据database以及脚本代码自动生成DO,DAO,SqlMapper文件(一)
根据数据库代码自动生成的插件挺多的,这里主要分享两种:
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
- 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 生成DO文件
- * @zsy
- * @Date 2020-07-13
- */
- packageName = ""
- tableComment = ""
- 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 = "zsy"
- 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()
- if(tableComment==null){
- tableComment = ""
- }
- tableComment = tableComment.replaceAll("\n"," ")
- className = className +"DO"
- PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
- printWriter.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 java.io.Serializable;"
- out.println "import io.swagger.annotations.*;"
- out.println "import lombok.*;"
- 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 ${tableComment} \n" +
- " * @Author ${authorName} \n" +
- " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
- " */"
- out.println ""
- out.println "@Data"
- out.println "@ApiModel(description= \"${tableComment}\")"
- out.println "public class $className implements Serializable {"
- out.println ""
- out.println genSerialID()
- i = 0
- fields.each() {
- out.println ""
- if(it.commoent==null){
- it.commoent = ""
- }
- it.commoent = it.commoent.replaceAll("\n","").replaceAll("\r","")
- // 输出注释
- if (isNotEmpty(it.commoent)) {
- out.println "\t/**"
- out.println "\t * ${it.commoent.toString()}"
- out.println "\t */"
- }
- out.println "\t@ApiModelProperty(value = \"${it.commoent}\", position = ${i})"
- // 输出成员变量
- out.println "\tprivate ${it.type} ${it.name};"
- i++
- }
- 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 genSerialID()
- {
- return "\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
- }
Generate DaoPOJOs.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
/**
* @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;"
}
Generate MapperPOJOs.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
- /**
- * @Description 生成SqlMapper文件,生成此文件请先生成DO、DAO文件
- * @Author zsy
- * @Date 2020-07-13
- */
- packageName = ""
- tableComment = ""
- modelNameSpace = ""
- daoNameSpace = ""
- tableName = ""
- 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"
- daoCreateDir = "mybatis-generator-test\\code-generato\\src\\main\\java\\com\\zsy\\codegenerato\\mapper"
- 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) {
- tableName = table.getName()
- def className = javaClassName(tableName, true)
- def fields = calcFields(table)
- packageName = getPackageName(dir)
- tableComment = table.getComment()
- def modelDirPath = getModelAndDaoSavePath(dir, modelCreateDir)
- def daoDirPath = getModelAndDaoSavePath(dir, daoCreateDir)
- getNameSpace(modelDirPath, className, "DO.java")
- getNameSpace(daoDirPath, className, "DAO.java")
- PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + "Mapper.xml")), "UTF-8"))
- printWriter.withPrintWriter {out -> generateSqlMapper(out, className, fields,table)}
- }
- // 获取包所在文件夹路径
- def getPackageName(dir) {
- return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
- }
- //获取Model的项目保存地址
- def getModelAndDaoSavePath(dir, savePath){
- def nameTemp = savePath.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 getNameSpace(modelDir, className, suffix){
- def modelPathTemp = new File(modelDir)
- modelPathTemp.eachFileRecurse{directory->createModelNameSpace(directory, className, suffix)}
- }
- def createModelNameSpace(directory, className, suffix){
- def judgeName = className+suffix
- if(directory.toString().indexOf(judgeName.toString())>0){
- def tempNameSpace = directory.toString().replaceAll("\\\\", ".")
- .replaceAll("/", ".")
- .replaceAll("^.*src(\\.main\\.java\\.)?", "")
- if(suffix=="DO.java"){
- modelNameSpace = tempNameSpace[0..tempNameSpace.size()-6]
- }else if(suffix=="DAO.java"){
- daoNameSpace = tempNameSpace[0..tempNameSpace.size()-6]
- }
- }
- }
- def generateSqlMapper(out, className, fields,table) {
- out.println "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- out.println "<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\""
- out.println "\t\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">"
- out.println "<mapper namespace=\"${daoNameSpace}\">"
- out.println "\t<resultMap id=\"BaseResultMap\" type=\"${modelNameSpace}\">"
- fields.each() {
- if(it.isKey){
- out.println "\t\t<id column=\"${it.colName}\" jdbcType=\"${it.typeOrg.toUpperCase()}\" property=\"${it.name}\" />"
- }else{
- out.println "\t\t<result column=\"${it.colName}\" jdbcType=\"${it.typeOrg.toUpperCase()}\" property=\"${it.name}\" />"
- }
- }
- out.println "\t</resultMap>"
- def filesId = firstCharToLow(className)+"Fields";
- out.println "\t<sql id=\"${filesId}\">"
- def filesIdStr = ""
- def count = 1
- def keyColumnName = ""
- def keyName = ""
- def keyType = ""
- fields.each(){
- if(filesIdStr==""){
- filesIdStr = it.colName
- }else{
- filesIdStr = filesIdStr+",${it.colName}"
- if(count==10 || count == 20 || count == 30 || count == 40){
- filesIdStr = filesIdStr+"\n\t\t"
- }
- }
- if(it.isKey){
- keyColumnName = it.colName
- keyName = it.name
- keyType = it.type
- }
- count = count+1
- }
- out.println "\t\t${filesIdStr}"
- out.println "\t</sql>"
- if(keyColumnName != ""){
- out.println "\t<select id=\"get${className}By${firstCharToUp(keyName)}\" parameterType=\"${keyType}\" resultType=\"${modelNameSpace}\">"
- out.println "\t\tSELECT"
- out.println "\t\t<include refid=\"${filesId}\" />"
- out.println "\t\tFROM ${tableName} WITH(NOLOCK)"
- out.println "\t\tWHERE ${keyColumnName} = #{${keyName}}"
- out.println "\t</select>"
- }
- out.println "</mapper>"
- }
- 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 typeStrOrg = spec.toString().replaceAll(/\((.*?)\)/, "")
- 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,
- typeOrg : typeStrOrg,
- 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;"
- }
其中项目配置路径需要注意,项目路径不能包含中文,..\\models下可以包含子文件夹,但不需要把文件名写在配置中。
- 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文件(一)的更多相关文章
- mybatis自动生成mapper,dao映射文件
利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...
- C# 脚本代码自动登录淘宝获取用户信息
C# 脚本代码自动登录淘宝获取用户信息 最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...
- 代码自动生成工具MyGeneration之一(程序员必备工具)
代码自动生成工具MyGeneration之一(程序员必备工具) 转 分类: C#2008-08-06 18:12 16064人阅读 评论(12) 收藏 举报 工具数据库相关数据库stringbrows ...
- MyBatis代码自动生成
MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实 ...
- Mybatis代码自动生成(含测试)
一.建立数据库 create database shixun; use shixun; create table user( id int primary key auto_increment , u ...
- webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成
首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...
- 代码自动生成工具_java版
项目结构: 这里要实现的功能是,当我们给出了bean,如:Admin,User,People等实体类后, 我想用代码自动生成我想要的代码,最后生成的效果: 也就是说为每一个bean都生成相应的Dao, ...
- mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap【转】
由于mybatis简单易学,比起Hibername来,更容易上手,代码也能自动生成.这几天研究了下代码自动生成的,参考: http://0609xiaohua.iteye.com/blog/14535 ...
- 基于eclipse的mybatis映射代码自动生成的插件
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
随机推荐
- Redis中的跳表
date: 2020-10-15 14:58:00 updated: 2020-10-19 17:58:00 Redis中的跳表 参考网址1 参考网址2 redis 数据类型 zset 实现有序集合, ...
- 常用的实现Javaweb页面跳转的方式
我们有两大种方式来实现页面跳转:1.JS(javascript):2.jsp跳转 先说jsp(金j三s胖p):1.转发:request.getRequestDispatcher("1.jsp ...
- Spark为什么只有在调用action时才会触发任务执行呢(附算子优化和使用示例)?
Spark算子主要划分为两类:transformation和action,并且只有action算子触发的时候才会真正执行任务.还记得之前的文章<Spark RDD详解>中提到,Spark ...
- 【新阁教育】基于ModbusTCP实现西门子1200PLC定位控制案例
1. 引言 今天新阁教育给大家分享一个<基于ModbusTCP实现西门子1200PLC定位控制案例>,从PLC输入输出及步进电机接线开始,到PLC运动控制程序编写,再到后续的ModbusT ...
- P3065 [USACO12DEC]First! G
题意描述 [USACO12DEC]First! G 不错的一道题. 给你 \(N\) 个字符串,要求你求出可能的字典序最小的字符串. 对于 可能的最小的字符串,你可以任意排列 \(26\) 个字母,使 ...
- 文件流转blob并播放
axios 这里是请求了个mp3做例子: this.$axios({ methods:"GET", url:"/api/music/soures/双笙.mp3" ...
- Typora设置Vue主题
平时看视频,发现好多老师使用 Typora 时,界面跟我的不一样,好看一些,后来查了下才知道老师使用了Vue主题,接下来我就记录下设置Vue主题的步骤吧 一.下载Vue主题 地址:http://the ...
- 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 ...
- vue API 知识点(2)---选项总结
一.选项 / 数据 1.data 当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例,如果 data 仍然是一个纯碎的对象,则所有的实例将被共享引用同一个 ...
- MATLAB-simulink实现逻辑组合电路--全加器
author: ZKe 全加器的原理这里就不讲了,不知道的还是去看看数字逻辑课本吧,这里主要记录一下simulink实现逻辑组合电路的方法 首先我们需要知道它的电路图,如下(借用慕课赵贻竹老师的PPT ...