龙空技术网

来了!MyBatis的go版本,速度收藏

GitHub精选 5259

前言:

当前我们对“mybatis日期范围查询参数”都比较珍视,小伙伴们都需要剖析一些“mybatis日期范围查询参数”的相关文章。那么小编同时在网络上搜集了一些有关“mybatis日期范围查询参数””的相关文章,希望朋友们能喜欢,同学们快快来了解一下吧!

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的GoBatis 是参考 MyBatis 编写的sql标签解析。

XML 解析规则

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

上下文数据

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

标签详情

标签

描述

功能

<mapper>

根节点

<insert>

insert语句

生成插入语句

<select>

select语句

生成查询语句

<update>

update语句

生成更新语句

<delete>

delete语句

生成删除语句

<for>

for迭代

生成IN语句,指定需要生成IN条件的字段,可以生成对应的IN条件

<if>

if条件

判断是否满足属性表达式的条件,满足条件就对标签内的sql进行解析

demo

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper SYSTEM ";><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解析

第一层

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

第二层

<select>标签定义了 id 属性, id 属性是唯一标识,结合 namespace 能够定位,标签内的所有 {xx} 数据都来自于上下文数据,{xx} 将被解析成为具体的值

第三层

<if> 标签 定义了 expr 属性, expr 属性的值为一串表达式,表达式应返回一个 true 或者 false,表示 <if> 标签内的内容是否可以被解析,表达式中使用到上下文数据可以通过点直接调用属性(注意属性名不要和关键字同名)

定义 Mapper

GoBatis 中的 mapper 定义是基于结构体 和匿名函数字段来实现的(匿名函数字段,需要遵循一些规则):

上下文参数,只能是结构体,指针结构体或者map至少有一个返回值,一个返回值只能是 error快速入门

创建 table

创建一张表,用于测试

## 用户设计create table comm_user(    user_id varchar(50) primary key         comment '主键',    user_account varchar(50)                comment '账号',    user_email varchar(50)                  comment '邮箱',    user_password varchar(200)              comment '密码',    user_name varchar(50) not null          comment '昵称',    user_age int default 0                  comment '年龄',    user_birthday datetime                  comment '生日',    user_head_picture varchar(100)          comment '头像',    user_create_time timestamp              comment '用户创建时间') comment '用户设计';

创建 映射模型

更具 数据库表,或者sql查询结果集 创建一个结构体用于接收查询数据

// UserModel 用户模型type UserModel struct {	UserId          string `column:"user_id"`	UserAccount     string `column:"user_account"`	UserEmail       string `column:"user_email"`	UserPassword    string `column:"user_password"`	UserName        string `column:"user_name"`	UserAge         int    `column:"user_age"`	UserBirthday    string `column:"user_birthday"`	UserHeadPicture string `column:"user_head_picture"`	UserCreateTime  string `column:"user_create_time"`}

创建 Mapper

更具上述的规范,创建 Mapper

// UserMapper stype UserMapper struct {	FindUser   func(ctx any) (UserModel, error)	UserSelect func(ctx any) (map[string]any, error)}

创建 XML

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper        SYSTEM ";><mapper namespace="UserMapper">    <select id="FindUser">        select * from comm_user where user_id={id}    </select>    <select id="UserSelect">        select * from comm_user where user_id={id}    </select></mapper>

创建的 xml 文件 <mapper> namespace 属性一定要和 Mapper 结构体的名称一样,区分大小写,<select> id 属性要和 Mapper 结构体 函数字段名称匹配。

创建并使用

package mainimport (	"fmt"	"gitee.com/aurora-engine/gobatis")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)}
创建数据库表

创建一个学生表

create table student(    id          int         null,    name        varchar(20) null,    age         int         null,    create_time datetime    null);

创建映射对象

对应在go代码中创建表的对应映射结构, column tag 设置字段的一一对应关系

type Student struct {	Id         string `column:"id"`	Name       string `column:"name"`	Age        int    `column:"age"`	CreateTime string `column:"create_time"`}

创建 Mapper 和 XML

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper SYSTEM ";><mapper namespace="StudentMapper"></mapper>

解析: 文档约束是通过 编辑器设置的,项目文件夹下的 GoBatis.dtd 文件导入即可。

更具 mapper xml 文件定义的 命名空间定义一个结构体类型名称一致的 Mapper 结构体(和普通结构体没什么区别只是一个叫法)

type StudentMapper struct {	}

前置工作已经准备就绪,xml 和 mapper 结构体里面的内容会在下面的案例中一步一步的添加进去。

Insert 插入数据

对学生表进行新增数据,我们先从定义 mapper 函数开始。

type StudentMapper struct {	InsertOne func(any) (int, error)}

开始定义 xml 元素,insert 中的模板参数,均来自于 mapper 函数的上下文参数中

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper SYSTEM ";><mapper namespace="StudentMapper">    <insert id="InsertOne">        insert into student(id,name,age,create_time) value({id},{name},{age},{time})    </insert></mapper>

创建 GoBatis 并调用执行

package mainimport (	"database/sql"	"fmt"	"gitee.com/aurora-engine/gobatis"	_ "github.com/go-sql-driver/mysql"	"time")type Student struct {	Id         string `column:"id"`	Name       string `column:"name"`	Age        int    `column:"age"`	CreateTime string `column:"create_time"`}type StudentMapper struct {	InsertOne func(any) (int64, error)}func main() {	ctx := map[string]any{		"id":   "1",		"name": "test1",		"age":  19,		"time": time.Now().Format("2006-01-02 15:04:05"),	}	open, err := sql.Open("mysql", "xxxx")	if err != nil {		fmt.Println(err.Error())		return	}	if err != nil {		return	}	build := gobatis.New(open)	build.Source("/")	mapper := &StudentMapper{}	build.ScanMappers(mapper)	count, err := mapper.InsertOne(ctx)	if err != nil {		fmt.Println(err.Error())		return	}	fmt.Println(count)}

-END-

开源协议:Apache-2.0

开源地址:

标签: #mybatis日期范围查询参数