今回はGolangを使用してMySQLデータベースに接続する方法を学び、Golangを使用してデータベースのCRUD操作を実装します。
ビルド環境
最初にGolangプロジェクトを作成し、プロジェクトGOPATHを構成します。このステップでは、私のブログGolang環境のインストールとIDEA開発Golangを参照できます。
MySQLデータベースを使用しているため、GolangのMySQLデータベースドライバーを取得する必要があります。
プロジェクトのGOPATHディレクトリでgo get
コマンドを実行してMySQLドライバーを取得し、コマンドが正常に実行されると、MySQLドライバーパッケージがインターネットから直接GOPATH
ディレクトリの下のディレクトリにダウンロードされますsrc
。
go get -u github.com/go-sql-driver/mysql
Golangプロジェクト環境を構築したら、データベーステーブルも作成する必要があります。
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
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
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 {
//Golang数据连接:"用户名:密码@tcp(IP:端口号)/数据库名?charset=utf8"
path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
//打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql", path)
if err != nil {
//如果打开数据库错误,直接panic
panic(err)
}
//设置数据库最大连接数
db.SetConnMaxLifetime(10)
//设置上数据库最大闲置连接数
db.SetMaxIdleConns(5)
//验证连接
if err := db.Ping(); err != nil {
panic(err)
}
//将数据库连接的指针引用返回
return db
}
CRUD操作
挿入操作
insert
パッケージを作成し、パッケージの下にinsert.go
ファイルを作成します
package main
import (
"fmt"
"mysql/util"
)
func main() {
//使用工具获取数据库连接
db := util.InitDB()
//开启事务
tx, err := db.Begin()
if err != nil {
//事务开启失败,直接panic
panic(err)
}
//准备SQL语句
sql := "insert into tb_user (`name`, `password`) values (?, ?)"
//对SQL语句进行预处理
stmt, err := db.Prepare(sql)
if err != nil {
panic(err)
}
result, err := stmt.Exec("阿部多瑞","123")
if err != nil {
//SQL执行失败,直接panic
panic(err)
}
//提交事务
tx.Commit()
//返回插入记录的id
fmt.Println(result.LastInsertId())
}
操作を選択
select
パッケージを作成し、パッケージの下にselect.go
ファイルを作成します
package main
import (
"fmt"
"mysql/bean"
"mysql/util"
)
func main() {
//使用工具获取数据库连接
db := util.InitDB()
//准备SQL语句
sql := "select * from tb_user"
//对SQL语句进行预处理
stmt, err := db.Prepare(sql)
if err != nil {
panic(err)
}
rows, err := stmt.Query()
if err != nil {
//SQL执行失败,直接panic
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.go
ファイルを作成します
package main
import (
"mysql/util"
)
func main() {
//使用工具获取数据库连接
db := util.InitDB()
//开启事务
tx, err := db.Begin()
if err != nil {
//事务开启失败,直接panic
panic(err)
}
//准备SQL语句
sql := "update tb_user set `password` = ? where `id` = ?"
//对SQL语句进行预处理
stmt, err := db.Prepare(sql)
if err != nil {
panic(err)
}
_, err = stmt.Exec("789", 1)
if err != nil {
//SQL执行失败,直接panic
panic(err)
}
//提交事务
tx.Commit()
}
削除操作
delete
パッケージを作成し、パッケージの下にdelete.go
ファイルを作成します
package main
import (
"mysql/util"
)
func main() {
//使用工具获取数据库连接
db := util.InitDB()
//开启事务
tx, err := db.Begin()
if err != nil {
//事务开启失败,直接panic
panic(err)
}
//准备SQL语句
sql := "delete from tb_user where `id` = ?"
//对SQL语句进行预处理
stmt, err := db.Prepare(sql)
if err != nil {
panic(err)
}
_, err = stmt.Exec(1)
if err != nil {
//SQL执行失败,直接panic
panic(err)
}
//提交事务
tx.Commit()
}