SQL mapper ORM framework for Golang

Related tags

ORM GoMybatis2
Overview

SQL mapper ORM framework for Golang

Go Report Card Build Status GoDoc Coverage Status codecov

Image text

Please read the documentation website carefully when using the tutorial. DOC

Powerful Features

  • High Performance, can reach 751020 Qps/s, and the total time consumed is 0.14s (test environment returns simulated SQL data, concurrently 1000, total 100000, 6-core 16GB win10)
  • Painless migration from Java to go,Compatible with most Java(Mybatis3,Mybatis Plus) ,Painless migration of XML SQL files from Java Spring Mybatis to Go language(Modify only the javaType of resultMap to specify go language type for langType)
  • Declarative transaction/AOP transaction/transaction BehaviorOnly one line Tag is needed to define AOP transactions and transaction propagation behavior
  • Extensible Log InterfaceAsynchronous message queue day, SQL log in framework uses cached channel to realize asynchronous message queue logging
  • dynamic sql,contains 15 utilities Features select * from biz_activity where delete_flag=1 order by create_time desc `) ">
    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" //Select the required database-driven imports
    	"github.com/zhuxiujia/GoMybatis"
    )
    type ExampleActivityMapperImpl struct {
         SelectAll  func() ([]Activity, error)
    }
    
    func main() {
        var engine = GoMybatis.GoMybatisEngine{}.New()
    	//Mysql link format user name: password @ (database link address: port)/database name, such as root: 123456 @(***.com: 3306)/test
    	err := engine.Open("mysql", "*?charset=utf8&parseTime=True&loc=Local")
    	if err != nil {
    	   panic(err)
    	}
    	var exampleActivityMapperImpl ExampleActivityMapperImpl
    	
    	//Loading XML implementation logic to ExampleActivity Mapper Impl
    	engine.WriteMapperPtr(&exampleActivityMapperImpl, xmlBytes)
    
    	//use mapper
    	result, err := exampleActivityMapperImpl.SelectAll(&result)
            if err != nil {
    	   panic(err)
    	}
    	fmt.Println(result)
    }

    Features: Template tag CRUD simplification (must rely on a resultMap tag)

    ">
    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>
        
        
        
        
        <resultMap id="BaseResultMap" tables="biz_activity">
            <id column="id" langType="string"/>
            <result column="name" langType="string"/>
            <result column="pc_link" langType="string"/>
            <result column="h5_link" langType="string"/>
            <result column="remark" langType="string"/>
            <result column="sort" langType="int"/>
            <result column="status" langType="status"/>
            <result column="version" langType="int"
                    version_enable="true"/>
            <result column="create_time" langType="time.Time"/>
            <result column="delete_flag" langType="int"
                    logic_enable="true"
                    logic_undelete="1"
                    logic_deleted="0"/>
        resultMap>
    
        
    
        
        <insertTemplate/>
        
        <selectTemplate wheres="name?name = #{name}"/>
        
        <updateTemplate sets="name?name = #{name},remark?remark=#{remark}" wheres="id?id = #{id}"/>
        
        <deleteTemplate wheres="name?name = #{name}"/>
    mapper>    

    XML corresponds to the Mapper structure method defined below

    type Activity struct {
    	Id         string    `json:"id"`
    	Uuid       string    `json:"uuid"`
    	Name       string    `json:"name"`
    	PcLink     string    `json:"pcLink"`
    	H5Link     string    `json:"h5Link"`
    	Remark     string    `json:"remark"`
    	Version    int       `json:"version"`
    	CreateTime time.Time `json:"createTime"`
    	DeleteFlag int       `json:"deleteFlag"`
    }
    type ExampleActivityMapper struct {
    	SelectTemplate      func(name string) ([]Activity, error) `args:"name"`
    	InsertTemplate      func(arg Activity) (int64, error)
    	InsertTemplateBatch func(args []Activity) (int64, error) `args:"args"`
    	UpdateTemplate      func(arg Activity) (int64, error)    `args:"name"`
    	DeleteTemplate      func(name string) (int64, error)     `args:"name"`
    }

    Features:Dynamic Data Source

            //To add a second MySQL database, change Mysql Uri to your second data source link
        var engine = GoMybatis.GoMybatisEngine{}.New()
    	engine.Open("mysql", MysqlUri)//添加第二个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.SetDataSourceRouter(&router)

    Features:Custom log output

    	engine.SetLogEnable(true)
    	engine.SetLog(&GoMybatis.LogStandard{
    		PrintlnFunc: func(messages []byte) {
    		  //do someting save messages
    		},
    	})

    Features:Asynchronous log interface (customizable log output)

    Image text

    Features:Transaction Propagation Processor (Nested Transactions)

    Transaction type Explain
    PROPAGATION_REQUIRED Represents that if the current transaction exists, the current transaction is supported. Otherwise, a new transaction will be started. Default transaction type.
    PROPAGATION_SUPPORTS Represents that if the current transaction exists, the current transaction is supported, and if there is no transaction at present, it is executed in a non-transactional manner.
    PROPAGATION_MANDATORY Represents that if the current transaction exists, the current transaction is supported, and if no transaction exists, the transaction nesting error is returned.
    PROPAGATION_REQUIRES_NEW Represents that a new Session opens a new transaction and suspends the current transaction if it currently exists.
    PROPAGATION_NOT_SUPPORTED Represents that an operation is performed in a non-transactional manner. If a transaction exists, a new Session is created to perform the operation in a non-transactional manner, suspending the current transaction.
    PROPAGATION_NEVER Represents that an operation is executed in a non-transactional manner and returns a transaction nesting error if a transaction currently exists.
    PROPAGATION_NESTED Represents that if the current transaction exists, it will be executed within the nested transaction. If the nested transaction rolls back, it will only roll back within the nested transaction and will not affect the current transaction. If there is no transaction at the moment, do something similar to PROPAGATION_REQUIRED.
    PROPAGATION_NOT_REQUIRED Represents that if there is currently no transaction, a new transaction will be created, otherwise an error will be returned.
    //Nested transaction services
    type TestService struct {
       exampleActivityMapper *ExampleActivityMapper //The service contains a mapper operation database similar to 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("Business exceptions")) // panic Triggered transaction rollback strategy
       		return nil                   // rollback:"error" A transaction rollback policy is triggered if the error type is returned and is not nil
       	},
       	UpdateName: func(id string, name string) error {
       		testService.exampleActivityMapper.SelectByIds([]string{id})
       		return nil
       	},
       }
       GoMybatis.AopProxyService(&testService, &engine)//Func must use AOP proxy service
       testService.UpdateRemark("1","remark")
    }

    Features:XML/Mapper Generator - Generate * mapper. XML from struct structure

      //step1 To define your database model, you must include JSON annotations (default database fields), gm:"" annotations specifying whether the value is id, version optimistic locks, and logic logic soft deletion.
      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"`
    }
    • Step 2: Create an Xml CreateTool. go in the main directory of your project as follows
    func main() {
    	var bean = UserAddress{} //Here's just an example, which should be replaced by your own database model
    	GoMybatis.OutPutXml(reflect.TypeOf(bean).Name()+"Mapper.xml", GoMybatis.CreateXml("biz_"+GoMybatis.StructToSnakeString(bean), bean))
    }
    
    • Third, execute the command to get the UserAddressMapper. XML file in the current directory
    go run XmlCreateTool.go
    • The following is the content of the automatically generated XML file
    ">
    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>
        
        
        
        
        <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>

    Components (RPC, JSONRPC, Consul) - With GoMybatis

    Please pay attention to the version in time, upgrade the version in time (new features, bug fix). For projects using GoMybatis, please leave your project name + contact information in Issues.

    Welcome to Star or Wechat Payment Sponsorship at the top right corner~

    Image text

