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

embedded/2025/1/11 10:52:51/
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][insert  into 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 hstest1  order 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)
}


http://www.ppmy.cn/embedded/120118.html

相关文章

Spring Boot的核心技术有哪些?

文章目录 前言1. 自动配置(Auto-configuration)2. 起步依赖(Starter Dependencies)3. 嵌入式服务器(Embedded Servers)4. Actuator5. 外部化配置(Externalized Configuration)6. 微服务支持7. 安全性8. 数据访问与集成9. 测试支持10. 异步处理总结前言 Spring Boot的核…

MYSQL-约束

1-limit语句 limit的作用是限制查询记录的条数 格式如下 select * from 表名 limit offset, row_count; 举例 select * from table limit 1, 4; 这里的1指的是从第二行数据开始&#xff0c;1就是索引&#xff08;索引从0开始&#xff09;&#xff0c;4指的是查询记录条数&…

计算机网络(第二章 物理层)

文章目录 1.物理层的基本概念2.数据通信的基础知识2.1数据通信系统模型2.2有关信道的基本概念2.3信道极限容量 3.物理层3.2引导性传输媒体3.3非引导性传输媒体 4.信道复用技术4.1频分复用、时分复用和统计时分复用4.2波分复用 5.宽带接入技术 本文首先讨论物理层的基本概念。然…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大&#xff0c;越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力&#xff0c;进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言&#xff0c;在众多问题中&#xff0c;属本地生活服务项…

极速 JavaScript 打包器:esbuild

文章目录 前言什么是esbuild&#xff1f;esbuild如何实现如此出色的性能&#xff1f;基本配置入口文件输出文件模块格式targetplatformexternalbanner和footer 结论 前言 esbuild是一个快速、可扩展的JavaScript打包器和压缩器&#xff0c;它的目标是成为最快的打包器。它使用…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词&#xff1a;h5离线包加载、h5离线包更新、沙箱 在上一篇文章中&#xff0c;我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下&#xff0c;那么该篇文章将介绍如何加载该沙箱目录下的文件资源&#xff08;此处以打包后的web资源为例&#xff09;&#xf…

[leetcode刷题]面试经典150题之8同构字符串(简单)

这个题虽然是简单题&#xff0c;但是看了半天还是没啥好思路&#xff0c;最后看了解题学到了不少知识点 1.index() 函数查找序列中首次出现的元素索引 2.zip函数&#xff1a;用于将可迭代的对象&#xff08;如列表、元组、字典等&#xff09;作为参数&#xff0c;将对象中对应…