golang第五天

栏目: Go · 发布时间: 6年前

内容简介:打卡时间: 21:04

学习 go 操作mysql,crud测试

  • 代码
package main

/**
 * 使用go-sql-driver/mysql连接mysql
 *安装方式:go get -u github.com/go-sql-driver/mysql
 */
import (
    _ "github.com/go-sql-driver/mysql"
    "database/sql"
    "fmt"
    "mypath"
    "crypto/md5"
    "encoding/hex"
)

/**
 *声明数据库信息
 */
const (
    DB_TYPE                   = "mysql"
    DB_SOURCE_URL_GOLANG_TEST = "root:password@tcp(localhost:3306)/golang_test?charset=utf8"
    DB_SOURCE_URL_TEST        = "root:password@tcp(localhost:3306)/test?charset=utf8"
)

/**
 * 程序目标:连接mysql,crud, 再完成一个简单的注册功能
 * 操作的表信息
 * CREATE TABLE `baiyi_user` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(255) NOT NULL COMMENT '用户名字',
  `user_password` varchar(255) NOT NULL COMMENT '用户密码',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8mb4;
 */
func main() {

    /**
     *获取数据源的一个连接
     */
    db, err := sql.Open(DB_TYPE, DB_SOURCE_URL_GOLANG_TEST)
    mypath.Check(err)
    defer db.Close()

    //testInsertData(db)
    //testQueryData(db)
    //testUpdateData(db)
    //testDeleteData(db)

    //flag := checkIsExistUser("username1", db)
    //fmt.Println(flag)
    //flag = checkIsExistUser("username2", db)
    //fmt.Println(flag)

    //fmt.Println(register("username1", "liangdaoyuan", db))
    //fmt.Println(register("DoubleJun", "liangdaoyuan", db))

    fmt.Println(login("DoubleJun", "liangdaoyuan2", db))
    fmt.Println(login("DoubleJun", "liangdaoyuan", db))
    fmt.Println(login("DoubleJun2", "liangdaoyuan", db))
}

/**
 * 测试插入
 */
func testInsertData(db *sql.DB)  {
    /**
     *插入就绪
     */
    stmtIns, err := db.Prepare("INSERT INTO baiyi_user(user_name, user_password) VALUES(?,?)")
    mypath.Check(err)
    defer stmtIns.Close()

    var password string
    var username string
    var effectedCount int = 0
    for i := 1; i < 25; i++ {
        password = fmt.Sprintf("520520somuch%d",i)
        password = md5Value(password)
        username = fmt.Sprintf("username%d", i)
        rs, err := stmtIns.Exec(username, password)
        if eff, _ := rs.RowsAffected(); eff>0 {
            effectedCount++
        }
        mypath.Check(err)
    }

}

/**
 *查询操作
 */
func testQueryData(db *sql.DB)  {
    /**
         *执行查询操作
         */
    rows, err := db.Query("SELECT user_name FROM baiyi_user")
    mypath.Check(err)

    columns, err := rows.Columns()
    mypath.Check(err)

    values := make([]sql.RawBytes, len(columns)) //存放数据
    scanArgs := make([]interface{}, len(values)) //存放地址
    for i := range values {
        scanArgs[i] = &values[i]
    }

    // Fetch rows
    for rows.Next() {
        // get RawBytes from data
        err = rows.Scan(scanArgs...) //
        mypath.Check(err)

        // Now do something with the data.
        // Here we just print each column as a string.
        var value string
        for i, col := range values {
            // Here we can check if the value is nil (NULL value)
            if col == nil {
                value = "NULL"
            } else {
                value = string(col)
            }
            fmt.Println(columns[i], ": ", value)
        }
    }


    if err = rows.Err(); err != nil {
        panic(err.Error())
    }

}

/*
 *更新操作
 */
func testUpdateData(db *sql.DB) {
    var updateSql string = "UPDATE baiyi_user SET user_name=? WHERE user_id=?"
    stmt, err := db.Prepare(updateSql)
    mypath.Check(err)
    rs, err := stmt.Exec("Jack", 2)
    defer stmt.Close()
    fmt.Println(rs.RowsAffected())
}

/**
 *
 */
func testDeleteData(db *sql.DB)  {
    var deleteSql string = "DELETE FROM baiyi_user WHERE user_id=?"
    stmt, err := db.Prepare(deleteSql)
    mypath.Check(err)
    rs, err := stmt.Exec(2)
    defer stmt.Close()
    fmt.Println(rs.RowsAffected())
}

/**
 *返回字符串的MD5值
 */
func md5Value(source string) string {
    md5Instnace := md5.New()
    md5Data := md5Instnace.Sum([]byte(source))
    return hex.EncodeToString(md5Data)
}

/**
 *返回结果包装
 */
type ResponseData struct {
    StatusCode int
    Info string
}



/**
 *注册操作
 */
func register(username string, password string, db *sql.DB) ResponseData {
    if checkIsExistUser(username, db) {
        resp := ResponseData{}
        resp.StatusCode=400
        resp.Info = "用户存在"
        return resp
    }

    md5Pwd := md5Value(password)
    insertSql := "INSERT INTO baiyi_user(user_name, user_password) VALUES (?,?)"

    rs, err := db.Exec(insertSql, username, md5Pwd)
    mypath.Check(err)
    if effectedRow, err :=rs.RowsAffected();effectedRow>0 {
        mypath.Check(err)
        resp := ResponseData{}
        resp.StatusCode=200
        resp.Info = "注册成功"
        return resp
    }

    return makeResponse(500, "意料之外的错误")

}

/**
 *检查用户名是否存在
 */
func checkIsExistUser(username string, db *sql.DB) bool{
    querlSql := "SELECT user_id FROM baiyi_user WHERE user_name=?"
    rows, err := db.Query(querlSql, username)
    mypath.Check(err)
    defer rows.Close()
    return rows.Next()
}


/**
 *登录操作
 */
func login(username string, password string, db *sql.DB) ResponseData {
    if !checkIsExistUser(username, db) {
        return makeResponse(400, "该用户不存在,请注册")
    }

    sql := "SELECT user_id FROM baiyi_user WHERE user_name=? AND user_password=? LIMIT 1"
    rows, err := db.Query(sql, username,md5Value(password))
    mypath.Check(err)
    if rows.Next() {
        return makeResponse(200,  "登录成功")
    }

    return makeResponse(200, "密码错误")
}

/*
 *生成对象
 */
func makeResponse(code int, info string) ResponseData  {
    resp := ResponseData{}
    resp.StatusCode=code
    resp.Info = info
    return resp
}

总结

  • go操作mysql

打卡时间: 21:04


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Game Programming Patterns

Game Programming Patterns

Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95

The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具