文章目录
一、重点内容:
知识要点有哪些?
1、理解database/SQL
2、数据库表数据的CRUD
二、详细知识点介绍:
1、数据库导入
下载导入数据库驱动:
go get github.com/go-sql-driver/mysql
创建数据库表:
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(20) DEFAULT '',
`age` INT(11) DEFAULT '0',
`score` int default 0
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
创建数据库连接:
db, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
2、数据库的CRUD:
初始化:
/*
*
初始化
*/
var db *sql.DB
func init() {
db1, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
db = db1
if err != nil {
log.Fatal(err)
}
}
查询数据:
方便查询我们先建立一个实体结构体:
type user struct {
id int
username string
age int
score int
}
1、多行查询:
//go:build ignore
// +build ignore
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
type user struct {
id int
username string
age int
score int
}
var db *sql.DB
func main() {
db1, err := sql.Open("mysql", "root:XXXX@tcp(127.0.0.1:3306)/mybatis")
db = db1
if err != nil {
log.Fatal(err)
}
rows, err := db.Query("select * from user ")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var user1 user
rows.Scan(&user1.id, &user1.username, &user1.age, &user1.score)
fmt.Println(user1.id, user1.username, user1.age, user1.score)
}
defer rows.Close()
}
测试:
2、单行查询:
//go:build ignore
// +build ignore
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
type user struct {
id int
username string
age int
score int
}
var db *sql.DB
func main() {
db1, err := sql.Open("mysql", "root:XXXXX@tcp(127.0.0.1:3306)/mybatis")
db = db1
sqlStr := "select * from user where id=?"
var u user
// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.username, &u.age, &u.score)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.username, u.age)
defer rows.Close()
}
测试:
3、预编译查询
//go:build ignore
// +build ignore
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
type user struct {
id int
username string
age int
score int
}
func main() {
open, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
if err != nil {
log.Fatal(err)
}
sqlStr := "select * from user where id>?"
prepare, err := open.Prepare(sqlStr)
if err != nil {
log.Fatal(err)
}
query, err := prepare.Query(1)
for query.Next() {
var u user
query.Scan(&u.id, &u.username, &u.age, &u.score)
fmt.Println(u.id, u.username, u.age, u.score)
}
query.Close()
open.Close()
}
测试:
插入数据:
/*
插入新的数据,ID自增
*/
func insertRow(name string, age int, score int) {
sqlStr := "insert into user(username,age,score) values (?,?,?)"
exec, err := db.Exec(sqlStr, name, age, score)
if err != nil {
log.Fatal(err)
}
id, err := exec.LastInsertId()
if err != nil {
log.Fatal(err)
}
fmt.Println(id)
}
更新数据:
/*
更新数据
*/
func updateRow(id int, score int) {
sqlStr := "update user set score=? where id=?"
exec, err := db.Exec(sqlStr, score, id)
if err != nil {
log.Fatal(err)
}
affected, err := exec.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("影响行数:", affected)
}
删除数据:
/*
根据ID删除数据
*/
func deleteRow(id int) {
sqlStr := "delete from user where id =?"
exec, err := db.Exec(sqlStr, id)
if err != nil {
log.Fatal(err)
}
affected, err := exec.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("影响行数:", affected)
}
3、数据库设计原理
4、完整代码:
//go:build ignore
// +build ignore
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
type user struct {
id int
username string
age int
score int
}
func main() {
fmt.Println("查询所有记录")
queryAll()
fmt.Println("根据ID查询")
queryRowDemo(1)
fmt.Println("插入新的数据")
insertRow("罗某", 21, 78)
fmt.Println("查询分数大于多少的数据")
queryByScore(96)
fmt.Println("更新数据")
updateRow(3, 50)
fmt.Println("删除数据")
deleteRow(6)
}
/*
*
初始化
*/
var db *sql.DB
func init() {
db1, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
db = db1
if err != nil {
log.Fatal(err)
}
}
/*
查询所有记录
*/
func queryAll() {
rows, err := db.Query("select * from user ")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var user1 user
rows.Scan(&user1.id, &user1.username, &user1.age, &user1.score)
fmt.Println(user1.id, user1.username, user1.age, user1.score)
}
defer rows.Close()
}
/*
根据ID查询
*/
func queryRowDemo(id int) {
sqlStr := "select * from user where id=?"
var u user
// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
err := db.QueryRow(sqlStr, id).Scan(&u.id, &u.username, &u.age, &u.score)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.username, u.age)
}
/*
条件查询,分数大于多少的数据
*/
func queryByScore(score int) {
sqlStr := "select * from user where score>?"
prepare, err := db.Prepare(sqlStr)
if err != nil {
log.Fatal(err)
}
query, err := prepare.Query(score)
for query.Next() {
var u user
query.Scan(&u.id, &u.username, &u.age, &u.score)
fmt.Printf("id:%d name:%s age:%d score:%d\n", u.id, u.username, u.age, u.score)
}
}
/*
插入新的数据,ID自增
*/
func insertRow(name string, age int, score int) {
sqlStr := "insert into user(username,age,score) values (?,?,?)"
exec, err := db.Exec(sqlStr, name, age, score)
if err != nil {
log.Fatal(err)
}
id, err := exec.LastInsertId()
if err != nil {
log.Fatal(err)
}
fmt.Println(id)
}
/*
更新数据
*/
func updateRow(id int, score int) {
sqlStr := "update user set score=? where id=?"
exec, err := db.Exec(sqlStr, score, id)
if err != nil {
log.Fatal(err)
}
affected, err := exec.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("影响行数:", affected)
}
/*
根据ID删除数据
*/
func deleteRow(id int) {
sqlStr := "delete from user where id =?"
exec, err := db.Exec(sqlStr, id)
if err != nil {
log.Fatal(err)
}
affected, err := exec.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("影响行数:", affected)
}
三、课后个人总结:
这次比较深入地去了解学习了go中数据库的操作,收获颇多。也开始了GORM库的学习,下一篇文章记录GORM的使用。