基于go的简单管理系统(增删改查)

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)
}

效果

相关推荐
SMF1919几秒前
【Linux】完美解决缩略图工具gm调用java.io.FileNotFoundException: gm问题
java·开发语言·python
念何架构之路6 分钟前
路由注册:RouterGroup(routergroup.go)
开发语言·后端·golang
小当家.1059 分钟前
LLM服务缓存与连接池管理:三层缓存架构与ChatClient池化
java·后端·spring·缓存·llm·agent
Darkwanderor14 分钟前
C++的流简介和简单使用
开发语言·c++
人间凡尔赛26 分钟前
当 AI Agent 攻陷网关:Istio agentgateway 与 Gateway API Inference Extension 实战解析
后端·云原生·架构
北冥you鱼26 分钟前
深入解析 Go 中 sync.YAML.Unmarshal:如何将 YAML 数据填充到 Config 结构体
开发语言·算法·golang
wwwzhouzy28 分钟前
SpringBoot 响应式编程
java·spring boot·后端·响应式编程
Python私教33 分钟前
请求超时不等于失败:把写操作恢复设计成事实回读
后端·python
goldbin_zhang_xu37 分钟前
我用 Go 重写了一个 OpenClaw 框架:这就是 GoClaw
开发语言·后端·golang·agent框架·goclaw·双循环机制
IT_陈寒37 分钟前
Redis的KEYS命令差点把我的生产环境拖垮,改用SCAN吧
前端·人工智能·后端