Go
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
type user struct {
id int
name string
age int
}
// 建立连接
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/mysqltest"
db, err = sql.Open("mysql", dsn)
if err != nil {
return
}
fmt.Println("连接数据库成功")
db.SetMaxIdleConns(10)
return
}
// 增加
func insert() {
sqlStr := `insert into usertest(name,age) values("星期三",30)`
ret, err := db.Exec(sqlStr)
if err != nil {
fmt.Printf("insert failed,err:%v\n", err)
return
}
id, err := ret.LastInsertId() //获取ID
if err != nil {
fmt.Printf("get id failed ,err:%v\n", err)
return
}
fmt.Println("id", id)
}
// 删除
func deleteRow(id int) {
sqlStr := `delete from usertest where id=?`
ret, err := db.Exec(sqlStr, id)
if err != nil {
fmt.Printf("delete failed,err:%v\n", err)
return
}
n, _ := ret.RowsAffected()
fmt.Printf("删除了%d行的数据\n", n)
}
// 改update
func updateRow(newAge int, id int) {
sqlStr := `update usertest set age=? where id=?`
ret, err := db.Exec(sqlStr, newAge, id)
if err != nil {
fmt.Printf("update failed,err:%v\n", err)
return
}
n, _ := ret.RowsAffected()
fmt.Printf("更新了%d行数据\n", n)
}
// 查询-单行
func query(id int) {
sqlStr := "select id,name,age from usertest where id=?;"
rowObj := db.QueryRow(sqlStr, id) //用于执行单行查询的方法
var u1 user
rowObj.Scan(&u1.id, &u1.name, &u1.age) //将查询结果扫描到变量中
fmt.Printf("u1:%#v\n", u1)
}
// 查询-多行
func queryMore(n int) {
sqlStr := "select id,name,age from user where id >?;"
rows, err := db.Query(sqlStr, n)
if err != nil {
fmt.Printf("%s query failed,err:%v\n", sqlStr, err)
return
}
defer rows.Close()
for rows.Next() {
var u1 user
rows.Scan(&u1.id, &u1.name, &u1.age)
fmt.Printf("u1:%#v\n", u1)
}
}
// 模糊查询
func queryNameLike(pattern string) {
sqlStr := "SELECT id,name,age FROM usertest WHERE name LIKE ?"
rows, err := db.Query(sqlStr, "%"+pattern+"%")
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
defer rows.Close()
fmt.Println("模糊查询结果:")
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("ID:%d Name:%s Age:%d\n", u.id, u.name, u.age)
}
// 检查遍历是否出错
if err = rows.Err(); err != nil {
fmt.Printf("rows iteration error:%v\n", err)
}
}
// 年龄范围查询
func queryByAgeRange(minAge, maxAge int) {
sqlStr := `SELECT id, name, age
FROM usertest
WHERE age BETWEEN ? AND ?
ORDER BY age DESC`
rows, err := db.Query(sqlStr, minAge, maxAge)
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
defer rows.Close()
fmt.Printf("年龄%d~%d查询结果:\n", minAge, maxAge)
for rows.Next() {
var u user
if err := rows.Scan(&u.id, &u.name, &u.age); err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("ID:%d Name:%s Age:%d\n", u.id, u.name, u.age)
}
if err = rows.Err(); err != nil {
fmt.Printf("rows error:%v\n", err)
}
}
// 3. 预处理更新
func preparedUpdate(id int, newName string, newAge int) {
// 准备预处理语句
stmt, err := db.Prepare("UPDATE usertest SET name=?, age=? WHERE id=?")
if err != nil {
fmt.Printf("prepare failed, err:%v\n", err)
return
}
defer stmt.Close()
// 执行预处理语句
result, err := stmt.Exec(newName, newAge, id)
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
return
}
// 检查影响行数
rowsAffected, err := result.RowsAffected()
if err != nil {
fmt.Printf("get rows affected failed: %v\n", err)
return
}
fmt.Printf("更新成功,影响%d行\n", rowsAffected)
}
func main() {
err := initDB()
if err != nil {
fmt.Printf("init db failed,err:%v\n", err)
}
//insert() //增加
//deleteRow(3) //删除
//updateRow(89, 1) //更新
//query(1) // 单行查询
//queryMore(1) //多行查询
preparedUpdate(1, "大姐", 66)
}
效果