Go-mysql-orm - Golang mysql orm,dedicated to easy use of mysql

golang mysql orm 个人学习项目, 一个易于使用的mysql-orm mapping struct to mysql table golang结构

magacy 2 Apr 17, 2022
Using-orm-with-db - Trying to use ORM to work with PostgreSQL

Using ORM with db This repo contains the training (rough) code, and possibly not

Pavel V 2 Jan 6, 2022
Golang struct-to-table database mapper

Structable: Struct-Table Mapping for Go Warning: This is the Structable 4 development branch. For a stable release, use version 3.1.0. Structable deve

null 252 May 6, 2022
Golang Object Graph Mapper for Neo4j

GoGM Golang Object Graph Mapper v2 go get -u github.com/mindstand/gogm/v2 Features Struct Mapping through the gogm struct decorator Full support for

MindStand Technologies 84 Apr 23, 2022
100% type-safe ORM for Go (Golang) with code generation and MySQL, PostgreSQL, Sqlite3, SQL Server support. GORM under the hood.

go-queryset 100% type-safe ORM for Go (Golang) with code generation and MySQL, PostgreSQL, Sqlite3, SQL Server support. GORM under the hood. Contents

Denis Isaev 660 May 9, 2022
beedb is a go ORM,support database/sql interface,pq/mysql/sqlite

