Gdao v1.2.0:Go 语言高效 ORM 框架


gdao是一个全面的go持久层解决方案。主要目的在于 减少编程量,提高生产力,提高性能,支持多数据源整合操作,支持数据读写分离,制定持久层编程规范。 灵活运用 gdao,可以在持久层设计上,减少30%甚至50%以上的编程量,同时形成持久层的统一编程规范,减少持久层错误,同时易于维护和扩展。   gdao对于go语言,相当于 hibernate+ myBatis对于java语言
gdao完整地在go语言中实现 myBatis的核心功能,实现SQL与程序分离,实现强大的动态SQL功能

GitHub :  Gdao Repository

示例程序:  Gdaodemo

使用文档:  Gdaodoc

 

同类型框架性能压测 对比

性能压测数据:《Gdao—orm框架性能压测 gdao+gorm+sqlx+原生sql执行》


特点

  • 规范性:用标准化结构体统一映射表增删改查操作
  • 高效性:比直接调用驱动执行SQL的性能更高
  • 丰富动态SQL支持:在go语言上实现了myBatis 映射核心功能
  • 实用性:支持读写分离,数据缓存等高级orm功能,支持高效序列化

主要功能

  1. 生成代码:运行gdao代码生成工具,创建数据库表的标准化实体类。类似thrift/protobuf。
  2. 高效序列化:表的标准化实体类实现了高效的序列化与反序列化。性能更高,数据体积更小。
  3. 读写分离:gdao支持绑定多个备库数据源,并对绑定的表或SQL实现数据读写分离
  4. 数据缓存:gdao支持数据缓存,并支持对缓存数据时效,与数据回收等特性进行细致控制
  5. 广泛兼容性:gdao理论上支持所有实现 go 数据库驱动接口的数据库
  6. 高级特性:支持事务,存储过程,批处理等数据库操作
  7. 动态SQL:gdao实现丰富的动态SQL构建功能。支持动态SQL标签映射构建与原生SQL动态构建等多种模式。
  8. myBatis特性:Gdao的映射模块是myBatis在go上的实现。也是所知的go orm中,唯一支持SQL与程序分离的orm。

快速入门

1. 安装

go get github.com/donnie4w/gdao

2. 配置数据源

gdao.Init(mysqldb,gdao.MYSQL) //gdao初始化数据源mysqldb 为sql.DB对象 , gdao.MYSQL 为数据库类型

3. 标准化结构体操作

// 读取
hs := dao.NewHstest()
hs.Where(hs.Id.EQ(10))
h, err := hs.Select(hs.Id, hs.Value, hs.Rowname)
//[DEBUG][SELETE ONE][ select id,value,rowname from hstest where id=?][10] 
// 更新
hs := dao.NewHstest()
hs.SetRowname("hello10")
hs.Where(hs.Id.EQ(10))
hs.Update()
//[DEBUG][UPDATE][update hstest set rowname=? where id=?][hello10 10]
// 删除
hs := dao.NewHstest()
hs.Where(hs.Id.EQ(10))
hs.delete()
//[DEBUG][UPDATE][delete from hstest where id=?][10]
//新增
hs := dao.NewHstest()
hs.SetValue("hello123")
hs.SetLevel(12345)
hs.SetBody([]byte("hello"))
hs.SetRowname("hello1234")
hs.SetUpdatetime(time.Now())
hs.Insert()
//[DEBUG][INSERT][insertinto hstest(floa,age,value,level,body,rowname,updatetime )values(?,?,?,?,?)][hello123 12345 hello hello1234 2024-07-17 19:36:44]

4. 原生SQL操作

//查询,返回单条 gdao是原生SQL操作入口
gdao.ExecuteQueryBean("select id,value,rowname from hstest where id=?", 10)

//insert
gdao.ExecuteUpdate("insert into hstest2(rowname,value) values(?,?)", "helloWorld", "123456789");

//update
gdao.ExecuteUpdate("update hstest set value=? where id=1", "hello");

//delete
gdao.ExecuteUpdate("delete from hstest where id = ?", 1);

5. 配置缓存

//绑定Hstest启用缓存, 缓存默认时效为300秒, gdaoCache为缓存操作入口
gdaoCache.BindClass[dao.Hstest]()

6. 读写分离

mysqldb := getDataSource("mysql.json") // 获取备库数据源:mysqldb
gdaoSlave.BindClass[dao.Hstest](mysqldb, gdao.MYSQL) //这里主数据库为sqlite,备数据库为mysql,Hstest读取数据源为mysql, gdaoSlave为读写分离操作入口

7. SQL映射

<!-- MyBatis 风格的 XML 配置文件 -->
<mapper namespace="user">
 <select id="selectHstest1" parameterType="int64" resultType="hstest1">
SELECT * FROM hstest1order by id desc limit #{limit}
 </select>
</mapper>
//读取解析xml配置
hs1, _ := gdaoMapper.Select[dao.Hstest1]("user.selectHstest1", 1)
fmt.Println(hs1)

8. 动态SQL映射

<!-- where if -->
<select id="demo1" resultType="Hstest">
SELECT * FROM hstest
<where>
<if test="rowname== 'hello'">
and rowname = #{rowname}
</if>
<if test="id >0">
AND id = #{id}
</if>
</where>
</select>
	hs := dao.NewHstest()
	hs.SetId(12)
	gdaoMapper.SelectBean("dynamic.demo1", hs)//执行映射id[SELECT * FROM hstest WHERE id = ?]ARGS[12]

