# gobatis
**Repository Path**: jzcode/gobatis
## Basic Information
- **Project Name**: gobatis
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-07-29
- **Last Updated**: 2024-07-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# gobatis
模仿MyBatis开发的一个go版本,实现了一些基本功能,并做了一些简化,支持 trim,where,set,if,foreach 标签,具体使用请查看 sample.xml。
使用类库:
* XML解析库:github.com/beevik/etree
* 数据库:github.com/jmoiron/sqlx
* 日志库:go.uber.org/zap
* 表达式解析库:github.com/antonmedv/expr
## 1. 安装
```shell script
go get github.com/gentwolf-shen/gobatis
```
* 建议使用go mod
## 2. 初始化
```go
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/gentwolf-shen/gobatis"
)
func main() {
// 设置默认日志
gobatis.SetDefaultLogger()
// 设置自定义日志,支持如:go.uber.org/zap,
// gobatis.SetCustomLogger(logger)
// ...
}
```
```go
// 数据库配置请查看 github.com/jmoiron/sqlx
config := gobatis.DbConfig{
Driver: "mysql",
Dsn: "username:password@tcp(mysqlhost:3306)/dbname?charset=utf8",
MaxOpenConnections: 5,
MaxIdleConnections: 1,
MaxLifeTime: 3600,
MaxIdleTime: 1800,
}
// gobatis对象
app := gobatis.NewGoBatis(config)
// 设置xml文件
if err := app.LoadFromFile("User", "/path/to/your/mapper.xml"); err != nil {
panic(err)
}
```
## 3. 添加数据
* 传入参数类型为 map[string]interface{},以下均相同。
```xml
INSERT INTO app_user(username,password,status,create_time)
VALUES(#{username},#{password},#{status},#{createTime})
```
```go
lastInsertId, err := app.Insert("User.Insert", map[string]interface{}{
"username": "test-user",
"password": "pwd-111111",
"status": 1,
"createTime": time.Now().Unix(),
})
fmt.Println(err)
fmt.Println(lastInsertId)
```
## 4. 更新
```xml
UPDATE app_user
password = #{password}
status = #{status}
update_time = #{updateTime}
WHERE id = #{id}
```
```go
rowsAffected, err := app.Update("User.Update", map[string]interface{}{
"id": 1,
"username": "new-user",
})
fmt.Println(err)
fmt.Println(rowsAffected)
```
## 5. 查询一条记录
```go
// 用户结构
type (
User struct {
Id int64
Username string
Password string
Status uint8
CreateTime int64 `db:"create_time"`
UpdateTime int64 `db:"udpate_time"`
}
)
```
```xml
```
```go
var user User
err := app.QueryObject(&user, "User.Query", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(user)
```
## 6. 查询多条记录
```xml
```
```go
var users []User
err := app.QueryObjects(&users, "User.List", map[string]interface{}{"limit": 10})
fmt.Println(err)
fmt.Println(users)
```
## 7. 查询一个字段
```xml
```
```go
var username string
err := app.QueryObject(&username, "User.QueryUsername", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(username)
```
## 8. 删除
```xml
DELETE FROM app_user WHERE id = #{id}
```
```go
rowsAffected, err := app.Delete("User.Delete", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(rowsAffected)
```
## 9. foreach
```xml
UPDATE app_user SET
${index} = #{item}
where id = #{id}
```
```go
rowsAffected, err := app.Update("User.UpdateForeach", map[string]interface{}{
"id": 3,
"values": map[string]interface{}{"password": "pwd-333333", "status": 2, "update_time": time.Now().Unix()},
})
fmt.Println(err)
fmt.Println(rowsAffected)
```
## 10. 设置自定义logger
第三方logger需要实现的接口,github上的大部分库已支持。
具体的实现代码请查看 logger.go。
```go
type ILogger interface {
Debug(v ...interface{})
Info(v ...interface{})
Warn(v ...interface{})
Error(v ...interface{})
}
```
```go
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewDevelopment()
defer logger.Sync()
SetCustomLogger(logger.Sugar())
// ...
}
```