golang本身没有提供连接MySQL的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用 https://github.com/Go-SQL-Driver/MySQL
下载驱动:
sudo go get github.com/go-sql-driver/mysql
创建表:
CREATE TABLE `mytest1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
代码:
package main
import (
_ "github.com/go-sql-driver/mysql"
"database/sql"
"fmt"
"log"
)
func NewMydb() *Mydb {
db,err := sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
if err != nil {
log.Println("fail to open database:",err.Error())
return new(Mydb)
}
return &Mydb{db:db}
}
type Mydb struct {
db *sql.DB
}
type Mytest1 struct {
Id int
Name string
}
/*
获得多行记录
*/
func (m *Mydb) GetRows(sqlStr string) *[]Mytest1{
row,err := m.db.Query(sqlStr)
var table []Mytest1
var one Mytest1
if err != nil {
log.Println(err)
return &table
}
for row.Next() {
row.Scan(&one.Id,&one.Name)
table = append(table,one)
}
return &table
}
/*
获得多行记录
*/
func (m *Mydb) GetRow(sqlStr string) *Mytest1{
row := m.db.QueryRow(sqlStr)
table := new(Mytest1)
//匹配到 mytest1 中
err := row.Scan(&table.Id,&table.Name)
if err != nil {
log.Println(err)
return new(Mytest1)
}
return table
}
/*
执行 更新,插入,删除语句
*/
func (m *Mydb) Exec(sqlStr string) int64 {
result,err := m.db.Exec(sqlStr)
if err != nil {
log.Println("exce fail:",err)
return 0
}
//获得影响行数
num,err := result.RowsAffected()
if err != nil {
log.Println("exce fail:",err)
}
return num
}
func (m *Mydb) Close() error {
return m.db.Close()
}
func main() {
mydbObj := NewMydb()
defer mydbObj.Close()
num1 := mydbObj.Exec("INSERT into mytest1(name) VALUES ('a')")
num1 = num1 + mydbObj.Exec("INSERT into mytest1(name) VALUES ('b')")
fmt.Println(num1)
row := mydbObj.GetRow("SELECT * FROM mytest1")
fmt.Println(row)
rows := mydbObj.GetRows("SELECT * FROM mytest1")
fmt.Println(rows)
mydbObj.Exec("DELETE FROM mytest1")
}
上面例子代码实现了,查询单行,多行和增删改。
但是在查询那里绑定数据到type还不是特别方便,还需要改进