Beedb ❗ IMPORTANT: Beedb is being deprecated in favor of Beego.orm ❗ Beedb is an ORM for Go. It lets you map Go structs to tables in a database. It's

astaxie 709 Mar 8, 2022
A simple wrapper around sql.DB to help with structs. Not quite an ORM.

go-modeldb A simple wrapper around sql.DB to help with structs. Not quite an ORM. Philosophy: Don't make an ORM Example: // Setup require "modeldb" db

Jae Kwon 17 Nov 16, 2019
Simple and performant ORM for sql.DB

Simple and performant ORM for sql.DB Main features are: Works with PostgreSQL, MySQL, SQLite. Selecting into a map, struct, slice of maps/structs/vars

Uptrace 894 May 14, 2022
bur: An ORM framework implementation in Go.

bur An ORM framework implementation in Go(based on sg). Quickstart package main import ( "database/sql" "fmt" . "github.com/go-the-way/bur" "

go-the-way 0 Jan 13, 2022
Go tool for generating sql scanners, sql statements and other helper functions

sqlgen generates SQL statements and database helper functions from your Go structs. It can be used in place of a simple ORM or hand-written SQL. See t

drone.io 182 Jan 3, 2022
An orm library support nGQL for Golang

norm An ORM library support nGQL for Golang. Overview Build insert nGQL by struct / map (Support vertex, edge). Parse Nebula execute result to struct

Zhihu 65 May 9, 2022
golang orm

korm golang orm, 一个简单易用的orm, 支持嵌套事务 安装 go get github.com/wdaglb/korm go get github.com/go-sql-driver/mysql 支持数据库 mysql https://github.com/go-sql-driv

null 6 Oct 11, 2021
Golang ORM with focus on PostgreSQL features and performance

go-pg is in a maintenance mode and only critical issues are addressed. New development happens in Bun repo which offers similar functionality but works with PostgreSQL, MySQL, and SQLite.

null 5.1k May 10, 2022
The fantastic ORM library for Golang, aims to be developer friendly

GORM The fantastic ORM library for Golang, aims to be developer friendly. Overview Full-Featured ORM Associations (Has One, Has Many, Belongs To, Many

Yadhu Sasidharan 0 Nov 11, 2021
Golang mysql orm, a personal learning project, dedicated to easy use of mysql

golang mysql orm 个人学习项目, 一个易于使用的mysql-orm mapping struct to mysql table golang结构

magacy 1 Dec 30, 2021
ORM-ish library for Go

We've moved! gorp is now officially maintained at: https://github.com/go-gorp/gorp This fork was created when the project was moved, and is provided f

James Cooper 53 Nov 22, 2021
Simple Go ORM for Google/Firebase Cloud Firestore

go-firestorm Go ORM (Object-relational mapping) for Google Cloud Firestore. Goals Easy to use Non intrusive Non exclusive Fast Features Basic CRUD ope

Jens Kjær Schødt 28 May 8, 2022
Database agnostic ORM for Go

If you are looking for something more lightweight and flexible, have a look at jet For questions, suggestions and general topics visit the group. Inde

Erik Aigner 693 May 6, 2022
QBS stands for Query By Struct. A Go ORM.

Qbs Qbs stands for Query By Struct. A Go ORM. 中文版 README ChangeLog 2013.03.14: index name has changed to {table name}_{column name}. For existing appl

Evan Zhou 548 May 1, 2022