GO的MySql预处理

说明:使用预处理方式执行,是将存储过程预先发送到MySql服务器上执行,之后再传参数上去,可以有效预防数据库的注入。多次循环执行也提高了运行效率。

代码

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

//GO链接MySql
var Db *sql.DB //连接池对象

func initDB() (err error) {
    dsn := "username:password@tcp(127.0.0.1:3306)/database?charset=utf8"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return err
    }
    err = db.Ping()
    if err != nil {
        return err
    }
    //设置数据库连接池最大连接数
    db.SetMaxOpenConns(10)
    //设置最大链接空闲数
    db.SetMaxIdleConns(5)
    Db = db
    return nil
}

type User struct {
    Id   int
    Name string
    Age  int
}


//查询
func query(where string) {
    sqlStr := "select Id,Name,Age from User " + where + ";"
    //执行
    rows, err := Db.Query(sqlStr)
    if err != nil {
        fmt.Println("查询错误:%v\n", err)
        return
    }
    //释放连接
    defer rows.Close()
    for rows.Next() {
        var u User
        //赋值并关闭链接(Scan方法)
        err := rows.Scan(&u.Id, &u.Name, &u.Age)
        if err != nil {
            fmt.Println("查询循环错误")
            continue
        }
        fmt.Printf("Id:%v;Name:%v;Age:%v;\n", u.Id, u.Name, u.Age)
    }
}

//预处理(批量插入)
func prepareInsert() {
    sqlStr := `insert into User(Name,Age) value(?,?)`
    stmt, err := Db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("预处理Sql语句错误:%v\n", err)
        return
    }
    defer stmt.Close()
    var m = map[string]int{
        "张三": 12,
        "李四": 10,
        "王五": 11,
        "赵六": 18,
    }
    //循环执行预处理数据
    for v, k := range m {
        stmt.Exec(v, k)
    }
}

func main() {
    err := initDB()
    if err != nil {
        fmt.Printf("初始化失败,错误%v\n", err)
        return
    }
    fmt.Println("数据库链接成功。")
    fmt.Println("-----------------------------------")
    query("where id > 0")
    prepareInsert()
    fmt.Println("-----------------------------------")
    query("where id > 0")

}

 

运行结果:

GO的MySql预处理

 

 

参考:https://www.bilibili.com/video/BV1fz4y1m7Pm?p=136

 

上一篇:go连接数据库并执行文件中的sql语句


下一篇:go中只能给接口、指针赋值nil类型