导入相关的包
import (
"database/sql" //数据库操作
"fmt" //输出
_ "github.com/go-sql-driver/mysql" //mysql驱动
_ "github.com/mattn/go-oci8" //oracle驱动
)
初始化数据库连接
/*基础代码*/
func initIni() {
// 建议从配置文件中获取
ip = "127.0.0.1"
port = "3306"
username = "root"
password = "123456"
database = "test01"
// ip = "127.0.0.1"
// port = "1521"
// username = "root"
// password = "123456"
// database = "orcl"
}
func InitDB() (db *sql.DB, err error) {
initIni()
//连接字符串
mysqldsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, database)
// oracledsn := fmt.Sprintf("%s/%s@%s:%s/%s", username, password, ip, port, database)
//Open只会验证dsb的格式是否正确,不会验证是否连接成功,同理,密码是否正确也不知道
db, err = sql.Open("mysql", mysqldsn)
// db, err = sql.Open("oci8", oracledsn)
if err != nil {
fmt.Println(`验证格式失败`, mysqldsn, err)
return nil, err
}
// 此时尝试连接数据库,会判断用户,密码,ip地址,端口是否正确
err = db.Ping()
if err != nil {
fmt.Println(`连接数据库失败`, err)
return nil, err
}
//SetMaxOpenConns设置与数据库的最大打开连接数。
//如果MaxIdleConns大于0并且新的MaxOpenConns小于MaxIdleConns,则MaxIdleConns将减少以匹配新的MaxOpenConns限制
//如果n <= 0,则打开的连接数没有限制。默认值为0(无限制)。
//5个连接全部都已标记为使用中,并且需要另一个新连接,则应用程序将被迫等待,直到 5 个连接的其中一个被释放并变为空闲状态
db.SetMaxOpenConns(5)
//SetMaxIdleConns设置空闲连接池中的最大连接数。
//如果MaxOpenConns大于0但小于新的MaxIdleConns,则新的MaxIdleConns将减少以匹配MaxOpenConns限制
//如果n <= 0,则不保留空闲连接。
db.SetMaxIdleConns(0)
//连接池最大空闲时长
//空闲时长达到后,连接会关闭并移出,哪怕空闲连接数已小于MaxIdleConns
//连接后会重置
db.SetConnMaxIdleTime(60 * time.Minute)
// 设置最大生存时间为1小时
// 设置为0,表示没有最大生存期,并且连接会被重用
// forever (这是默认配置).
db.SetConnMaxLifetime(60 * time.Minute)
return db, nil
}
操作_新增
func Insertdb(db *sql.DB, sqlStr string, args ...interface{}) (int64, error) {
// stmt, err := db.Prepare("insert userinfo set username=?,departname=?,created=?,password=?,uid=?")
stmt, err := db.Prepare(sqlStr)
res, err := stmt.Exec(args...)
//LastInsertId()这个函数需要和AUTO_INCREMENT 属性一起使用
id, err := res.LastInsertId()
fmt.Println("插入数据成功:", id)
return id, err
}
操作_查询
func Querydb(db *sql.DB, sqlStr string, args ...interface{}) ([]map[string]string, error) {
rows, err := db.Query(sqlStr, args...)
if err != nil {
return nil, err
}
//函数结束释放链接
defer rows.Close()
//读出查询出的列字段名
cols, _ := rows.Columns()
//values是每个列的值,这里获取到byte里
values := make([][]byte, len(cols))
//query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
scans := make([]interface{}, len(cols))
//让每一行数据都填充到[][]byte里面
for i := range values {
scans[i] = &values[i]
}
results := make([]map[string]string, 0)
//多行遍历
for rows.Next() {
err := rows.Scan(scans...)
if err != nil {
return nil, err
}
row := make(map[string]string, 10)
//一行多字段遍历,
for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
key := cols[k]
row[key] = string(v)
}
results = append(results, row)
}
return results, nil
}
操作_修改
func UpdateDB(db *sql.DB, sqlStr string, args ...interface{}) (int64, error) {
stmt, err := db.Prepare(sqlStr)
res, err := stmt.Exec(args...)
fmt.Println(err)
affect, err := res.RowsAffected() //修改行数
fmt.Println("更新数据:", affect)
return affect, err
}
操作_删除
func DeleteDB(db *sql.DB, sqlStr string, args ...interface{}) (int64, error) {
stmt, err := db.Prepare(sqlStr)
res, err := stmt.Exec(args...)
affect, err := res.RowsAffected() //删除行数
fmt.Println("删除数据:", affect)
return affect, err
}
测试
func main() {
//Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
defer func() { // 必须要先声明defer,否则不能捕获到panic异常
fmt.Println("d")
if err := recover(); err != nil {
fmt.Println(err) // 这里的err其实就是panic传入的内容,55
}
fmt.Println("e")
}()
//建立数据库连接
db, err := InitDB()
if err != nil {
fmt.Println("错误:", err)
}
//函数结束释放链接
defer db.Close()
//新增
iStr := `INSERT INTO test(uid, email,phone) VALUES (?, ?, ?);`
pStr1 := `3`
pStr2 := `32`
iresult, err2 := Insertdb(db, iStr, pStr1, pStr2, `321`)
if err2 != nil {
fmt.Print(`新增条数:`)
fmt.Println(iresult)
}
//查询
qStr := `select email,phone from test where uid = ? and phone = ?`
pStr3 := `3`
pStr4 := `321`
qresult, err1 := Querydb(db, qStr, pStr3, pStr4)
if err1 != nil {
} else {
lresult := len(qresult)
fmt.Println(lresult)
//多行遍历
for _, value := range qresult {
//一行多字段遍历,
for k, v := range value {
fmt.Println(`列名:` + k + ` 值:` + v)
}
fmt.Println(`另起一行:`)
}
}
//修改
uString := `update test set phone = ? where uid = ? and email = ?`
pStr5 := `123`
UpdateDB(db, uString, pStr5, pStr1, pStr2)
//删除
dStr := "Delete from test where uid = ? and phone = ?"
pStr7 := `3`
dresult, err3 := DeleteDB(db, dStr, pStr7, pStr5)
if err3 != nil {
fmt.Print(`删除条数:`)
fmt.Println(dresult)
}
}