All Projects → runner-mei → GoBatis

runner-mei / GoBatis

Licence: other
An easy ORM tool for Golang, support MyBatis-Like XML template SQL

Programming Languages

go
31211 projects - #10 most used programming language

Projects that are alternatives of or similar to GoBatis

Neo
Orm框架:基于ActiveRecord思想开发的至简化的java的Orm框架
Stars: ✭ 35 (-69.03%)
Mutual labels:  mybatis, orm-framework
jdbcTemplatePlus
基于SpringJdbcTemplate的ORM框架,比Mybatis更方便,更简单,仅需定义Model就可支持各种SQL查询和动态SQL,不再用拼写XML文件和SQL语句,可以通过各种注解式插件扩展,目前主要支持Mysql数据库
Stars: ✭ 25 (-77.88%)
Mutual labels:  mybatis, orm-framework
Mybatis Plus
An powerful enhanced toolkit of MyBatis for simplify development
Stars: ✭ 12,132 (+10636.28%)
Mutual labels:  mybatis, orm-framework
Ssm
Spring + Spring MVC + Mybatis 构建的简易论坛
Stars: ✭ 209 (+84.96%)
Mutual labels:  mybatis
Flink Boot
懒松鼠Flink-Boot 脚手架让Flink全面拥抱Spring生态体系,使得开发者可以以Java WEB开发模式开发出分布式运行的流处理程序,懒松鼠让跨界变得更加简单。懒松鼠旨在让开发者以更底上手成本(不需要理解分布式计算的理论知识和Flink框架的细节)便可以快速编写业务代码实现。为了进一步提升开发者使用懒松鼠脚手架开发大型项目的敏捷的度,该脚手架默认集成Spring框架进行Bean管理,同时将微服务以及WEB开发领域中经常用到的框架集成进来,进一步提升开发速度。比如集成Mybatis ORM框架,Hibernate Validator校验框架,Spring Retry重试框架等,具体见下面的脚手架特性。
Stars: ✭ 209 (+84.96%)
Mutual labels:  mybatis
Spring Dubbo Service
微服务 spring dubbo项目:dubbo rpc;druid数据源连接池;mybatis配置集成,多数据源;jmx监控MBean;定时任务;aop;ftp;测试;Metrics监控;参数验证;跨域处理;shiro权限控制;consul服务注册,发现;redis分布式锁;SPI服务机制;cat监控;netty服务代理;websocket;disconf;mongodb集成;rest;docker;fescar
Stars: ✭ 224 (+98.23%)
Mutual labels:  mybatis
Mybatis 3
MyBatis SQL mapper framework for Java
Stars: ✭ 16,617 (+14605.31%)
Mutual labels:  mybatis
Spring Boot Seed
SpringBoot骨架项目,集成SpringBoot、Mybatis、Druid、Mapper、PageHelper、Redis、Shiro、Swagger2、Log4j2等技术
Stars: ✭ 204 (+80.53%)
Mutual labels:  mybatis
Sqlhelper
SQL Tools ( Dialect, Pagination, DDL dump, UrlParser, SqlStatementParser, WallFilter, BatchExecutor for Test) based Java. it is easy to integration into any ORM frameworks
Stars: ✭ 242 (+114.16%)
Mutual labels:  mybatis
Layim
基于HTML5 WebSocket的一款IM即时通讯软件,使用Gradle集成了Scala、SpringBoot、Spring MVC、Mybatis、Redis等,前端使用了LayIm框架
Stars: ✭ 218 (+92.92%)
Mutual labels:  mybatis
Dynamic Datasource Spring Boot Starter
dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
Stars: ✭ 3,112 (+2653.98%)
Mutual labels:  mybatis
Xmall
一套完整的社群电商系统,后端Api、后台管理系统、前台h5系统、小程序和App
Stars: ✭ 214 (+89.38%)
Mutual labels:  mybatis
Springboot Learning Example
spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。
Stars: ✭ 14,640 (+12855.75%)
Mutual labels:  mybatis
Java Persistence Frameworks Comparison
Comparison of non-JPA SQL mapping frameworks for Java (Jooq, Spring JDBCTemplate, MyBatis, EBean, JDBI, Speedment, sql2o)
Stars: ✭ 213 (+88.5%)
Mutual labels:  mybatis
Spring Cloud Shop
spring cloud 版分布式电商项目,全力打造顶级多模块,高可用,高扩展电商项目
Stars: ✭ 248 (+119.47%)
Mutual labels:  mybatis
Spring Data Mybatis
Simplifies the development of creating a MyBatis-based data access layer.
Stars: ✭ 206 (+82.3%)
Mutual labels:  mybatis
Shop
SSM 框架搭建的网上游戏商城(仿Steam)
Stars: ✭ 238 (+110.62%)
Mutual labels:  mybatis
Archery
SQL 审核查询平台
Stars: ✭ 3,279 (+2801.77%)
Mutual labels:  mybatis
Springboot Examples
spring boot 实践系列
Stars: ✭ 216 (+91.15%)
Mutual labels:  mybatis
Bookshop
📖 基于 SSM 框架的二手书交易系统
Stars: ✭ 223 (+97.35%)
Mutual labels:  mybatis

GoBatis

GoDoc Travis Build Status GitHub Actions GitHub tag (latest SemVer) Coverage Status Appveyor Build status

中文文档

Introduction

An easy ORM tool for Golang, support MyBatis-Like XML template SQL

