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][insert into 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][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
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) }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
🔥※【mybatis-mp】一款真正 / 你错过的好用的 ORM 框架:1.7.2-RC 发布!
官网 :https://mybatis-mp.cn 更新: 1:InsertChain,UpdateChain 增加 null 值为 SQL NULL 处理 int cnt = UpdateChain.of(sysUserMapper) .set(SysUser::getUserName, null, true) .eq(SysUser::getId, 1) .execute(); InsertChain.of(mapper) .insert(SysUser.class) .field(SysUser::getValue1, SysUser::getValue2, SysUser::getValue4, SysUser::getCreateTime) .values(Arrays.asList("a", 1, null, LocalDateTime.now()), true) .values(Arrays.asList("a", 2, 1, LocalDateTime.now())) .execute(); 2:修复windows下代码生成器因文件分隔符异常问题...
- 下一篇
🎁Xinference v0.16.0 正式发布!注册即送 500 积分,畅享云上推理新体验🎉
Xorbits Inference(Xinference)是一个 性能强大且功能全面的 分布式 推理框架。可用于大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。通过 Xorbits Inference,你可以轻松地 一键部署你自己的模型或内置的前沿开源模型 - https://github.com/xorbitsai/inference。无论你是研究者,开发者,或是数据科学家,都可以通过 Xorbits Inference 与最前沿的 AI 模型,发掘更多可能。 Xinference 的功能和亮点有: * 🌟 模型推理,轻而易举:大语言模型,语音识别模型,多模态模型的部署流程被大大简化。一个命令即可完成模型的部署工作。 * ⚡️ 前沿模型,应有尽有:框架内置众多中英文的前沿大语言模型,包括 baichuan,chatglm2 等,一键即可体验!内置模型列表还在快速更新中! * 🖥 异构硬件,快如闪电:通过 ggml,同时使用你的 GPU 与 CPU 进行推理,降低延迟,提高吞吐! * ⚙️ 接口调用,灵活多样:提供多种使用模型的接口,包括 OpenAI 兼容的 R...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境