一.驱动包简介
-
驱动包:任何编程语言想要连接数据库必须由数据库生产厂商提供了统一数据库调用而开发的内容
-
Golang的MySQL驱动包可以在github中下载到
二.go get
-
go get命令可以远程下载指定内容,支持git
-
github要求下载内容必须通过git客户端,所以当直接使用go get命令后会提示错误
-
在命令行中运行命令
-
需要注意的是:前提已经安装好git客户端(安装包已经放在02资料中)
-
go get github.com/go-sql-driver/mysql
-
如果没有安装git客户端会出现下面错误信息
-
-
安装了git后运行命令会自动下载到%GOPATH%/src中
-
处一定注意:安装了git后必须重新打开命令行,否者git环境变量不生效
-
-
进入src把内容复制到%GOROOT%/src中
-
由于环境变量中GOPATH可能与Goland中配置的GOPATH不同,所以此处建议放入到%GOROOT%/src中,这样可以保证切换GOPATH也可以加载到驱动包
-
-
复制完效果如下
-
三.手动下载配置
-
如果不希望安装git也可以手动下载,进入网址
-
点击右侧”Download ZIP”
-
-
在%GOROOT%/src下新建3级文件夹
github.com/go-sql-driver/mysql
,把ZIP解压后mysql-master里面全部代码放入到mysql(github.com/go-sql-driver/mysql
)文件夹中
四.数据库准备
-
在MySQL中新建数据库名称first
-
新建表
create table people(
id int primary key auto_increment,
name varchar(20),
address varchar(20)
)
代码实现
-
全部代码
package main
import (
"fmt"
//驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
_ "github.com/go-sql-driver/mysql" //如果包名显示红色表示未引入,需要将下载的mysql驱动拷
//贝到%GOROOT%\src下,这样即使更换GOPATH也能引用到。
//Golang中数据库操作包
"database/sql"
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
}
fmt.Println("关闭连接")
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("insert into people values(default,?,?)")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec("张三","海淀")
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//获取生成主键
id,err:=res.LastInsertId()
if err!=nil{
fmt.Println("获取主键失败",err)
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
fmt.Println(id,count)
if count>0{
fmt.Println("新增成功")
}else{
fmt.Println("新增失败")
}
}
修改注意点
-
修改和新增类似,只是不需要获取LastInsertId()和SQL语句是修改语句
-
在Golang中要求:如果修改前和修改后的值相同,RowsAffected()返回0
代码实现
package main
import (
"fmt"
//驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
_ "github.com/go-sql-driver/mysql"
//Golang中数据库操作包
"database/sql"
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("update people set name=?,address=? where id=?")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec("李四","朝阳",1)
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
if count>0{
fmt.Println("修改成功")
}else{
fmt.Println("修改失败")
}
}
删除注意点
-
删除和修改、新增结构一样,区别为SQL语句
-
在Go语言中要求如果要删除的数据不存在RowsAffected()返回0
代码实现
package main
import (
"fmt"
//驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
_ "github.com/go-sql-driver/mysql"
//Golang中数据库操作包
"database/sql"
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("delete from people where id=?")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec(1)
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
if count>0{
fmt.Println("删除成功")
}else{
fmt.Println("删除失败")
}
}
查询注意点
-
Golang中执行查询与新增、删除、修改中stmt的执行方法有区别,由于需要把查询到的结果取出来,所以还需要进行取值处理
代码示例
package main
import (
"fmt"
//驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
_ "github.com/go-sql-driver/mysql"
//Golang中数据库操作包
"database/sql"
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("select * from people") //查询所有
//stmt,err:=db.Prepare("select * from people where id=?") //根据id查询
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
rows,err:=stmt.Query() //查询所有
//rows,err:=stmt.Query(1) //根据id查询数据
if err!=nil{
fmt.Println("查询失败",err)
}
//循环遍历结果
for rows.Next(){
var id int
var name,address string
//把行内值付给变量
rows.Scan(&id,&name,&address)
fmt.Println(id,name,address)
}
defer func() {
if rows!=nil{
rows.Close()
fmt.Println("关闭结果集")
}
}()
}