9. SqlBuilder 动态SQL

func Test_sqlBuilder_if(t *testing.T) {
 context := map[string]any{"id": 12}
 
 builder := &SqlBuilder{}
 builder.Append("SELECT * FROM hstest where 1=1").
 AppendIf("id>0", context, "and id=?", context["id"])//动态SQL,当id>0时,动态添加 and id=?
 
 bean := builder.SelectOne()//查询SQL: SELECT * FROM hstest where 1=1 and id=?[ARGS][12]
 logger.Debug(bean)
}

相關推薦

2024-08-07

,减少持久层错误,同时易于维护和扩展。 gdao对于go语言,相当于 hibernate + mybatis  对于java语言,gdao框架融合了Hibernate的抽象性和MyBatis的灵活性,并解决了它们各自在ORM框架上长久以来使用上的痛点。关于 hibernate与m

2024-10-24

少持久层错误,同时易于维护和扩展。   gdao对于go语言,相当于 hibernate+ myBatis对于java语言 gdao完整地在go语言中实现 myBatis的核心功能,实现SQL与程序分离,实现强大的动态SQL功能 GitHub :  Gdao Repository 示例程序:&n

2023-09-17

Wood v1.2.0 已经发布,微型 ORM 框架。 此版本更新内容包括: 增加代码生成接口(selectAsCmd, insertAsCmd, updateAsCmd, deleteAsCmd) 调整 ICacheService 接口(增加类型化 get) redisx 升为 1.2.0 详情查看:https://gitee.com/noear/wood/releases/v1

2023-03-07

单和权限节点; 2、性能优化和底层架构调优; 一款 Go 语言基于 GoFrame、Vue、AntDesign、MySQL 等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可快速搭建前后端分离后台管理系统,本着简化开发

2024-04-18

go-oam v1.2.0 已经发布,运维资产管理系统 此版本更新内容包括: 1.fix bugs 2.根据操作系统和使用的数据库不同编译了4个版本文件,使用sqlite解压即可用,使用mysql需修改配置文件中的数据库信息 完整的更新日志: https://gitee.com/

2022-10-17

高性能地访问数据库,并被适配为一种简单的 Pythonic 域语言。 SQLAlchemy 1.4.42 现已发布。此版本包含了各种错误修复,主要是在 ORM 相关用例领域。还添加了两个新的与 ORM 相关的配置警告,指出在某些情况下使用不正确的 mapping

2024-03-28

冲突; 添加了数十个Dioxus组件。 Zino 致力于打造 Rust 语言中最好用的企业级应用开发框架。 我们奉行『约定优于配置』的原则,借鉴 Node 的 Egg.js、Go 的 GoFrame、 Java 的 Spring Boot 等框架,提供开箱即用的功能模块,极大提升

2023-09-22

技术都能四世同堂,凭什么开发 30 岁就要被干掉? V 语言终于有 lambdas 了。 V 是一个集合了 Go 的简单和 Rust 的安全特性的静态语言,作者表示 V 与 Go 非常相似,如果你了解 Go,那么就已经了解 80% 的 V。V 在 Go 的基础

2024-02-07

A-Tune v1.2.0 已经发布,系统性能自优化软件 此版本更新内容包括: 更新内容 删除多余的benchmark结果记录文件 由 @ZhouPengcheng 贡献 https://gitee.com/openeuler/A-Tune/pulls/579 增加日志调试信息,与上下文保持一致 由 @Caohongtao 贡献 ht

2022-08-10

高性能地访问数据库,并被适配为一种简单的 Pythonic 域语言。 SQLAlchemy 1.4.40 版本的更新内容如下: orm [orm] [bug] 修正了在多态 SELECT 中多次引用 CTE 的问题,该问题可能导致同一 CTE 的多个 "克隆" 被构建,然后将这两个 CTE

2024-09-22

再重定向,简化 nginx 配置,可重复文件同步 bug 修复 v1.2.0 增加后台启动脚本,支持后台运行 v1.1.9 增加文件自动迁移功能,增加文件可重复选项 v1.1.8 统一删除接口,优化内存占用,优化文件同步 v1.1.7 增加单元测试,为 go-fa

2024-09-28

再重定向,简化 nginx 配置,可重复文件同步 bug 修复 v1.2.0 增加后台启动脚本,支持后台运行 v1.1.9 增加文件自动迁移功能,增加文件可重复选项 v1.1.8 统一删除接口,优化内存占用,优化文件同步 v1.1.7 增加单元测试,为 g

2024-10-17

、支持拖动调整大小...  代码:行内代码、代码块、语言类型选择、AI 自动注释、AI 代码解释...  表格:左增右增、左减右减、上增下增、上减下减、合并单元格、解除合并  Markdown:标题、引用、表格、图片、代

2023-09-17

Zino致力于打造基于Rust语言的新一代组装式应用开发框架,提供一站式跨平台多端解决方案,可用于后端API开发、桌面应用开发(计划中还将支持Web端、移动APP)。我们奉行『约定优于配置』的原则,借鉴Node的Egg.js、Go的GoFrame