version
go1.19
GoBatisMyBatisGoBatis
XML 解析规则
GoBatis''
上下文数据
上下文数据是由用户调用时候传递接,仅接受 map 或者结构体如下:
标签详情
demo
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE mapper SYSTEM "http://aurora-engine.com/GoBatis.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解析
第一层
namespacenamespace
第二层
第三层
exprexprtruefalse
定义 Mapper
GoBatismapper
- 上下文参数,只能是结构体,指针结构体或者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 s type 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 "http://aurora-engine.com/GoBatis.dtd"> <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>
namespace
创建并使用
package main import ( "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 );
创建映射对象
column
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 "http://aurora-engine.com/GoBatis.dtd"> <mapper namespace="StudentMapper"> </mapper>
http://aurora-engine.com/GoBatis.dtd
type StudentMapper struct { }
前置工作已经准备就绪,xml 和 mapper 结构体里面的内容会在下面的案例中一步一步的添加进去。
Insert
Insert 插入数据
对学生表进行新增数据,我们先从定义 mapper 函数开始。
type StudentMapper struct { InsertOne func(any) (int, error) }
开始定义 xml 元素,insert 中的模板参数,均来自于 mapper 函数的上下文参数中
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE mapper SYSTEM "http://aurora-engine.com/GoBatis.dtd"> <mapper namespace="StudentMapper"> <insert id="InsertOne"> insert into student(id,name,age,create_time) value({id},{name},{age},{time}) </insert> </mapper>
创建 GoBatis 并调用执行
package main import ( "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) }
批量插入数据
我们现在继续向 Mapper 结构体中添加定义
type StudentMapper struct { InsertOne func(any) (int64, error) InsertArr func(any) (int64, error) }
InsertArr func(any) (int64, error)
<mapper namespace="StudentMapper"> <insert id="InsertOne"> insert into student(id,name,age,create_time) value({id},{name},{age},{time}) </insert> <insert id="InsertArr"> insert into student(id,name,age,create_time) values <for slice="{arr}" item="obj"> ({obj.id},{obj.name},{obj.age},{obj.time}) </for> </insert> </mapper>
arrobj
package main import ( "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) InsertArr func(any) (int64, error) } func main() { ctx := map[string]any{ "arr": []map[string]any{ { "id": "1", "name": "test1", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "2", "name": "test2", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "3", "name": "test3", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, }, } open, err := sql.Open("mysql", "xxxxx") if err != nil { fmt.Println(err.Error()) return } build := gobatis.New(open) build.Source("/") mapper := &StudentMapper{} build.ScanMappers(mapper) count, err := mapper.InsertArr(ctx) if err != nil { fmt.Println(err.Error()) return } fmt.Println(count) }
::: tip Insert,Update,Delete,定义的返回值只能返回数据库处理记录,第一个参数返回类型不正确将会返回错误信息,Insert 相对特殊,第二个参数可以返回,自增长id。 :::
Select
查询一条记录
添加 查询定义如下:
type StudentMapper struct { InsertOne func(any) (int64, error) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) }
<select id="SelectById"> select * from student where id={id} </select>
package main import ( "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) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) } func main() { ctx := map[string]any{ "arr": []map[string]any{ { "id": "1", "name": "test1", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "2", "name": "test2", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "3", "name": "test3", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, }, "id": "1", "ids": []string{"1", "2"}, } open, err := sql.Open("mysql", "xxxx") if err != nil { fmt.Println(err.Error()) return } build := gobatis.New(open) build.Source("/") mapper := &StudentMapper{} build.ScanMappers(mapper) stu, err := mapper.SelectById(ctx) if err != nil { fmt.Println(err.Error()) return } fmt.Println(stu) }
查询多条数据
type StudentMapper struct { InsertOne func(any) (int64, error) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) SelectAll func() ([]Student, error) }
<select id="SelectAll"> select * from student </select>
package main import ( "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) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) SelectAll func() ([]Student, error) } func main() { open, err := sql.Open("mysql", "xxxx") if err != nil { fmt.Println(err.Error()) return } build := gobatis.New(open) build.Source("/") mapper := &StudentMapper{} build.ScanMappers(mapper) stu, err := mapper.SelectAll() if err != nil { fmt.Println(err.Error()) return } fmt.Println(stu) }
批量查询
type StudentMapper struct { InsertOne func(any) (int64, error) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) SelectAll func() ([]Student, error) SelectByIds func(any) ([]Student, error) }
<select id="SelectByIds"> select * from student where id in <for slice="{ids}" item="id" open="(" separator="," close=")"> {id} </for> </select>
package main import ( "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) InsertArr func(any) (int64, error) SelectById func(any) (Student, error) SelectAll func() ([]Student, error) SelectByIds func(any) ([]Student, error) } func main() { ctx := map[string]any{ "arr": []map[string]any{ { "id": "1", "name": "test1", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "2", "name": "test2", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, { "id": "3", "name": "test3", "age": 19, "time": time.Now().Format("2006-01-02 15:04:05"), }, }, "id": "1", "ids": []string{"1", "2"}, } open, err := sql.Open("mysql", "xxxxxxx") if err != nil { fmt.Println(err.Error()) return } build := gobatis.New(open) build.Source("/") mapper := &StudentMapper{} build.ScanMappers(mapper) stu, err := mapper.SelectByIds(ctx) if err != nil { fmt.Println(err.Error()) return } fmt.Println(stu) }
Update
同上...
Delete
同上...