高性能数据库ORM框架 GoMybatis
- 文档
前言
学习过原生的Go链接Mysql的方法,使用Go自带的“database/sql”数据库链接api。
“github.com/go-sql-driver/mysql”mysql驱动,通过比较原生的方法去写sql和处理事务。
目前开源界也有好多封装好的Orm操作框架:
Java系(Mybatis,MybatisPlus,hibernate ...)
Go系 (xorm,gorm,gomybatis ...)
总所周知,在java/go系orm框架中,国外互联网公司程序员喜欢用hibernate/gorm(这是因为国外产品稳定,需求 清晰,代码素质普遍高),反观国内java系互联网公司则喜欢mybatis之流(需求频繁变动,水平参差不齐,sql优化方便) - 我的观点
JPA/Hibernate.Gorm之流都比较复杂,团队中要有人Hold住它,否则后期及其容易踩坑;
Mybatis框架直观,但是基本crud功能应该简化一下,毕竟重复度极高(重点:而且简化的同时可以扩展逻辑)
GoMybatis 框架介绍:
GoMybatis是一款总结了以上许多框架的优缺点的ORM框架,并且极力希望在 维护性/可读性/性能/易用性/之上做到均衡(正如go的思想一样,大道至简)
项目地址 https://github.com/zhuxiujia/GoMybatis
GoMybatis并不是一夜之间想出来的,之前阅读过Hibernate、MybatisPlus ,xorm,gorm,gobatis(需要go generate生成中间代码)还有go标准库(database/sql)的部分源码,总结经验而来。
-
GoMybatis 特性介绍: 整体基于标准库“database/sql”开发而来,干净无依赖,结构体+闭包+反射+代理实现 而不是使用go generate生成*.go等中间代码(利用反射函数闭包解决了gobatis框架免去生成代码的缺陷)
吸收mybatis plus框架乐观锁,逻辑删除功能(当然你也可以手动在sql中加入,就是比较繁琐 好处是可读性高)
实现了AST抽象语法树,能在#{}表达式中灵活使用公式
增加了模板标签,减少普通CRUD操作的重复度(mybatis框架是没有的,意味着普通增删改查也得写sql) -
gomybatis+mysql数据库使用教程:
使用教程
教程源码 https://github.com/zhuxiujia/GoMybatis/tree/master/example
设置好GoPath,用go get 命令下载GoMybatis和对应的数据库驱动
go get github.com/zhuxiujia/GoMybatis
go get github.com/go-sql-driver/mysql
实际使用mapper 定义xml内容,建议以*Mapper.xml文件存于项目目录中,在编辑xml时就可享受GoLand等IDE渲染和智能提示。生产环境可以使用statikFS把xml文件打包进程序里
var xmlBytes = []byte(`
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://raw.githubusercontent.com/zhuxiujia/GoMybatis/master/mybatis-3-mapper.dtd">
<mapper>
<select id="SelectAll">
select * from biz_activity where delete_flag=1 order by create_time desc
</select>
</mapper>
`)
import (
"fmt"
_ "github.com/go-sql-driver/mysql" //选择需要的数据库驱动导入
"github.com/zhuxiujia/GoMybatis"
)
type ExampleActivityMapperImpl struct {
SelectAll func() ([]Activity, error)
}
func main() {
var engine = GoMybatis.GoMybatisEngine{}.New()
//Mysql链接格式 用户名:密码@(数据库链接地址:端口)/数据库名称,如root:123456@(***.com:3306)/test
err := engine.Open("mysql", "*?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
var exampleActivityMapperImpl ExampleActivityMapperImpl
//加载xml实现逻辑到ExampleActivityMapperImpl
engine.WriteMapperPtr(&exampleActivityMapperImpl, xmlBytes)
//使用mapper
result, err := exampleActivityMapperImpl.SelectAll(&result)
if err != nil {
panic(err)
}
fmt.Println(result)
}
功能:模板标签CRUD 简化(必须依赖一个resultMap 标签)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://raw.githubusercontent.com/zhuxiujia/GoMybatis/master/mybatis-3-mapper.dtd">
<mapper>
<!--logic_enable 逻辑删除字段-->
<!--logic_deleted 逻辑删除已删除字段-->
<!--logic_undelete 逻辑删除 未删除字段-->
<!--version_enable 乐观锁版本字段,支持int,int8,int16,int32,int64-->
<resultMap id="BaseResultMap" tables="biz_activity">
<id column="id" property="id"/>
<result column="name" property="name" langType="string"/>
<result column="pc_link" property="pcLink" langType="string"/>
<result column="h5_link" property="h5Link" langType="string"/>
<result column="remark" property="remark" langType="string"/>
<result column="version" property="version" langType="int"
version_enable="true"/>
<result column="create_time" property="createTime" langType="time.Time"/>
<result column="delete_flag" property="deleteFlag" langType="int"
logic_enable="true"
logic_undelete="1"
logic_deleted="0"/>
</resultMap>
<!--模板标签: columns wheres sets 支持逗号,分隔表达式,*?* 为判空表达式-->
<!--插入模板:默认id="insertTemplete,test="field != null",where自动设置逻辑删除字段,支持批量插入" -->
<insertTemplete/>
<!--查询模板:默认id="selectTemplete,where自动设置逻辑删除字段-->
<selectTemplete wheres="name?name = #{name}"/>
<!--更新模板:默认id="updateTemplete,set自动设置乐观锁版本号-->
<updateTemplete sets="name?name = #{name},remark?remark=#{remark}" wheres="id?id = #{id}"/>
<!--删除模板:默认id="deleteTemplete,where自动设置逻辑删除字段-->
<deleteTemplete wheres="name?name = #{name}"/>
</mapper