- 中文
- English
使用教程请仔细阅读文档网站 https://zhuxiujia.github.io/gomybatis.io/info.html
- 高性能,单机每秒事务数最高可达456621Tps/s,总耗时0.22s (测试环境 返回模拟的sql数据,并发1000,总数100000,6核16GB win10)
- 事务,session灵活插拔,兼容过渡期微服务
- 异步日志异步消息队列日,框架内sql日志使用带缓存的channel实现 消息队列异步记录日志
- 动态SQL,在xml中
<select>,<update>,<insert>,<delete>,<trim>,<if>,<set>,<where>,<foreach>,<resultMap>,<bind>,<choose><when><otherwise>,<sql><include>
等等java框架Mybatis包含的15种实用功能 - 多数据库Mysql,Postgres,Tidb,SQLite,Oracle....等等更多
- 无依赖基于反射动态代理,无需go generate生成*.go等中间代码,xml读取后可直接调用函数
- 智能表达式
#{foo.Bar}``#{arg+1}``#{arg*1}``#{arg/1}``#{arg-1}
不但可以处理简单判断和计算任务,同时在取值时 假如foo.Bar 这个属性是指针,那么调用 foo.Bar 则取实际值,避免解引用操作,单个参数为结构体时默认展开它的属性,免去重复写a.b.c的深度取值 - 动态数据源可以使用路由engine.SetDataSourceRouter自定义多数据源规则
- 模板标签(核心优势-兼顾开发效率/扩展性)一行代码实现增删改查,逻辑删除,乐观锁(基于版本号更新)极大减轻CRUD操作的心智负担。除此之外,模板标签body体可以插入任意xml逻辑非常高的扩展性(和传统Orm框架最大区别,编写动态sql的同时代码行数骤减)
- 乐观锁
<updateTemplete>
支持通过修改版本号实现的乐观锁 - 逻辑删除
<insertTemplete>``<updateTemplete>``<deleteTemplete>``<selectTemplete>
均支持逻辑删除 - 8种事务传播行为复刻Spring MVC的事务传播行为功能
- 定制easyrpc 基于rpc/jsonrpc让服务完美支持RPC(减少参数限制),动态代理,事务订阅,易于微服务集成和扩展 详情请点击链接https://github.com/zhuxiujia/easyrpc
示例源码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
import (
_ "github.com/go-sql-driver/mysql" //导入mysql驱动
"GoMybatis"
"fmt"
"time"
)
//定义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 namespace="ActivityMapperImpl">
<!--SelectAll(result *[]Activity)error-->
<select id="selectAll">
select * from biz_activity where delete_flag=1 order by create_time desc
</select>
</mapper>
`)
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)
}
//添加第二个mysql数据库,请把MysqlUri改成你的第二个数据源链接
GoMybatis.Open("mysql", MysqlUri)
//动态数据源路由
var router = GoMybatis.GoMybatisDataSourceRouter{}.New(func(mapperName string) *string {
//根据包名路由指向数据源
if strings.Contains(mapperName, "example.") {
var url = MysqlUri//第二个mysql数据库,请把MysqlUri改成你的第二个数据源链接
fmt.Println(url)
return &url
}
return nil
})
engine.SetLogEnable(true)
engine.SetLog(&GoMybatis.LogStandard{
PrintlnFunc: func(messages []byte) {
},
})
//传统数据库
Mysql: github.com/go-sql-driver/mysql
MyMysql: github.com/ziutek/mymysql/godrv
Postgres: github.com/lib/pq
SQLite: github.com/mattn/go-sqlite3
MsSql: github.com/denisenkom/go-mssqldb
MsSql: github.com/lunny/godbc
Oracle: github.com/mattn/go-oci8
//分布式NewSql数据库
Tidb: github.com/pingcap/tidb
CockroachDB(也是Postgres驱动): github.com/lib/pq
事务类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 表示如果当前事务存在,则支持当前事务。否则,会启动一个新的事务。默认事务类型。 |
PROPAGATION_SUPPORTS | 表示如果当前事务存在,则支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 表示如果当前事务存在,则支持当前事务,如果当前没有事务,则返回事务嵌套错误。 |
PROPAGATION_REQUIRES_NEW | 表示新建一个全新Session开启一个全新事务,如果当前存在事务,则把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 表示以非事务方式执行操作,如果当前存在事务,则新建一个Session以非事务方式执行操作,把当前事务挂起。 |
PROPAGATION_NEVER | 表示以非事务方式执行操作,如果当前存在事务,则返回事务嵌套错误。 |
PROPAGATION_NESTED | 表示如果当前事务存在,则在嵌套事务内执行,如嵌套事务回滚,则只会在嵌套事务内回滚,不会影响当前事务。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 |
PROPAGATION_NOT_REQUIRED | 表示如果当前没有事务,就新建一个事务,否则返回错误。 |
//嵌套事务的服务
type TestService struct {
exampleActivityMapper *ExampleActivityMapper //服务包含一个mapper操作数据库,类似java spring mvc
UpdateName func(id string, name string) error `tx:"" rollback:"error"`
UpdateRemark func(id string, remark string) error `tx:"" rollback:"error"`
}
func main() {
var testService TestService
testService = TestService{
exampleActivityMapper: &exampleActivityMapper,
UpdateRemark: func(id string, remark string) error {
testService.exampleActivityMapper.SelectByIds([]string{id})
panic(errors.New("业务异常")) // panic 触发事务回滚策略
return nil // rollback:"error"指定了返回error类型 且不为nil 就会触发事务回滚策略
},
UpdateName: func(id string, name string) error {
testService.exampleActivityMapper.SelectByIds([]string{id})
return nil
},
}
GoMybatis.AopProxyService(&testService, &engine)//必须使用AOP代理服务的func
testService.UpdateRemark("1","remark")
}
//step1 定义你的数据库模型,必须包含 json注解(默认为数据库字段), gm:""注解指定 值是否为 id,version乐观锁,logic逻辑软删除
type UserAddress struct {
Id string `json:"id" gm:"id"`
UserId string `json:"user_id"`
RealName string `json:"real_name"`
Phone string `json:"phone"`
AddressDetail string `json:"address_detail"`
Version int `json:"version" gm:"version"`
CreateTime time.Time `json:"create_time"`
DeleteFlag int `json:"delete_flag" gm:"logic"`
}
//第二步,在你项目main 目录下建立一个 XmlCreateTool.go 内容如下
func main() {
var bean = UserAddress{} //此处只是举例,应该替换为你自己的数据库模型
GoMybatis.OutPutXml(reflect.TypeOf(bean).Name()+"Mapper.xml", GoMybatis.CreateXml("biz_"+GoMybatis.StructToSnakeString(bean), bean))
}
//第三步,执行命令,在当前目录下得到 UserAddressMapper.xml文件
go run XmlCreateTool.go
//以下是自动生成的xml文件内容
<?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_user_address">
<id column="id" property="id"/>
<result column="id" property="id" langType="string" />
<result column="user_id" property="user_id" langType="string" />
<result column="real_name" property="real_name" langType="string" />
<result column="phone" property="phone" langType="string" />
<result column="address_detail" property="address_detail" langType="string" />
<result column="version" property="version" langType="int" version_enable="true" />
<result column="create_time" property="create_time" langType="Time" />
<result column="delete_flag" property="delete_flag" langType="int" logic_enable="true" logic_undelete="1" logic_deleted="0" />
</resultMap>
</mapper>
- https://github.com/zhuxiujia/easy_mvc //mvc,极大简化开发流程
- https://github.com/zhuxiujia/easyrpc //easyrpc(基于标准库的RPC)吸收GoMybatis的概念,类似标准库的api,定义服务没有标准库的要求那么严格(可选不传参数,或者只有一个参数,只有一个返回值)
- https://github.com/zhuxiujia/easyrpc_discovery //基于easyrpc定制微服务发现,支持动态代理,支持GoMybatis事务,AOP代理,事务嵌套,tag定义事务,自带负载均衡算法(随机,加权轮询,源地址哈希法)