MySQL相关语句
show databases ; /* 查看当前数据库*/
CREATE DATABASE [databaseName];/* 创建一个数据库*/
CREATE DATABASE goMySqltest;
use [databaseName] ; /* 使用对应名称数据库*/
use goMySqltest;
CREATE TABLE `user` ( /* 创建一张表*/
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT '',
`age` INT(11) DEFAULT '0',
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
insert into user(name,age) values (?,?); /*插入语句*/
delete from user where id = ?; /*删除语句*/
update user set age = ? where id = ?; /*修改语句*/
select id,name,age from user where id = ?; /*查询语句*/
select id,name,age from user where id >= ?;
Go语言编写
var db *sql.DB // 连接池的一个对象
// 定义数据库中的元素
type user struct {
id int
age int
name string
}
// 连接数据库 函数形式
func initDB() (err error) {
// dsn : Data Source Name
// 格式 : "用户名:密码@tcp(本机IP地址,以'.'分割)/数据库名称"
dsn := "root:root@tcp(192.168.43.160:3306)/goMySqltest"
// 只校验dsn的格式是否正确,不会校验其用户名和密码
db, err = sql.Open("mysql", dsn)
if err != nil {
return
}
// 尝试连接数据库
err = db.Ping()
if err != nil {
return
}
return
}
笔记
- 因为DB类型是值类型,如果以函数调用时需传指针,所以变成全局变量.
- 与此同时,在函数
initDB
中产生了副作用是db, err = sql.Open("mysql", dsn)
一定要看清楚,只能用=
单行查询
// MySql 单行查询
func queryRow(id int) {
sqlStr := "select id,name,age from user where id = ? "
var u1 user
// QueryRow 返回的 Row 是待执行的 sql语句
// Scan 一旦执行完 即可 释放其资源
err := db.QueryRow(sqlStr, id).Scan(&u1.id, &u1.name, &u1.age)
if err != nil {
fmt.Printf("QueryOnce failed , err : %v\n", err)
return
}
fmt.Printf("Id : %d , name : %s , age : %d\n", u1.id, u1.name, u1.age)
}
笔记
- 第一步:编写
sqlStr
语句,然后利用QueryRow
进行查询
- 第二步:执行传入
sqlStr
作为参数QueryRow
,返回的是 Row
是待执行的 sql语句,记住一定要和Scan
配合使用,这样才能让其执行完相应的sql语句并及时释放其资源
- 第三步:
Scan(&u1.id, &u1.name, &u1.age)
传入预先定义的元素接收查询的结果
多行查询
// MySql 多行查询
func queryMulitRow(id_Lowest int) {
sqlStr := "select id,name,age from user where id >= ? "
// Query 返回多行Rows
rows, err := db.Query(sqlStr, id_Lowest)
if err != nil {
fmt.Printf("QueryMulitRow failed err : %v\n", err)
return
}
// 非常重要:关闭rows释放持有的数据库链接
defer rows.Close()
// 循环读取结果集中的数据
for rows.Next() {
var u1 user
err := rows.Scan(&u1.id, &u1.name, &u1.age)
if err != nil {
fmt.Printf("Rows Scan failed , err : %v\n", err)
return
}
fmt.Printf("Id : %d , name : %s , age : %d\n", u1.id, u1.name, u1.age)
}
}
笔记
- 在单行查询的基础上调用
Query
- 第一步:编写
sqlStr
语句
- 第二步:传入参数(
sqlStr
语句)调用函数Query
,rows
接收 Query
返回多行查询结果 记得要defer rows.Close()
- 第三步:利用
rows
自带的Next()
遍历所有查询的行数据
- 第四步:类似单行查询,利用预先定义的元素接收
rows.Scan(&u1.id, &u1.name, &u1.age)
插入操作
// MySql 插入操作
func insertRow(userName string, userAge int) {
sqlStr := "insert into user(name,age) values (?,?)"
res, err := db.Exec(sqlStr, userName, userAge)
if err != nil {
fmt.Printf("Insert failed , err : %s\n", err)
return
}
lastId, err := res.LastInsertId()
if err != nil {
fmt.Printf("get Lastid failed , err : %s\n", err)
return
}
fmt.Printf("Insert Success , The LastInsertID : %v\n", lastId)
// 检验结果 , queryRow(int(lastId))
}
笔记
- 第一步:编写
sqlStr
语句
- 第二步:
db.Exec(sqlStr, userName, userAge)
利用Exec
语句执行相应语句,并传入相关的参数
- 第三步:
lastId, err := res.LastInsertId()
返回其插入后的对应最新ID值,打印出来,即可说明插入成功
更新操作
// MySql 更新操作
func updateRow(userID int, userAge int) {
sqlStr := "update user set age = ? where id = ? "
res, err := db.Exec(sqlStr, userAge, userID)
if err != nil {
fmt.Printf("update failed err : %s\n", err)
return
}
rows, err := res.RowsAffected()
if err != nil {
fmt.Println("row affected failed , err : %s\n", err)
return
}
fmt.Printf("Update Success , Affected Row %d\n", rows)
//queryRow(userID) //检验结果
}
笔记
- 第一步:编写
sqlStr
语句
- 第二步:
db.Exec(sqlStr, userAge, userID)
利用Exec
语句执行相应语句,并传入相关的参数
- 第三步:
res.RowsAffected()
返回其修改后收到印象的行数,打印出来,即可说明修改成功
删除操作
// MySql 删除操作
func deleteRow(userID int) {
sqlStr := "delete from user where id = ? "
res, err := db.Exec(sqlStr, userID)
if err != nil {
fmt.Printf("delete Row failed , err : %s\n", err)
return
}
rows, err := res.RowsAffected()
if err != nil {
fmt.Printf("Row affected failed , err : %s\n", err)
return
}
fmt.Printf("Delete Row Success , Affect Rows %d\n", rows)
// queryMulitRow(0) //检验结果
}
- 第一步:编写
sqlStr
语句
- 第二步:
db.Exec(sqlStr, userID)
利用Exec
语句执行相应语句,并传入相关的参数
- 第三步:
res.RowsAffected()
返回其修改后收到印象的行数,打印出来,即可说明修改成功