Gdao v1.2.2: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执行》


Gdao 1.2.2 更新内容

  • 新增写过期缓存

通过 BindExpireWriteClass 或  BindExpireWriteClassWithCacheHandle 设置写过期缓存,当设置的类发生写操作时,将自动清除缓存数据 。

使用示例:

func TestExpireWrite(t *testing.T) {
	gdaoCache.BindExpireWriteClass[dao.Hstest]() //set cache for Hstest
	hs := dao.NewHstest()
	hs.Where((hs.ID.Between(0, 2)).Or(hs.ID.Between(10, 15)))
	hs.Limit(3)
	hs.Selects() //第一次查询,缓冲池没有数据,则结果集放入缓冲池
	println()
	hs = dao.NewHstest()
	hs.Where((hs.ID.Between(0, 2)).Or(hs.ID.Between(10, 15)))
	hs.Limit(3)
	hss, _ := hs.Selects() //第二次查询,缓冲池有数据,返回缓存数据
	println()
	hss[0].Insert() //新增一条数据;发生增删改操作,清除dao.Hstest类的所有缓存
	println()
	hs = dao.NewHstest()
	hs.Where((hs.ID.Between(0, 2)).Or(hs.ID.Between(10, 15)))
	hs.Limit(3)
	hs.Selects() //第三次查询,缓冲池已经清空数据,结果集重新放入缓冲池
}

结果打印与解析

=== RUN TestExpireWrite

//第一次查询,缓冲池没有数据,则结果集放入缓冲池 [SET CACHE]
[DEBUG][SELETE LIST][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]
[DEBUG][SET CACHE][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]

//第二次查询,缓冲池有数据,返回缓存数据 [GET CACHE]
[DEBUG][SELETE LIST][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]
[DEBUG][GET CACHE][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]

//新增一条数据;发生增删改操作,清除dao.Hstest类的所有缓存
[DEBUG][INSERT][insertinto hstest(updatetime,body,floa,level,id,age,rowname,value )values(?,?,?,?,?,?,?,?)][2024-06-21 00:00:00 +0800 CST [49 49 49 49 49 49] 1 22222222 1 33 111 bbbb]

//第三次查询,缓冲池已经清空数据,结果集重新放入缓冲池 [SET CACHE]
[DEBUG][SELETE LIST][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]
[DEBUG][SET CACHE][ select id,age,rowname,value,updatetime,body,floa,level from hstest where id between ? and ? or (id between ? and ?) LIMIT ? OFFSET 0 ][0 2 10 15 3]

实际项目使用示例:如 https://tlnet.top 项目,该项目使用gdao读写数据,并使用写过期缓存数据,方便数据缓存与增删改过期

设置相应的类的写过期缓存,当这些类发生增删改时,它们的缓存数据被清除

读取数据

不使用缓存,使用UseCache(false)

 

通过Gdao缓存, https://tlnet.top 的响应非常迅速,具备极高性能表现。


简单使用介绍

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

func Test_Append(t *testing.T) {
	bean := NewSqlBuilder().Append("SELECT * FROM hstest where").
		Append("id=?", 11).
		Append("and rowname<>?", "hello").SelectOne()
	logger.Debug(bean)
}

10. SqlBuilder  

func Test_AppendScan(t *testing.T) {
	var hs dao.Hstest
	NewSqlBuilder().Append("SELECT * FROM hstest where").
		Append("id=?", 11).
		Append("and rowname<>?", "hello").SelectOne().Scan(&hs)
	logger.Debug(&hs)
}

11. SqlBuilder 动态SQL

func Test_sqlBuilder_if(t *testing.T) {
 context := map[string]any{"id": 12}
 
 builder := sqlBuilder.NewSqlBuilder()
 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-09-28

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

2023-11-09

Simple Admin Go 语言分布式后台管理系统 v1.2.2 更新 项目介绍 Simple Admin 是一个开箱即用的分布式微服务后端管理系统,基于go-zero开发,为开发中大型后台提供了丰富的功能,支持三端代码生成。 官方自带多种扩展,助力中小企

2023-12-03

C++ Web框架paozhu 1.5.0版,更新http2到协程模式,属于优化部分。 上一版已经添加了支持PHP FAST-CGI,模式,支持PHP和c++混合编程, 比如一个地址是旧的php代码,另一个地址是C++代码 news/list 访问是旧的php框架代码 news/show 访问是c+

2024-03-27

定义频道可实现机器人频道,客服频道等等。   v1.2.2 更新日志: chore: upgrade slsa-verifier to 2.5.1 (升级CI工具 slsa-verifier) chore: upgrade slsa-github-generator (升级CI工具 slsa-github-generator) fix: solve the problem of empty aeskey in obtaining

2023-05-01

射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 2.0.12 版包括 SQL 缓存系统中的一个关键错误修复,该错误也向后移植到了版本 1.4.48,其中使用 hybrid_property() 结合 ORM aliased() 构造

2024-09-22

v1.3.5 支持断点续传自定义认证,路径自定义认证 v1.3.4 优化并发上传内存占用 v1.3.3 优化集群管理,支持下载域名自定定义协议 (http,https) v1.3.2 修正跨域 options 方法,断点续传无法访问 v1.3.1 发布,修复同步超时文件异常情

2023-07-07

射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 版本 2.0.18 中包括了 Core 和方言组件中的各种错误修复,以及一些与 typing 相关的修复。另一个涉及 regexp_match() 和 regexp_replace() 函数的附

2024-09-28

v1.3.5 支持断点续传自定义认证,路径自定义认证 v1.3.4 优化并发上传内存占用 v1.3.3 优化集群管理,支持下载域名自定定义协议 (http,https) v1.3.2 修正跨域 options 方法,断点续传无法访问 v1.3.1 发布,修复同步超时文件异常

2023-07-26

ger设置,避免因客户端关闭连接而丢弃数据 边缘节点:缓存条件一些无法匹配的情况在X-Cache中也增加详情,方便用户调试 管理系统:自动安装的mysql版本从8.0改为8.1 管理系统:默认自动检查版本更新 管理系统:优化缓存

2023-06-04

Paozhu C++ web框架 1.4.1 版本发布 Paozhu C++ web框架 自带c++ ORM 支持HTTP/1 HTTP/2,支持复杂结构体和JSON互换 框架提供开箱即用 admin 管理后台 这版主要是修改大并发问题,如果用户线程忙不过来,就添加用户线程,这样保持网站畅

2023-06-25

端 使用404重写 多个目录 提供一个前端演示 Paozhu C++ Web框架 原生解析HTTP/1、HTTP/2、JSON协议 集成C++ ORM 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自带json编解码不用第三方库,标准json支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅

2023-09-07

绍 酷瓜云课堂,依托腾讯云基础服务架构,采用 C 扩展框架 Phalcon 开发,致力互联网课程点播,互联网课程直播,局域网课程点播,局域网课程直播,垂直于在线教育解决方案。 系统功能 实现了点播、直播、考试、专栏、面

2022-11-15

射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 开发团队表示,对于迁移到 1.4.x 系列后内存使用量比平时大的应用程序,强烈建议升级到 1.4.44 版本;如果观察到内存使用量减少,请联