使用golang开发一个MyBatis版本的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. 安装

go get github.com/gentwolf-shen/gobatis

* 建议使用go mod

2. 初始化

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/gentwolf-shen/gobatis"
)

func main() {
    // 设置默认日志
    SetDefaultLogger()

    // 设置自定义日志,支持如:go.uber.org/zap,
    // SetCustomLogger(logger)

    // ...
}
// 数据库配置请查看 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{},以下均相同。

<insert id="Insert">
    INSERT INTO app_user(username,password,status,create_time)
    VALUES(#{username},#{password},#{status},#{createTime})
</insert>
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. 更新

<update id="Update">
    UPDATE app_user
    <set>
        <if test="password != nil and password != ''">password = #{password}</if>
        <if test="status > 0">status = #{status}</if>
        <if>update_time = #{updateTime}</if>
    </set>
    WHERE id = #{id}
</update>
rowsAffected, err := app.Update("User.Update", map[string]interface{}{
    "id":       1,
    "username": "new-user",
})
fmt.Println(err)
fmt.Println(rowsAffected)

5. 查询一条记录

// 用户结构
type (
    User struct {
        Id         int64
        Username   string
        Password   string
        Status     uint8
        CreateTime int64 `db:"create_time"`
        UpdateTime int64 `db:"udpate_time"`
    }
)
<select id="Query">
    SELECT id,username,status,create_time,update_time FROM app_user WHERE id = #{id}
</select>
var user User
err := app.QueryObject(&user, "User.Query", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(user)

6. 查询多条记录

<select id="List">
    SELECT id,username,status,create_time,update_time FROM app_user
    <where>
        <if test="status != nil and status > 0">status = #{status}</if>
        <if test="username != nil and username != ''">username LIKE CONCAT('%', #{username}, '%')</if>
    </where>
    ORDER BY id DESC
    <if test="limit != nil and limit > 0">LIMIT #{limit}</if>
</select>
var users []User
err := app.QueryObjects(&users, "User.List", map[string]interface{}{"limit": 10})
fmt.Println(err)
fmt.Println(users)

7. 查询一个字段

<select id="QueryUsername">
    SELECT username FROM app_user WHERE id = #{id}
</select>
var username string
err := app.QueryObject(&username, "User.QueryUsername", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(username)

8. 删除

<delete id="Delete">
    DELETE FROM app_user WHERE id = #{id}
</delete>
rowsAffected, err := app.Delete("User.Delete", map[string]interface{}{"id": 1})
fmt.Println(err)
fmt.Println(rowsAffected)

9. foreach

<update id="UpdateForeach">
    UPDATE app_user SET
    <foreach collection="values" separator="," index="index" item="item">
       ${index} = #{item}
    </foreach>
    where id = #{id}
</update>
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。

type ILogger interface {
    Debug(v ...interface{})
    Info(v ...interface{})
    Warn(v ...interface{})
    Error(v ...interface{})
}
import (
    "go.uber.org/zap"
)

func main() {
    logger, _ := zap.NewDevelopment()
    defer logger.Sync()
    SetCustomLogger(logger.Sugar())
    
    // ...
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值