待完成的任务

  1. 对象继承的实现

  2. 延迟加载或加密字段(或特殊处理)的实现 有泛型了,可以尝试下

    type Lazy[T any] struct {
       value T
       session SqlSession
       sqlstr string
    }
    func (l *Lazy[T]) Read() T {
        session.Query()
    }
    
    // 加密字段(或特殊处理)
    type Passworder struct {
       value string
    }
    func (p *Passworder) Scan(interface{}) error {
        xxxxx
    }
    func (p *Passworder) Value() driver.Value {
        xxxxx
    }
    
    
    type Record struct {
    TableName struct{}    `db:records`
    Blob   Lazy[[]byte]   `db:"blob"`
    Password Passworder   `db:"password"`
    }
  3. 返回大量数据记录时用泛型来改进

    type Results[T any] struct  {}
    func (rs *Results) Next() bool {}
    func (rs *Results) Read(value *T) error {}

已知 bug

  1. 当 sql 中含有 xml 标签时 < 号需要转义为 &lt; ,而不含 xml 标签时&lt; 又不转义为 < , 这很不一致。

  2. 达梦数据库实现 upsert 时无法返回 insert id (达梦数据库的问题)。

和 MyBatis 的区别

GoBatis 就是对 MyBatis 的简单模仿。 但有下列不同

  1. 动态 sql 语句的格式

    我实现一个和 mybatis 类似的 if, chose, foreach, trim, set 和 where 之类的 xml 基本实现,同时也支持 go template 来生成 sql。

  2. 自动生成 sql 语句

    MyBatis 是不会自动生成 sql 语句的, 我觉得能像大部份的 orm 一样能生成 sql 的话,可以省很多工作 请见 SQL 自动生成

基本思路

  1. 用户定义结构和接口
  2. 在接口的方法上定义 sql (可以在 xml 中或方法的注释中)
  3. 用工具生成接口的实现
  4. 创建接口的实例并使用它

Roadmap

  1. 升级 go1.14 后 goparser 特别慢,准备用 goparser2 替换
  2. 将 xml 相关代码移到 xml 子目录
  3. 将 sql 生成工具 builder 相关代码移到 sql 子目录

Usage

注意, gobatis 也支持 xml, 请见 example_xml 目录

  1. install gobatis tools.

    go get -u -v github.com/runner-mei/GoBatis/cmd/gobatis

  2. Define a struct, interface and comment methods with SQLs and Variables, then write a directive //go:generate gobatis user.go.

//go:generate gobatis user.go
package example

import (
  "time"
)

type AuthUser struct {
  ID        int64      `json:"id"`
  Username  string     `json:"username"`
  Phone     string     `json:"phone"`
  Address   *string    `json:"address"`
  Status    uint8      `json:"status"`
  BirthDay  *time.Time `json:"birth_day"`
  CreatedAt time.Time  `json:"created_at"`
  UpdatedAt time.Time  `json:"updated_at"`
}

type UserDao interface {
  // @postgres insert into auth_users(username, phone, address, status, birth_day, created_at, updated_at)
  // values (#{username},#{phone},#{address},#{status},#{birth_day},CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) returning id
  //
  // @default insert into auth_users(username, phone, address, status, birth_day, created_at, updated_at)
  // values (#{username},#{phone},#{address},#{status},#{birth_day},CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
  Insert(u *AuthUser) (int64, error)
}
  1. After that, run go generate ./... , user.gobatis.go is generated
// Please don't edit this file!
package example

import (
  "errors"

  gobatis "github.com/runner-mei/GoBatis"
)

func init() {
  gobatis.Init(func(ctx *gobatis.InitContext) error {
    { //// UserDao.Insert
      if _, exists := ctx.Statements["UserDao.Insert"]; !exists {
        sqlStr := "insert into auth_users(username, phone, address, status, birth_day, created_at, updated_at)\r\n values (#{username},#{phone},#{address},#{status},#{birth_day},CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"
        switch ctx.Dialect {
        case gobatis.NewDialect("mssql"):
          sqlStr = "insert into auth_users(username, phone, address, status, birth_day, created_at, updated_at)\r\n output inserted.id\r\n values (#{username},#{phone},#{address},#{status},#{birth_day},CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"
        case gobatis.NewDialect("postgres"):
          sqlStr = "insert into auth_users(username, phone, address, status, birth_day, created_at, updated_at)\r\n values (#{username},#{phone},#{address},#{status},#{birth_day},CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) returning id"
        }
        stmt, err := gobatis.NewMapppedStatement(ctx, "UserDao.Insert",
          gobatis.StatementTypeInsert,
          gobatis.ResultStruct,
          sqlStr)
        if err != nil {
          return err
        }
        ctx.Statements["UserDao.Insert"] = stmt
      }
    }
  })
}

func NewUserDao(session gobatis.SqlSession) UserDao {
  return &UserDaoImpl{session: session}
}

type UserDaoImpl struct {
  session gobatis.SqlSession
}

func (impl *UserDaoImpl) Insert(u *AuthUser) (int64, error) {
  return impl.session.Insert("UserDao.Insert",
    []string{
      "u",
    },
    []interface{}{
      u,
    })
}

...
  1. use UserDao
  factory, err := gobatis.New(&gobatis.Config{DriverName: tests.TestDrv,
    DataSource: tests.GetTestConnURL(),
    // XMLPaths: []string{"example/test.xml"},
    })
    
  userDao := NewUserDao(factory.SessionReference())
  id, err := userDao.Insert(&insertUser)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println("insert success!")

  u, err := userDao.Get(id)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println("fetch user from database!")

  _, err = userDao.Delete(id)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println("delete success!")

注意

GoBatis 是基于 osm 的基础上修改来的,goparser 则是在 light 的基础上修改来的, reflectx 则从 sqlx 拷贝过来的

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].