go连接数据库提供web服务

Table of Contents

在 Go 语言中连接数据库和提供 Web 服务可以通过标准库和第三方库实现

一、连接数据库(以 MySQL 为例)

1. 安装数据库驱动

go get -u github.com/go-sql-driver/mysql

2. 连接数据库代码

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 连接字符串格式:用户名:密码@协议(地址:端口)/数据库名
    dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 检查连接是否成功
    err = db.Ping()
    if err != nil {
        panic(err)
    }
    fmt.Println("数据库连接成功!")

    // 示例:查询数据
    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            panic(err)
        }
        fmt.Printf("ID: %d, Name: %s\n", id, name)
    }
}

二、提供 Web 服务

1. 使用标准库 net/http

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 注册路由和处理函数
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "欢迎访问首页!")
    })

    http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })

    // 启动服务器,监听8080端口
    fmt.Println("服务器启动,监听地址:http://localhost:8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        panic(err)
    }
}

三、结合数据库和 Web 服务

1. 完整示例:查询数据并返回 JSON

package main

import (
    "database/sql"
    "encoding/json"
    "net/http"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    // 连接数据库
    dsn := "user:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 注册HTTP路由
    http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
        // 查询数据库
        rows, err := db.Query("SELECT id, name FROM users")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer rows.Close()

        // 解析结果
        var users []User
        for rows.Next() {
            var u User
            if err := rows.Scan(&u.ID, &u.Name); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            users = append(users, u)
        }

        // 返回JSON响应
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(users)
    })

    // 启动服务器
    http.ListenAndServe(":8080", nil)
}

四、关键注意事项

  1. 连接池配置
    通过 db.SetMaxOpenConns(100) 等方法优化数据库连接池。

  2. 防止 SQL 注入
    使用参数化查询,避免直接拼接 SQL:

    result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
    
  3. 错误处理
    始终检查并处理数据库操作和 HTTP 请求中的错误。

  4. 性能优化
    对于复杂路由,可以使用高性能路由库如 gorilla/muxgin

明天再详细了解一下 Android 的 Window 和 WindowManager