我们这次来学习使用Golang来连接MySQL数据库,并使用Golang实现数据库的CRUD操作。
搭建环境
首先我们创建一个Golang的项目,并配置项目GOPATH,这一步可以参考我的博客Golang环境安装&IDEA开发Golang。
因为我们使用的是MySQL数据库,所以我们需要获取Golang的MySQL数据库驱动。
我们在项目GOPATH的目录下,执行go get
命令来获取MySQL的驱动,命令执行成功之后,会直接从网上下载MySQL驱动的包到你的GOPATH
目录下的src
目录下。
1
| go get -u github.com/go-sql-driver/mysql
|
Golang的项目环境搭建完成之后,我们还需要创建一张数据库表。
1 2 3 4 5 6 7
| CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(11) DEFAULT NULL, `password` varchar(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `nameindex` (`name`(10)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
项目结构
编写结构体
为了能够便于封装从数据库中获取的数据,我们创建一个Golang结构,来封装我们的数据。
我们创建一个bean
包,然后在该包下创建一个user.go
文件。
user.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package bean
type User struct { id int name string password string }
func (user *User) GetId() int { return user.id }
func (user *User) SetId(id int) { user.id = id }
func (user *User) GetName() string { return user.name }
func (user *User) SetName(name string) { user.name = name }
func (user *User) GetPassword() string { return user.password }
func (user *User) SetPassword(password string) { user.password = password }
|
编写数据库连接工具
由于每次连接数据库都需要获取数据库连接,所以我们直接将数据库的连接操作封装为一个方法,这样就可以不用每次都执行获取连接的步骤了。
我们创建一个util
包,在包下创建一个initdb.go
文件。
initdb.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package util
import ( "database/sql" _ "github.com/go-sql-driver/mysql" "strings" )
const ( userName = "root" password = "admin" ip = "127.0.0.1" port = "3306" dbName = "db_database08" )
func InitDB() *sql.DB { path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "") db, err := sql.Open("mysql", path) if err != nil { panic(err) } db.SetConnMaxLifetime(10) db.SetMaxIdleConns(5) if err := db.Ping(); err != nil { panic(err) } return db }
|
CRUD操作
Insert操作
我们创建一个insert
包,在该包下创建一个insert.go
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package main
import ( "fmt" "mysql/util" )
func main() { db := util.InitDB() tx, err := db.Begin() if err != nil { panic(err) } sql := "insert into tb_user (`name`, `password`) values (?, ?)" stmt, err := db.Prepare(sql) if err != nil { panic(err) } result, err := stmt.Exec("阿部多瑞","123") if err != nil { panic(err) } tx.Commit() fmt.Println(result.LastInsertId()) }
|
Select操作
我们创建一个select
包,在该包下创建一个select.go
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package main
import ( "fmt" "mysql/bean" "mysql/util" )
func main() { db := util.InitDB() sql := "select * from tb_user" stmt, err := db.Prepare(sql) if err != nil { panic(err) } rows, err := stmt.Query() if err != nil { panic(err) } var users []bean.User for rows.Next() { var id int var name, password string err := rows.Scan(&id, &name, &password) if err != nil { panic(err) } var user bean.User user.SetId(id) user.SetName(name) user.SetPassword(password) users = append(users, user) } fmt.Println(users) }
|
Update操作
我们创建一个update
包,在该包下创建一个update.go
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package main
import ( "mysql/util" )
func main() { db := util.InitDB() tx, err := db.Begin() if err != nil { panic(err) } sql := "update tb_user set `password` = ? where `id` = ?" stmt, err := db.Prepare(sql) if err != nil { panic(err) } _, err = stmt.Exec("789", 1) if err != nil { panic(err) } tx.Commit() }
|
Delete操作
我们创建一个delete
包,在该包下创建一个delete.go
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package main
import ( "mysql/util" )
func main() { db := util.InitDB() tx, err := db.Begin() if err != nil { panic(err) } sql := "delete from tb_user where `id` = ?" stmt, err := db.Prepare(sql) if err != nil { panic(err) } _, err = stmt.Exec(1) if err != nil { panic(err) } tx.Commit() }
|