在工作之余需要进行api开发,记录下go学习的中的代码
引入 第三方和系统框架
import (
"database/sql" // 导入sql
"fmt" _ "github.com/go-sql-driver/mysql" // 引入mysql 驱动
//"github.com/widuu/gojson"
"time"
"crypto/md5"
"encoding/hex"
"strconv"
)
定义结钩体,接口用于连接数据库
//定义结钩体,接口
type MysqlDb struct {
KKDb *sql.DB //定义结构体
}
打开数据库操作
//打开数据库
func (f *MysqlDb) KKOpenMysql() bool {
Odb, err := sql.Open("mysql", KKDbUsername+":"+KKDbPassowrd+"@tcp("+KKDbHostsip+")/"+KKDbname+"?charset=utf8")
//Odb, err := sql.Open("mysql","root:szy920514@tcp(localhost:3306)/NewPro?charset=utf8")
if err != nil {
return false
}else{
f.KKDb = Odb
return true
}
}
关闭数据库操作
// 关闭数据库
func (f *MysqlDb) KKCloseMysql() { //关闭
defer f.KKDb.Close()
fmt.Println("链接数据库成功...........已经关闭")
}
插入一条数据:程序默认打开数据库
/*
插入一条数据:程序默认打开数据库
sqlString:sql语句,注意values?占位符
sqlValues:插入的的值
*/
func (f *MysqlDb)KKInsertValues(sqlString string,sqlValues ...interface{} ) bool {
//err := f.KKDb.Exec(("INSERT INTO User(age) values (20)"))
t := f.KKOpenMysql()
if t ==false {
return false
}
stmt, stErr := f.KKDb.Prepare(sqlString)
if stErr == nil {
_, err := stmt.Exec(sqlValues...)
if err == nil {
fmt.Println("数据插入成功!")
return true
}else{
fmt.Println(err)
fmt.Println("数据插入失败!")
stmt.Close()
return false
}
}else {
fmt.Println("stmt 数据插入失败!")
stmt.Close()
return false
}
}
更新数据:
/*更新数据:
sqlString:sql语句,注意values?占位符
sqlValues:插入的的值
*/
func (f *MysqlDb)KKUpdataValues(sqlString string,sqlValues ...interface{}) bool {
t := f.KKOpenMysql()
if t ==false {
return false
}
stmt, stErr := f.KKDb.Prepare(sqlString)
if stErr == nil {
_,err := stmt.Exec(sqlValues ...)
if err == nil {
fmt.Println("数据更新成功!")
stmt.Close()
return true
}else {
fmt.Println("数据更新失败!")
stmt.Close()
return false
}
}else {
fmt.Println("stmt 数据更新失败!")
stmt.Close()
return true
}
}
删除一条数据:
/*
删除一条数据:
sqlString:sql语句,注意values?占位符
sqlValues:插入的的值 https://github.com/jmoiron/sqlx 序列化
*/
func (f *MysqlDb)KKDeleteValues(sqlString string,sqlValues ...interface{}) bool {
t := f.KKOpenMysql()
if t ==false {
return false
}
stmt, stErr := f.KKDb.Prepare(sqlString)
if stErr == nil {
_,err := stmt.Exec(sqlValues ...)
if err == nil {
fmt.Println("数据删除成功!")
stmt.Close()
return true
}else{
fmt.Println("数据删除失败!")
stmt.Close()
return false
}
}else {
fmt.Println("数据删除失败!")
stmt.Close()
return false
}
}
查询数据
//取一行数据,注意这类取出来的结果都是string
func (f *MysqlDb)KKFetchRow( sqlstr string, args ...interface{}) (*map[string]string, error) {
f.KKOpenMysql()
stmtOut, err := f.KKDb.Prepare(sqlstr)
if err != nil {
panic(err.Error())
}
defer stmtOut.Close()
rows, err := stmtOut.Query(args...)
if err != nil {
panic(err.Error())
}
columns, err := rows.Columns()
if err != nil {
panic(err.Error())
}
values := make([]sql.RawBytes, len(columns))
scanArgs := make([]interface{}, len(values))
ret := make(map[string]string, len(scanArgs))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
panic(err.Error())
}
var value string
for i, col := range values {
if col == nil {
value = "NULL"
} else {
value = string(col)
}
ret[columns[i]] = value
}
break //get the first row only
}
return &ret, nil
}
//取多行,注意这类取出来的结果都是string
func (f *MysqlDb)KKFetchRows(sqlstr string, args ...interface{}) (*[]map[string]string, error) {
f.KKOpenMysql()
stmtOut, err := f.KKDb.Prepare(sqlstr)
if err != nil {
panic(err.Error())
}
defer stmtOut.Close()
rows, err := stmtOut.Query(args...)
if err != nil {
panic(err.Error())
}
// 数据库字段名字
columns, err := rows.Columns()
if err != nil {
panic(err.Error())
}
values := make([]sql.RawBytes, len(columns))
scanArgs := make([]interface{}, len(values))
ret := make([]map[string]string, 0)
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
panic(err.Error())
}
var value string
vmap := make(map[string]string, len(scanArgs))
for i, col := range values {
if col == nil {
value = "NULL"
} else {
value = string(col)
}
vmap[columns[i]] = value
}
ret = append(ret, vmap)
}
return &ret, nil
}