golang生成dao代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang生成dao代码相关的知识,希望对你有一定的参考价值。

golang服务端项⽬代码⾃动⽣成

公司为了提⾼开发效率,让我搞⼀个代码⾃动⽣成的⼯具,最好是根据数据库可以⽣成全套的(从router到dao)那种,于是我上万能的github上找了⼀个,找到⼀款autocreate 的代码⽣成⼯具,本⾝也是使⽤go开发的,我看了⼀下,效果还不错,并且操作⽅便简洁,⽽且还有web界⾯,clone下来之后,为了让⽣成的代码风格跟我们的项⽬保持⼀致,所以我不得不动源码,原本以为很难,但是百度了⼀下原理就是根据模板渲染。

这些就是项⽬中的模板,包括从model-router-controller-service-dao,当然这些是已经根据公司项⽬修改过的模板,开始只有⼀个controller跟dao以及model,其余的根据⾃⼰需求加就可以了,因为我想要极致的偷懒,所以直接⽣成了全套的。

第 1 页
操作这些模板的就是这个⽂件

⽂件⾥的核⼼代码,当然这也是修改过的

第 2 页
据我使⽤后得知,⾥⾯所谓的三个关键的名字只有table和module有⽤,另⼀个随便填就可以了。

修改之后,在将⽂件的⽣成⽬录修改为你项⽬的⽬录就可以了。控制⽣成⽂件⽬录的是*ContertFile⾥⾯的file变量。

全部修改后,我们就可以go run main.go运⾏起来,进⼊localhost:8081,就可以看到如下界⾯

选择其中⼀个表,就可以进⾏代码⾃动⽣成了!记住,表⼀定要有备注!表⼀定要有备注!表⼀定要有备注!不然是⽣成不了代码的。

第 3 页
这是⽣成的controller中的⼀个例⼦

⽣成之后,service中是没有逻辑的,只需要根据⾃⼰的需求增增改改就好啦,将原来的开发时间缩短了⼀半以上!再也不⽤做那些枯燥的事情!开发从建表-复制粘贴*n-增增改改-⾃测变成了建表-点⼀下-增增改改-⾃测

现在公司所有服务端的⼩伙伴都开始⽤了,我作为⼀个实习⽣,能做好这件事,其实⼼⾥的成就感也是很⼤的haha
参考技术A Go语言没有提供直接生成DAO代码的功能,但是可以使用第三方库来实现这一功能。例如,可以使用Go-ORM库来生成DAO代码,它可以根据数据库表结构自动生成相应的DAO代码,从而节省开发时间。另外,还可以使用Go-Codegen库来生成DAO代码,它可以根据模板文件自动生成DAO代码,从而让开发者更加方便地实现DAO代码的生成。

jOOQ 自定义 Pojo 和 DAO 生成

【中文标题】jOOQ 自定义 Pojo 和 DAO 生成【英文标题】:jOOQ Custom Pojo & DAO Generation 【发布时间】:2018-09-04 22:13:45 【问题描述】:

问题

在代码生成过程中,我在配置到自定义 Pojo 的映射时遇到了一些问题。

问题

我已经实现了RecordMapperProvider,但我想知道如何注册它以在代码生成阶段使用,或者即使可以这样做?

更多上下文

我喜欢生成 Pojo 和 DAO 的事实,但我想自己定义 Pojo,而不需要太多配置代码。我正在使用ModelMapper 从类型映射到目标:

@Override
public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType,
                                                        Class<? extends E> type) 

    if (mapping.containsKey(type)) 
        return record -> modelMapper.map(mapping.get(type), type);
    

    return new DefaultRecordMapper<>(recordType, type);

如果有帮助,我将使用 DefaultConfiguration 对象(它是一个 bean)来配置 jOOQ:

