开发过web系统人一定对大量的curd不陌生,为了提高效率我们通常会使用一些orm框架做辅助,而不会直接操作数据库。但是现有的orm框架往往有两个通病(各种语言的都一样):1. API复杂:即使是有经验的开发人员在使用前还是需要先写出原始的SQL语句,再调用api。效率不高,排查问题也不够透明。如果使用原生SQL,通常就需要自己再写代码来处理结果集。2. 使用orm框架对数据库的操作粒度比较粗,有时候为了提高数据库的查询效率,明明一条语句能够完成的工作,通过框架会发送多条语句。这样也无形中增加了系统的负载,降低了系统的并发吞吐量。

所谓我才想能够自己做一个框架,既能够让开发人员自由编写sql,同时又保持了orm的特性,将查询的结果集自动处理成我预先定义好的格式。关键,要使用方便,无外部依赖。经过了大概半个月的尝试,我终于写出了gzero。

一、如何引入

go get gitee.com/learnhow/gzero@v0.8.1

目前的最新版本是v0.8.1,源码只有400行,做了一些简单的单元测试。后面也许会根据大家的反馈意见在这个版本的基础上进一步完善。

二、开始使用

1. 定义模型

// 定义员工结构体,内部包含一个身份证信息和登录信息
type Emp struct {
ID uint `zero:"primaryKey"`
Name string
JobNumber *string
ILogin Login `zero:"prefix:login_"`
IdCard *IdentityCard `zero:"prefix:idcard_"`
} // 登录信息
type Login struct {
ID uint
Code string
EmpFk uint
} // 身份证信息
type IdentityCard struct {
Code string
}

既然是orm就应该在我们的结构体内部体现出模型之间的关联关系,gzero通过primaryKey标识主键,在处理结果集的时候会根据主键判断,同时支持复合主键。主键字段不支持指针类型。

2. 创建连接

ctx := Open("mysql", "root:123456@tcp(127.0.0.1:13306)/helloworld?charset=utf8&parseTime=True&loc=Local", Cfg{})

gzero内部调用database/sql,Ctx不是单例对象,你可以反复调用Open方法。但是*sql.DB只会被创建一次,目前我只是做了简单处理。

3. 编写sql并安装进对象

ctx.Sql("SELECT name, job_number FROM t_emp WHERE id = 1").Install(&emp)

gzero默认结构体字段是驼峰类型,映射为表结构的蛇形字段。例如:JobNumber在数据库中对应job_number。你也可以通过“column”重新定义映射的字段名。如果多个结构体都包含同名的字段,你完全可以使用"prefix“为内部的结构体添加统一前缀(这个特点参考了gorm)。

结果示例:

三、获取多条结果集

编写sql并安装进Slice

var emps []Emp
ctx.Sql("SELECT id, name FROM t_emp").Install(&emps)

多条结果集需要使用数组或切片来接收,结果示例:

四、根据对象的层次结构处理数据

代码:

var emp []Emp
ctx.Sql("SELECT e.id, e.name, e.job_number, l.emp_fk, l.code AS login_code FROM t_emp e, t_login l WHERE e.id = l.emp_fk").Install(&emp)

查询出来的数据,gzero会根据结构体的层次对数据进行自动处理

五、根据主键自动合并数据

定义结构体:

type Dept struct {
ID uint `zero:"primaryKey"`
Name string
Emps []Emp `zero:"prefix:emp_"`
}

查询并安装数据:

var depts []Dept
ctx.Sql("SELECT d.id, d.name, e.name AS emp_name, l.code AS login_code FROM t_dept d, t_emp e, t_login l WHERE d.id = e.dept_fk AND l.emp_fk = e.id").Install(&depts)

结构体的前缀能够在sql语句中通过别名指定,查询结果如下:

六、总结

目前gzero功能非常简单,就是根据开发人员预先定义好的层次关系将查询的结果集进行处理。之后,我打算增加对象到sql生成的功能,进一步提升crud的开发效率。

轻量级orm框架——gzero指南的更多相关文章

  1. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  2. c# 轻量级ORM框架 实现(一)

    发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给 ...

  3. 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  4. 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  5. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  6. 轻量级ORM框架Dapper应用一:Dapper安装

    一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...

  7. 分享自己写的基于Dapper的轻量级ORM框架~

    1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...

  8. C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架

    Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...

  9. c# 轻量级 ORM 框架 之 Model解析 (四)

    关于orm框架设计,还有必要说的或许就是Model解析了,也是重要的一个环节,在实现上还是相对比较简单的. Model解析,主要用到的技术是反射了,即:把类的属性与表的字段做映射. 把自己的设计及实现 ...

随机推荐

  1. 通过go调用bat解决乱码核心代码

    背景:通过go写的程序调用dos命令(如dir c:),返回值往往有中文,默认会出现乱码. 解决:转码. 代码:GO package shellLib import ( "golang.or ...

  2. JAVA微信公众号网页开发——将接收的消息转发到微信自带的客服系统

    如果公众号处于开发模式,普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上,无法直接推送给微信自带的客服功能.如果需要把用户推送的普通消息推送到客服功能中,就需要进行代码 ...

  3. window串口之CreateFile打开串口号大于9返回错误ERROR_FILE_NOT_FOUND

    1. 现象 Windows上,串口存在但是打开串口号大于9的串口返回ERROR_FILE_NOT_FOUND,打开小于10的串口号却正常. 2. 解决 以10号串口为例:将错误示范COM10 改为 \ ...

  4. 【剑指Offer】从上往下打印二叉树 解题报告(Python)

    [剑指Offer]从上往下打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. 【剑指Offer】扑克牌顺子 解题报告(Python)

    [剑指Offer]扑克牌顺子 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  6. 2019HPU-ICPC-Training-1

    byl太强了,学弟们太强了-全程被吊打,嘤嘤嘤- A题  Connecting Vertices http://codeforces.com/problemset/problem/888/F 不会 B ...

  7. 51Nod 1279:扔盘子(二分||单调栈)

    1279 扔盘子 1.0 秒 131,072.0 KB 5 分 1级题 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住( ...

  8. Linq和Lambda 性能对比

    Linq和Lambda 性能对比 1.Where() 使用LINQ创建一个简单的where查询 var query = from person in PersonCollection where pe ...

  9. Wavelet Transforms

    目录 目标 小波变换 Scaling Functions Wavelet Functions 二者的联系 离散的情形 高效变换 二维的情形 示例 目标 首先, 既然是变换, 那么就是从一个域到另一个域 ...

  10. [opencv]keypoint数据结构分析

    KeyPoint这数据结构中有如下数据成员: angle:角度,表示特征点的方向,通过Lowe大神的论文可以知道,为了保证方向不变形,SIFT算法通过对特征点周围邻域进行梯度运算,求得该点方向.-1为 ...