go语言通过database/sql使用mysql数据库,以及以及第三方sqlx扩展
mysql支持插件式的存储引擎, 常见的存储引擎有:MyISAM,InnoDB
-
MyISAM:
-
查询速度快
-
只支持表锁
-
不支持事务
-
-
InnoDB:
- 整体速度快
- 支持表锁和行锁
- 支持事务
事务:多个SQL操作为一个整体执行
事务特点:ACID
- 原子性
- 一致性
- 隔离性
- 持久性
索引:
原理:B树和B+树
需要掌握的知识点: 索引类型 命中 分库分表 SQL注入 SQL慢优化查询 MYSQL主从 读写分离
database/sql
原生支持连接池,是并发安全的
该标准库没有具体实现,只列出第三方库需要实现的具体内容
mysql驱动
go get github.com/go-sql-driver/mysql
连接数据库
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接数据库
dsn:="root:【填入自己的数据库密码】@tcp(127.0.0.1:3306)/hello"
// 连接数据库
db,err:=sql.Open("mysql",dsn)// 不会校验用户和密码石是否正确,只会校验格式是否正确
if err != nil {
// dsn格式不正确会报错
fmt.Printf(" %s invalid, err:%v\n",dsn,err)
return
}
err=db.Ping()
if err != nil {
fmt.Printf("Open %s failed, err:%v\n",dsn,err)
return
}
db.SetMaxOpenConns(10)// 最大连接数
db.SetMaxIdleConns(3)// 最大空闲连接数
fmt.Println("连接数据库成功!")
}
增删改查
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB //一个连接池
type user struct{
id int `db:"id"`
name string `db:"name"`
age int `db:"age"`
}
func initDB()(err error) {
// 连接数据库
dsn:="root:6862273@tcp(127.0.0.1:3306)/hello"
// 连接数据库
db,err=sql.Open("mysql",dsn)// 不会校验用户和密码石是否正确,只会校验格式是否正确
if err != nil {
// dsn格式不正确会报错
//fmt.Printf(" %s invalid, err:%v\n",dsn,err)
return
}
err=db.Ping()
if err != nil {
//fmt.Printf("Open %s failed, err:%v\n",dsn,err)
return
}
// fmt.Println("连接数据库成功!")
db.SetMaxOpenConns(10)// 最大连接数
db.SetMaxIdleConns(3)// 最大空闲连接数
return
}
func queryone(id int)(u *user){
u=&user{
}
// 1. 查询单条记录的sql语句
sqlstr:="select id,name,age from user where id=?;"
// 2.执行
db.QueryRow(sqlstr,id).Scan(&u.id,&u.name,&u.age) // 从连接池取取一个连接出来,去数据库查询单条记录,并调用scan拿结果
// 3 返回结果
return u
}
func queryMore(n int){
// 1. sql语句
sqlstr:="select id,name,age from user where id > ?"
// 2 执行
rows, err := db.Query(sqlstr, n)
if err!=