zorm  - golang 轻量级 ORM

hunks 2020-03-09 11:36:29

golang 轻量级 ORM,readygo 子项目。

  • 基于原生 sql 语句编写,是 springrain 的精简和优化,自带代码生成器
  • 代码简单,总计 2000 行左右,注释详细,方便定制修改
  • 支持事务传播,这是 zorm 诞生的主要原因
go get gitee.com/chunanyong/zorm 

生产使用参考 UserStructService.go

示例

  1. 生成实体类或手动编写,建议使用代码生成器 https://gitee.com/chunanyong/readygo/tree/master/codeGenerator
//UserOrgStructTableName 表名常量,方便直接调用
const UserOrgStructTableName = "t_user_org"

// UserOrgStruct 用户部门中间表
type UserOrgStruct struct {
  //引入默认的struct,隔离IEntityStruct的方法改动
  zorm.EntityStruct

  //Id 编号
  Id string `column:"id"`

  //UserId 用户编号
  UserId string `column:"userId"`

  //OrgId 机构编号
  OrgId string `column:"orgId"`

  //ManagerType 0会员,1员工,2主管
  ManagerType int `column:"managerType"`

  //------------------数据库字段结束,自定义字段写在下面---------------//

}

//GetTableName 获取表名称
func (entity *UserOrgStruct) GetTableName() string {
  return UserOrgStructTableName
}

//GetPKColumnName 获取数据库表的主键字段名称.因为要兼容Map,只能是数据库的字段名称.
func (entity *UserOrgStruct) GetPKColumnName() string {
  return "id"
}
  1. 初始化zorm

    dataSourceConfig := zorm.DataSourceConfig{
    Host:     "127.0.0.1",
    Port:     3306,
    DBName:   "readygo",
    UserName: "root",
    PassWord: "root",
    DBType:   "mysql",
     }
     zorm.NewBaseDao(&dataSourceConfig)
  2. var user permstruct.UserStruct
    err := zorm.SaveStruct(nil, &user)
  3. err := zorm.DeleteStruct(nil,&user)
  4. err := zorm.UpdateStruct(nil,&user)
    //finder更新
    err := zorm.UpdateFinder(nil,finder)
  5. finder := zorm.NewSelectFinder(permstruct.UserStructTableName)
    page := zorm.NewPage()
    var users = make([]permstruct.UserStruct, 0)
    err := zorm.QueryStructList(nil, finder, &users, &page)
  6. 事务传播

    //匿名函数return的error如果不为nil,事务就会回滚
    _, errSaveUserStruct := zorm.Transaction(dbConnection, func(dbConnection *zorm.DBConnection) (interface{}, error) {
    
    	//事务下的业务代码开始
    	errSaveUserStruct := zorm.SaveStruct(dbConnection, userStruct)
    
    	if errSaveUserStruct != nil {
    		return nil, errSaveUserStruct
    	}
    
    	return nil, nil
    	//事务下的业务代码结束
    
    })
  7. 生产示例

    //FindUserOrgByUserId 根据userId查找部门UserOrg中间表对象
    func FindUserOrgByUserId(dbConnection *zorm.DBConnection, userId string, page *zorm.Page) ([]permstruct.UserOrgStruct, error) {
    if len(userId) < 1 {
    	return nil, errors.New("userId不能为空")
    }
    finder := zorm.NewFinder().Append("SELECT re.* FROM  ").Append(permstruct.UserOrgStructTableName).Append(" re ")
    finder.Append("   WHERE re.userId=?    order by re.managerType desc   ", userId)
    
    userOrgs := make([]permstruct.UserOrgStruct, 0)
    errQueryList := zorm.QueryStructList(dbConnection, finder, &userOrgs, page)
    if errQueryList != nil {
    	return nil, errQueryList
    }
    
    return userOrgs, nil
    }
  8. 测试

    //函数测试
    go test -run TestAdd2
    //性能测试
    go test -bench=.
    go test -v -bench=. -cpu=8 -benchtime="3s" -timeout="5s" -benchmem
 
    公告

    《从零开始开发BBS》课程上线啦,快来跟着我一步步搭建属于你的BBS吧。

    课程地址:https://www.shiyanlou.com/courses/1436
    9折优惠邀请码: ZHwfIjb1

    该课程会带领大家一步步的了解并熟悉Go语言开发,如果你是一个Go语言初学者,或者正准备学习Go语言,那么这个课程非常适合你。如果你熟练掌握了本课程中的知识点,相信你就已经入门Go语言开发,并能胜任日常的开发工作了。