go语言与mysql
1. 准备工作
首先安装驱动:go get github.com/go-sql-driver/mysql
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
github的必须在使用前导入,它是驱动的依赖包。
“database/sql”:是go语言数据库操作函数的包
2. 连接数据库
func Open(driverName, dataSourceName string) (*DB, error)
- driverName:驱动名:写"mysql"
- dataSourceName:语法为
"用户名:密码@[连接方式](主机名:端口号)/数据库名"
- 其中连接方式为tcp
- 返回值:*DB是操作数据库的抽象接口的对象
注意:该函数不会建立数据库连接,也不会对数据库连接的合法性做检验
func (db *DB) Ping() error
该函数成功连接数据库
这个函数之后*DB称为真正指向成功连接的数据库对象
3. 插入数据
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
- query:要执行的sql语句
- args:传参
- 返回值Result:
type Result interface {
// LastInsertId返回一个数据库生成的回应命令的整数。
// 当插入新行时,一般来自一个"自增"列。
// 不是所有的数据库都支持该功能,该状态的语法也各有不同。
LastInsertId() (int64, error)
// RowsAffected返回被update、insert或delete命令影响的行数。
// 不是所有的数据库都支持该功能。
RowsAffected() (int64, error)
}
普通插入数据
- 准备sql语句
- result=db.Exec() 执行sql语句 --> result本质interface{RowsAffected()}
- Result.RowsAffected()获取sql语句影响的行数
预处理插入数据
- 准备插入数据库的数据
- 准备sql语句待占位符(?)
- db.Prepare(sql)预处理待占位符的sql语句 --> stmt
- stmt.Exec(s[0], s[1])执行sql同时给占位符传参
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "itcast:itcast@tcp(127.0.0.1:3306)/itcast")
if err != nil {
fmt.Println("open err:", err)
return
}
defer db.Close()
err = db.Ping()
if err != nil {
fmt.Println("ping err:", err)
return
}
fmt.Println("数据库连接成功")
准备插入的sql语句
//sql := "insert into st7 values(2, 'kitty');"
//result, err := db.Exec(sql)
//if err != nil {
// fmt.Println("Exec err:", err)
// return
//}
//n, _ := result.RowsAffected()
//fmt.Printf("insert ok !!! %d rows Affected.\n", n)
// 准备插入的sql语句
//sql := "insert into st7 values(3, 'kitty'), (4, '李白'), (5, '曹操');"
//result, err := db.Exec(sql)
//if err != nil {
// fmt.Println("Exec err:", err)
// return
//}
//n, _ := result.RowsAffected()
//fmt.Printf("insert ok !!! %d rows Affected.\n", n)
// 预处理插入多行
// 准备待插入的数据
data := [][]string{{"6", "唐僧"}, {"7", "孙悟空"}, {"8", "猪八戒"}, {"9", "沙僧"}}
// 准备预处理语句
sql := "insert into st7 values(?, ?);"
// 预处理带占位符的sql
stmt, err := db.Prepare(sql)
if err != nil {
fmt.Println("Prepare err:", err)
return
}
for _, s := range data {
stmt.Exec(s[0], s[1])
}
fmt.Println("insert ok!!!")
}
4. 查询数据
4.1 单行查询
func (db *DB) QueryRow(query string, args ...interface{}) *Row
- query:查询的sql语句
- args:参数
- 返回值 *Row:是一个结构体,里面有一些方法
流程:
- 准备查询的sql语句。单行查询
- 执行单行sql – db.QueryRow(sql),返回row
- 按表的字段数,定义变量,有几个字段定义几个变量
- 使用row的Scan(&var1, &var2, … )获取变量值
4.2 多行查询
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
- 准备查询的sql语句。多行查询
- 执行sql – db.Query(sql),返回rows
- 按表的字段数,定义变量,有几个字段定义几个变量
- for 循环 rows.Next为循环停止条件。使用rows的Scan(&var1, &var2, … )获取变量值
4.3 预处理查询
- 准备带有占位符查询的sql语句。
- 执行预处理的sql语句。db.Prepare(sql)预处理sql语句 --> stmt
- stmt.Query() 使用预处理调用查询,同时给?传参
- 按表的字段数,定义变量,有几个字段定义几个变量
- for 循环 rows.Next为循环停止条件。使用rows的Scan(&var1, &var2, … )获取变量值
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "itcast:itcast@tcp(127.0.0.1:3306)/itcast")
if err != nil {
fmt.Println("open err:", err)
return
}
defer db.Close()
err = db.Ping()
if err != nil {
fmt.Println("ping err:", err)
return
}
fmt.Println("数据库连接成功")
查询单行
//sql := "select * from st7 where id=5;"
//
执行sql语句并且将查询结果保存在row中
//row := db.QueryRow(sql)
//
定义变量接收字段值 -- 根据表的字段数定义
//var id, name string
//err = row.Scan(&id, &name)
//if err != nil {
// fmt.Println("Scan err:", err)
// return
//}
//fmt.Println(id, "-", name)
// 多行查询
//sql := "select * from st7 where id >= 5;"
//rows, err := db.Query(sql)
//if err != nil {
// fmt.Println("Query error", err)
// return
//}
//var id, name string
//for rows.Next() {
// rows.Scan(&id, &name)
// fmt.Println(id, "-", name)
//}
// 预处理查询
sql := "select * from st7 where id > ?;"
// 预处理sql
stmt, err := db.Prepare(sql)
if err != nil {
fmt.Println("Prepare error:", err)
return
}
// 预处理调用Query函数 --> rows
rows, err := stmt.Query(2)
if err != nil {
fmt.Println("Query error:", err)
return
}
var id, name string
for rows.Next() {
rows.Scan(&id, &name)
fmt.Println(id, "-", name)
}
}