sql-build,一个支持条件控制的go语言sql拼接库

sql-build是一个Go语言库,用于拼接带有条件控制的SQL语句,支持select、insert、update和delete操作。它提供链式API,简化SQL构建,但不支持预编译,适用于与beego、xorm等ORM配合使用。
摘要由CSDN通过智能技术生成

项目地址https://github.com/golyu/sql-build

sql-build

sql-build是一个支持条件控制的go语言sql拼接库.共分为4个部分,select,insert,update和delete四个部分,生成的结果为完整sql语句,需要和beego,xorm以及其它支持原生sql语句的orm配置使用,sql-build只做拼接工作.

download

go get github.com/golyu/sql-build

主要功能有
- 无序的链式拼接
- 支持string类型的值注入检测
- 通过条件控制,决定数据有效性 (可以自定条件,用户可以自定义自己的规则,来组合sql-build,这个可以参考sql-build-example项目中models/build目录中的写法,进行组合设置)
- 不支持sql预编译(这个既是优点也是缺点,优点是,可以在不支持预编译语句的sql中间件上使用,缺点就是预编译的优点)

需要注意的是:
- 目前只支持单表操作,不支持联表
- 参数的值在前,列名在后(这个用起来有点别扭,主要是为了使用idea的template)
- 可能缺少一些sql关键字,如果有需要,可以pull request
- 不支持sql预编译

解决的痛点

如果的models中,我们组合sql的时候,还需要判断一些参数是否存在,我们使用拼接库是这样的:

func UpdateUser(id int, username, sex, name string, state int, money float64, qq, email string) error {
    if id > 0 {
        set := ""
        if len(username) > 0 {
            set += " name = '" + username + "'"
        }
        if len(sex) > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " sex = '" + sex + "'"
        }
        if len(name) > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " name = '" + name + "'"
        }
        if state > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " state = " + strconv.Itoa(state)
        }
        if money > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " money = " + fmt.Sprintf("%g",money)
        }
        if len(qq) > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " qq = '" + qq + "'"
        }
        if len(email) > 0 {
            if len(set) > 0 {
                set += ","
            }
            set += " email = '" + email + "'"
        }
        if len(set) > 0 {
            set = " SET" + set
        } else {
            return errors.New("not need update column")
        }
        sql := fmt.Sprintf("UPDATE user "+set+" WHERE id = %d",
            id)
        o:=orm.NewOrm()
        _, err := o.Raw(sql).Exec()
        return err
    }
    return errors.New("Id can not <=0")
}

每一步一个判断,还要考虑数据的类型,一不小心就会出错,下面使用sql-build来重构上述代码

func UpdateUser(id int, username, sex, name string, state int, money float64, qq, email string) error {
    sql, err := sqlBuild.Update("user").
        Where_(id, "id").
        Set(username, "username").
        Set(sex, "sex").
        Set(name, "name").
        Set(state, "state").
        Set(money, "money").
        Set(qq, "qq").
        Set(email, "email").
        String()
    if err != nil {
        return err
    }
    o := orm.NewOrm()
    _, err = o.Raw(sql).Exec()
    return err
}

一下子,就简洁了很多,还不用类型转换,不担心写错,如果配合idea的template功能一起使用,你会感觉更简单,晒一张图
image

使用说明

go
import (
"github.com/golyu/sql-build/debug"
)
sqlBuild.Debug() //开启debug模式,可以看到错误和警告的打印

select

select功能可以支持以下函数,除了Select和String函数放在语句的头尾处,其余的都可以无序设置
- Select(table string) SelectInf
- Column(column string) SelectInf
- Where(value interface{}, key string, rules … Rule) SelectInf
- Where_(value interface{}, key string, rules … Rule) SelectInf
- Like(value string, key string) SelectInf
- In(values interface{}, key string) SelectInf
- NotIn(values interface{}, key string) SelectInf
- OrderBy(orderBy string) SelectInf
- Limit(limit int) SelectInf
- Offset(offset int) SelectInf
- GroupBy(groupBy string) SelectInf
- String() (string, error)

String 生成sql的函数
import (
    "testing"
    "github.com/golyu/sql-build"
)

func TestTable(t *testing.T) {
    myTab:&
Mybatis-plus是Mybatis的增强工具,提供了更加方便、快速的开发体验。在实际开发中,我们有时需要动态地拼接SQL,Mybatis-plus为我们提供了一些丰富的API来进行SQL拼接。 1. Wrapper Wrapper是Mybatis-plus提供的一个用于拼接SQL语句的抽象类。它提供了一系列的查询条件构造方法,比如eq、ne、like等等。使用Wrapper可以有效地避免手写SQL语句时因为类型转换等问题导致的不安全因素,也可以避免SQL注入。 2. LambdaQueryWrapper LambdaQueryWrapper是Wrapper的一个特殊子类,它采用lambda表达式的形式,更加方便地进行拼接。使用LambdaQueryWrapper可以在Java代码中写出和SQL一样的查询条件,比如: LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getName, "张三"); List<User> userList = userService.list(wrapper); 上述代码中,我们使用LambdaQueryWrapper构造了一个查询条件,查询名字为“张三”的用户。可以看到,使用LambdaQueryWrapper的方式非常直观,更加方便。 3. UpdateWrapper UpdateWrapper是用于构造更新操作的Wrapper子类。使用UpdateWrapper可以方便地设置更新的字段和更新条件,比如: UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.set("name", "张三"); wrapper.eq("id", 1); userService.update(wrapper); 上述代码中,我们使用UpdateWrapper构造了一个更新条件,更新名字为“张三”的用户,条件是ID为1。 4. QueryBuilder QueryBuilder是Mybatis-plus提供的一个动态SQL构造器,它可以将多个SQL片段拼接成一条完整的SQL语句。使用QueryBuilder可以更加方便地构建复杂的查询语句。比如: String sql = new QueryBuilder() .select("id", "name", "age") .from("user") .where("age > 18") .orderBy("id DESC") .build(); List<Map<String, Object>> userList = jdbcTemplate.queryForList(sql); 上述代码中,我们使用QueryBuilder构建了一个查询语句,查询所有年龄大于18的用户,按照ID降序排列。 总之,Mybatis-plus提供了众多API来拼接SQL,不管是Wrapper、LambdaQueryWrapper、UpdateWrapper还是QueryBuilder,都可以方便地满足我们的各种SQL拼接需求。开发者可以根据具体情况选择不同的API进行使用,提高代码的开发效率和可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值