当前位置:首页 > 文章列表 > 数据库 > MySQL > 使用Go语言+IDEA+mysql 逆向生成dao 和 domain 的方法

使用Go语言+IDEA+mysql 逆向生成dao 和 domain 的方法

来源:SegmentFault 2023-02-24 13:24:44 0浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《使用Go语言+IDEA+mysql 逆向生成dao 和 domain 的方法》,文章讲解的知识点主要包括MySQL、go、idea,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

参考地址:

https://www.cnblogs.com/gaoma...

使用方式

第一步:安装idea:自行百度

第二步:Idea配置mysql 连接

  • View -> Tool Windows -> DataSource 出现数据连接页面
  • 点击 + 号,出现数据库连接设置,

    • name: 连接名称
    • comments: 备注
    • host:本地或者内网ip
    • user:用户名
    • password:密码
    • Database:连接数据库名称
    • url: jdbc连接

      • 注意此处如果是mysql 5.5 以上 的版本需要加入如下参数
      • serverTimezone=UTC

第三步:使用groovy逆向生成model, dao, daoxml 三种类型的文件

  • 右击连接:选中
    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 className = javaName(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) {
        def tableName = table.getName()
        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.Data;"
        out.println "import lombok.AllArgsConstructor;"
        out.println "import lombok.Builder;"
        out.println "import lombok.NoArgsConstructor;"
    
        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  GX\n" +
                " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
                " */"
        out.println ""
        out.println "@Data"
        out.println "@Entity"
        out.println "@AllArgsConstructor"
        out.println "@Builder"
        out.println "@NoArgsConstructor"
        out.println "@Table ( name =\""+table.getName() +"\" )"
        out.println "public class $className  implements Serializable {"
        out.println genSerialID()
    
    
        // 判断自增
        if ((tableName + "_id").equalsIgnoreCase(fields[0].colum) || "id".equalsIgnoreCase(fields[0].colum)) {
            out.println "\t@Id"
            out.println "\t@GeneratedValue(generator = \"idGenerator\")"
            out.println "\t@GenericGenerator(name = \"idGenerator\", strategy = ChiticCoreConstant.ID_GENERATOR_COMMON)"
        }
    
    
        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(/(? 0
    }
    
    static String changeStyle(String str, boolean toCamel){
        if(!str || str.size()  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 Dao.groovy文件(生成dao):

    package src
    
    import com.intellij.database.model.DasTable
    import com.intellij.database.util.Case
    import com.intellij.database.util.DasUtil
    
    /*
     * Available context bindings:
     *   SELECTION   Iterable
     *   PROJECT     project
     *   FILES       files helper
     */
    
    packageName = "**;" // 需手动配置 生成的 dao 所在包位置
    
    FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
        SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
    }
    
    def generate(table, dir) {
        def baseName = javaName(table.getName(), true)
        new File(dir, baseName + "Mapper.java").withPrintWriter { out -> generateInterface(out, baseName) }
    }
    
    def generateInterface(out, baseName) {
        def date = new Date().format("yyyy/MM/dd")
        out.println "package $packageName"
        out.println "import cn.xx.entity.${baseName}Entity;" // 需手动配置
        out.println "import org.springframework.stereotype.Repository;"
        out.println ""
        out.println "/**"
        out.println " * Created on $date."
        out.println " *"
        out.println " * @author GX" // 可自定义
        out.println " */"
        out.println "@Repository"
        out.println "public interface ${baseName}Dao extends BaseDao {" // 可自定义
        out.println ""
        out.println "}"
    }
    
    def javaName(str, capitalize) {
        def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
                .collect { Case.LOWER.apply(it).capitalize() }
                .join("")
                .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
        name = capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
    }

    Generate DaoXml.groovy文件(生成dao.xml):

    package src
    
    import com.intellij.database.model.DasTable
    import com.intellij.database.util.Case
    import com.intellij.database.util.DasUtil
    
    /*
     * Available context bindings:
     *   SELECTION   Iterable
     *   PROJECT     project
     *   FILES       files helper
     */
    
    // entity(dto)、mapper(dao) 与数据库表的对应关系在这里手动指明,idea Database 窗口里只能选下列配置了的 mapper
    // tableName(key) : [mapper(dao),entity(dto)]
    typeMapping = [
            (~/(?i)int/)                      : "INTEGER",
            (~/(?i)float|double|decimal|real/): "DOUBLE",
            (~/(?i)datetime|timestamp/)       : "TIMESTAMP",
            (~/(?i)date/)                     : "TIMESTAMP",
            (~/(?i)time/)                     : "TIMESTAMP",
            (~/(?i)/)                         : "VARCHAR"
    ]
    
    basePackage = "com.chitic.bank.mapping" // 包名需手动填写
    
    FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
        SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
    }
    
    def generate(table, dir) {
        def baseName = mapperName(table.getName(), true)
        def fields = calcFields(table)
        new File(dir, baseName + "Mapper.xml").withPrintWriter { out -> generate(table, out, baseName, fields) }
    }
    
    def generate(table, out, baseName, fields) {
        def baseResultMap = 'BaseResultMap'
        def base_Column_List = 'Base_Column_List'
        def date = new Date().format("yyyy/MM/dd")
        def tableName = table.getName()
    
        def dao = basePackage + ".dao.${baseName}Mapper"
        def to = basePackage + ".to.${baseName}TO"
    
        out.println mappingsStart(dao)
        out.println resultMap(baseResultMap, to, fields)
        out.println sql(fields, base_Column_List)
        out.println selectById(tableName, fields, baseResultMap, base_Column_List)
        out.println deleteById(tableName, fields)
        out.println delete(tableName, fields, to)
        out.println insert(tableName, fields, to)
        out.println update(tableName, fields, to)
        out.println selectList(tableName, fields, to, base_Column_List, baseResultMap)
        out.println mappingsEnd()
    
    }
    
    static def resultMap(baseResultMap, to, fields) {
    
        def inner = ''
        fields.each() {
            inner += '\t\t\n'
        }
    
        return '''\t
    ''' + inner + '''\t
    '''
    }
    
    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
            fields += [[
                               comment     : col.getComment(),
                               name        : mapperName(col.getName(), false),
                               sqlFieldName: col.getName(),
                               type        : typeStr,
                               annos       : ""]]
        }
    
    }
    
    def mapperName(str, capitalize) {
        def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
                .collect { Case.LOWER.apply(it).capitalize() }
                .join("")
                .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
        name = capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
    }
    
    // ------------------------------------------------------------------------ mappings
    static def mappingsStart(mapper) {
        return '''
    '''
    }
    
    // ------------------------------------------------------------------------ mappings
    static def mappingsEnd() {
        return ''''''
    }
    
    // ------------------------------------------------------------------------ selectById
    static def selectById(tableName, fields, baseResultMap, base_Column_List) {
        return '''
        '''
    }
    
    // ------------------------------------------------------------------------ insert
    static def insert(tableName, fields, parameterType) {
    
        return '''
        
            insert into ''' + tableName + '''
            
                ''' + testNotNullStr(fields) + '''
            
                ''' + testNotNullStrSet(fields) + '''
            
    '''
    
    }
    // ------------------------------------------------------------------------ update
    static def update(tableName, fields, parameterType) {
    
        return '''
        
            update ''' + tableName + '''
            
                ''' + testNotNullStrWhere(fields) + '''
            
            where id = #{id}
        '''
    }
    
    // ------------------------------------------------------------------------ deleteById
    static def deleteById(tableName, fields) {
    
        return '''
        
            delete
            from ''' + tableName + '''
            where id = #{id}
        '''
    }
    
    // ------------------------------------------------------------------------ delete
    static def delete(tableName, fields, parameterType) {
    
        return '''
        
            delete from ''' + tableName + '''
            where 1 = 1
            ''' + testNotNullStrWhere(fields) + '''
        '''
    }
    
    // ------------------------------------------------------------------------ selectList
    static def selectList(tableName, fields, parameterType, base_Column_List, baseResultMap) {
    
        return '''
        '''
    }
    
    // ------------------------------------------------------------------------ sql
    static def sql(fields, base_Column_List) {
        def str = '''\t
            @inner@
         '''
    
        def inner = ''
        fields.each() {
            inner += ('\t\t' + it.sqlFieldName + ',\n')
        }
    
        return str.replace("@inner@", inner.substring(0, inner.length() - 2))
    
    }
    
    static def testNotNullStrWhere(fields) {
        def inner = ''
        fields.each {
            inner += '''
            
                and ''' + it.sqlFieldName + ''' = #{''' + it.name + '''}
            \n'''
        }
    
        return inner
    }
    
    static def testNotNullStrSet(fields) {
        def inner = ''
        fields.each {
            inner += '''
            
                #{''' + it.name + '''},
            \n'''
        }
    
        return inner
    }
    
    static def testNotNullStr(fields) {
        def inner1 = ''
        fields.each {
            inner1 += '''
            
            \t''' + it.sqlFieldName + ''',
            \n'''
        }
    
        return inner1
    }

    好了,本文到此结束,带大家了解了《使用Go语言+IDEA+mysql 逆向生成dao 和 domain 的方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
聊聊maxwell的FileProducer聊聊maxwell的FileProducer
上一篇
聊聊maxwell的FileProducer
MySQL 中的数据类型
下一篇
MySQL 中的数据类型
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    20次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    29次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    35次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    43次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    36次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码