@Bean
public DefaultConfiguration configuration() 
    DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
    jooqConfiguration.setConnectionProvider(dataSourceConnectionProvider());
    jooqConfiguration.setExecuteListenerProvider(new DefaultExecuteListenerProvider(
            jooqToSpringExceptionTranslator()));
    jooqConfiguration.setSQLDialect(
            SQLDialect.valueOf(env.getRequiredProperty("jooq.sql.dialect")));
    jooqConfiguration.setRecordMapperProvider(new JooqRecordMapperFactory(modelMapper()));

    return jooqConfiguration;

然后对于代码生成,我在 gradle 中对其进行配置:

jooq 
version = '3.10.5'
edition = 'OSS'

myDb(sourceSets.getByName("main")) 
    jdbc 
        driver = dbDriver
        url = dbUrl
        user = dbUsername
    
    generator 
        name = 'org.jooq.util.JavaGenerator'
        strategy 
            name = 'org.jooq.util.DefaultGeneratorStrategy'
        
        database 
            name = 'org.jooq.util.postgres.PostgresDatabase'
            inputSchema = dbSchema
        
        generate 
            relations = true
            deprecated = false
            records = true
            immutablePojos = true
            fluentSetters = true
            daos = true
        
        target 
            packageName = 'com.textiq.quinn.common.dao.model.generated'
        
    


我确信这两种配置之间存在脱节,但我无法从文档中收集到我是如何同步这些配置的。理想情况下,我希望 jOOQ 生成 Pojos(基于 ModelMapper 在我的 RecordMapperProvider 实现中提供的映射)并且还让 jOOQ 为这些 Pojos 提供 DAO。这可能吗?文档指出:

如果您使用 jOOQ 的代码生成器,您可以将其配置为为您生成 POJO,但您不需要使用这些生成的 POJO。你可以使用你自己的。请参阅手册中关于带有自定义 RecordMappers 的 POJO 的部分,以了解如何修改 jOOQ 的标准 POJO 映射行为。

来源:https://www.jooq.org/doc/3.9/manual/sql-execution/fetching/pojos/

这对我来说表明了这种可能性,但只会让我实现RecordMapperProvider,之后什么都没有。

【问题讨论】:

【参考方案1】:

我已经实现了 RecordMapperProvider,但想知道如何注册它以在代码生成阶段使用,或者即使可以这样?

不,这是不可能的,开箱即用。

我喜欢 Pojos 和 DAO 生成的事实,但我想自己定义 Pojo 而无需太多配置代码

然后,我建议关闭 POJO 和 DAO 的生成并自己滚动。要么创建 DAO 的手动实现,要么扩展 JavaGenerator 以执行此操作。

【讨论】:

【参考方案2】:

我迟到了几年,但实际上我找到了一个非常简单的方法来做到这一点。我承认它有点脆弱,但您可以进一步完善它以满足您的需求。

    在您的 gradle 项目中创建一个新模块,例如名为 jooq-generator 将 jooq-codegen 作为 compileOnly 依赖添加到模块 在模块中新建一个类:
public class Generator extends JavaGenerator 
    @Override
    public boolean generatePojos() 
        return false;
    

    在模块中新建一个类:

public class MyGeneratorStrategy extends DefaultGeneratorStrategy 
   @Override
   public String getJavaPackageName(Definition definition, Mode mode) 
       if (mode != Mode.POJO) 
           return super.getJavaPackageName(definition, mode);
       
       return "com.example.my.model.package.prefix";
   


    将模块作为依赖添加到 jooqGenerator jooqGenerator project(":jooq-generator") 将新类添加到 jooq 配置中
jooq 
    configurations 
        main 
            generationTool 
                generator 
                    name = 'com.example.my.package.name.Generator'
                    strategy 
                        name = 'com.example.my.package.name.MyGeneratorStrategy'
                    
                
            
        
    

    现在将使用 POJO 的包前缀而不是生成的包名称来生成 daos。

【讨论】:

以上是关于golang生成dao代码的主要内容,如果未能解决你的问题,请参考以下文章

Golang操作MongoDB DAO - 增删改查

[golang]反射的用处--代码自动生成

[goa]golang微服务框架学习-- 代码自动生成

golang生成JSON及解析JSON

Golang xorm工具,根据数据库自动生成 go 代码

golang连续生成随机数