go语言与mysql

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)
    }
    

普通插入数据

  1. 准备sql语句
  2. result=db.Exec() 执行sql语句 --> result本质interface{RowsAffected()}
  3. Result.RowsAffected()获取sql语句影响的行数

预处理插入数据

  1. 准备插入数据库的数据
  2. 准备sql语句待占位符(?)
  3. db.Prepare(sql)预处理待占位符的sql语句 --> stmt
  4. 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:是一个结构体,里面有一些方法

流程:

  1. 准备查询的sql语句。单行查询
  2. 执行单行sql – db.QueryRow(sql),返回row
  3. 按表的字段数,定义变量,有几个字段定义几个变量
  4. 使用row的Scan(&var1, &var2, … )获取变量值

4.2 多行查询

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
  1. 准备查询的sql语句。多行查询
  2. 执行sql – db.Query(sql),返回rows
  3. 按表的字段数,定义变量,有几个字段定义几个变量
  4. for 循环 rows.Next为循环停止条件。使用rows的Scan(&var1, &var2, … )获取变量值

4.3 预处理查询

  1. 准备带有占位符查询的sql语句。
  2. 执行预处理的sql语句。db.Prepare(sql)预处理sql语句 --> stmt
  3. stmt.Query() 使用预处理调用查询,同时给?传参
  4. 按表的字段数,定义变量,有几个字段定义几个变量
  5. 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)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值