sgo 关系数据库自动映射框架 ORM sgo 关系数据库自动映射框架

aurora-go2022-11-11 17:21:32 • 2575 次点击    
这是一个分享于 2022-11-11 17:21:32 的项目,其中的信息可能已经有所发展或是发生改变。

sgo

Go Report Card

version

go1.19

sgo 是参考 mybatis 编写的sql标签解析,sgo仅提供对 sql 的上下文数据解析填充,并不保证对 sql 语句的语法检查。

XML 解析规则

sgo 解析 xml 文件中的sql语句,会严格检查上下文中的数据类型,字符串类型参数会自定添加 '' 单引号,其他基础数据类型不会添加,对于复杂数据结构(复合结构,泛型结构体等)会持续跟进 ,目前仅支持基础数据类型。

上下文数据

上下文数据是由用户调用时候传递接,仅接受 map 或者结构体如下:

标签详情

标签 描述 功能
根节点
insert语句 生成插入语句
select语句 生成查询语句
update语句 生成更新语句
delete语句 生成删除语句
for迭代 生成IN语句,指定需要生成IN条件的字段,可以生成对应的IN条件
if条件 判断是否满足属性表达式的条件,满足条件就对标签内的sql进行解析

demo

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapper SYSTEM "https://gitee.com/aurora-engine/sgo/blob/master/sgo.dtd">

<mapper namespace="user">
    <select id="find">
        select * from student where sss={name}
        <if expr="{arr}!=nil and {len(arr)}>0">
            and
            <for slice="{arr}" item="obj" column="id" open="("  separator="," close=")" >
                {obj}
            </for>
        </if>

        <if expr="{name}=='aaa'" >
            and abc = 1
            <if expr="1==1">
                and 1=1
                <if expr="1!=1">
                    or 1!=1
                </if>
            </if>
            or cba=1
        </if>
        or  name = {name} and 1=1
    </select>
</mapper>

xml解析

第一层

标签是整个xml的根 namespace 属性定义了 xml的标识符,调用阶段 namespace的属性至关重要

第二层

id 属性要和 Mapper 结构体 函数字段名称匹配。

创建并使用

package main

import (
    "fmt"
    "gitee.com/aurora-engine/sgo"
)
func main() {
    ctx := map[string]any{
        "id": "3de784d9a29243cdbe77334135b8a282",
    }
    open, err := sql.Open("mysql", "root:xxx@2022@tcp(82.xx.xx.xx:xx)/xx")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    build := sgo.New(open)
    build.Source("/")
    mapper := &UserMapper{}
    build.ScanMappers(mapper)
    user, err := mapper.FindUser(ctx)
    if err != nil {
        return
    }
    fmt.Println(user)
}
授权协议:
Apache
开发语言:
go 查看源码»
2575 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传