GO MySQL数据库操作封装

Go  语言操作数据库,

数据库连接封装:

package Test_dbimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log""sync"
)var (DB       *sql.DBpoolOnce sync.Once
)func NewConnection() (*sql.DB, error) {m_db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/Test")if err != nil {// fmt.Println("数据源的名称不合法!")log.Fatalln("db connect err:", err)return nil, err}//Ping检查与数据库的连接是否仍有效,如果需要会创建连接。connect_err := m_db.Ping()if connect_err != nil {log.Fatalf("连接失败!error:%v", connect_err)return nil, err}// fmt.Println("连接数据库成功")m_db.SetMaxIdleConns(100)m_db.SetMaxOpenConns(300)// m_db.SetConnMaxLifetime(time.Second * 300)m_db.SetConnMaxLifetime(0)DB = m_db//结构体实例化GetDBStats()return m_db, nil
}func GetDB() (*sql.DB, error) {var err errorpoolOnce.Do(func() {DB, err = NewConnection()if err != nil {fmt.Println("Connection err :", err)}})err = DB.Ping()if err != nil {DB.Close()DB, err = NewConnection()if err != nil {return nil, err}}return DB, nil
}func GetDBStats() {info1 := fmt.Sprintf("数据库状态 :\n最大连接数:%d,  当前总连接数;%d,  已使用: %d, 空闲数量:%d \n",DB.Stats().MaxOpenConnections,DB.Stats().OpenConnections,DB.Stats().InUse,DB.Stats().Idle)info2 := fmt.Sprintf("等待连接数量:%d,  等待创建新连接时长(秒):%f, 空闲超限关闭数量:%d, 空闲超时关闭数量:%d, 连接超时关闭数量:%d \n",DB.Stats().WaitCount,DB.Stats().WaitDuration.Seconds(),DB.Stats().MaxIdleClosed,DB.Stats().MaxIdleTimeClosed,DB.Stats().MaxLifetimeClosed,)info := info1 + info2_, _ = fmt.Println(info)
}

数据库操作封装:

package Test_dbimport ("database/sql""encoding/json""errors""fmt""log""reflect""strings"utils 
)func QueryRecord(sql string) (string, error) {conn, err := GetDB()if err != nil {return " ", err}stm, pre_err := conn.Prepare(sql)if pre_err != nil {return " ", errors.New("QueryRecord prepare err: " + pre_err.Error())}defer stm.Close()rows, err := stm.Query()if err != nil {return " ", err}defer rows.Close()columns, err := rows.Columns()if err != nil {return " ", err}count := len(columns)value := make([]map[string]interface{}, 0)for rows.Next() {values := make([]interface{}, count)valuePtrs := make([]interface{}, count)for i, _ := range columns {valuePtrs[i] = &values[i]}if err := rows.Scan(valuePtrs...); err != nil {log.Fatal(err)}var m map[string]interface{}m = make(map[string]interface{})for i := range columns {var v interface{}val := values[i]b, ok := val.([]byte)if ok {str := string(b)if (strings.HasPrefix(str, "{") && strings.HasSuffix(str, "}")) ||(strings.HasPrefix(str, "[{") && strings.HasSuffix(str, "}]")) {_ = json.Unmarshal([]byte(str), &v)} else {v = string(b)}} else {v = val}m[columns[i]] = v}value = append(value, m)}jsonValue, err := json.Marshal(value)if err != nil {return " ", err}return string(jsonValue), nil
}func InsertDB(strTableName string, jsonValue interface{}) (int64, error) {strSql := fmt.Sprintf("INSERT INTO  %v  ( ", strTableName)var parms []stringparms = utils.GetNameJosnValue(jsonValue)for i, v := range parms {if i == len(parms)-1 {strSql += "`" + v + "`"} else {strSql += "`" + v + "`, "}}strSql += ") VALUES "vals := []interface{}{}sqlQuery := fmt.Sprintf("(%s)", strings.Join(strings.Split(strings.Repeat("?", len(parms)), ""), ","))var n sql.NullStringswitch obj := jsonValue.(type) {case map[string]interface{}:strSql += sqlQueryfor _, k := range parms {s := utils.GetNameToStringValue(k, obj)if len(s) == 0 {vals = append(vals, n)} else {vals = append(vals, s)}}case []interface{}:for index, v := range obj {if index == len(obj)-1 {strSql += sqlQuery} else {strSql += sqlQuery + ", "}m := v.(map[string]interface{})for _, k := range parms {s := utils.GetNameToStringValue(k, m)if len(s) == 0 {vals = append(vals, n)} else {vals = append(vals, s)}}}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}conn, err := GetDB()if err != nil {return 0, err}tx, _ := conn.Begin()stmt, err := conn.Prepare(strSql)if err != nil {fmt.Printf("prepare failed, err:%v\n", err)return 0, err}defer stmt.Close()res, err := stmt.Exec(vals...)if err != nil {fmt.Println("err: ", err)fmt.Println("err: ", err.Error())tx.Rollback()return 0, err}tx.Commit() // 提交事务id, _ := res.LastInsertId()fmt.Printf("lastId: %d insert success! /n", id)return id, err
}func UpdateDB(strTableName string, jsonValue interface{}, strCondition string) (bool, error) {strValues := ""switch obj := jsonValue.(type) {case map[string]interface{}:for k, _ := range obj {fmt.Println("k:", k, " \n")if strValues == "" {fmt.Println("k2:", k, " \n")strValues = fmt.Sprintf("%v='%v'", k, utils.GetNameToStringValue(k, obj))} else {strValues += fmt.Sprintf(",%v='%v'", k, utils.GetNameToStringValue(k, obj))}}case []interface{}:fmt.Println("Multiple updates are currently not supported !")breakfor _, v := range obj {m := v.(map[string]interface{})for k, _ := range m {if strValues == "" {strValues = fmt.Sprintf("%v='%v'", k, utils.GetNameToStringValue(k, m))} else {strValues += fmt.Sprintf(",%v='%v'", k, utils.GetNameToStringValue(k, m))}}}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}if strValues == "" {return false, nil}strSql := fmt.Sprintf("UPDATE %v  SET %v  %v  ", strTableName, strValues, strCondition)vals := []interface{}{}conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql, vals...)if err != nil {return false, err}id, _ := res.LastInsertId()fmt.Printf("lastId: %d insert success! /n", id)return true, nil
}func Delete(strSql string) (bool, error) {conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql)if err != nil {return false, err}fmt.Printf("res:%v  /n", res)return true, err
}func Exec(strSql string) (bool, error) {conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql)if err != nil {return false, err}fmt.Printf("res:%v  /n", res)return true, err
}

Go 语言返回的也是json 格式,注意接口和map  数组的转换

utils 工具

package Test_utilsimport ("encoding/json""fmt""reflect""strconv""strings"
)/*
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
种类(Kind)指的是对象归属的品种,在 reflect 包中有如下定义:
Invalid Kind = iota  // 非法类型
Bool								 // 布尔型
Int								   // 有符号整型
Int8								 // 有符号8位整型
Int16								 // 有符号16位整型
Int32								 // 有符号32位整型
Int64								 // 有符号64位整型
Uint								 // 无符号整型
Uint8								 // 无符号8位整型
Uint16							 // 无符号16位整型
Uint32							 // 无符号32位整型
Uint64							 // 无符号64位整型
Uintptr							 // 指针
Float32							 // 单精度浮点数
Float64							 // 双精度浮点数
Complex64						 // 32位复数类型
Complex128					 // 64位复数类型
Array								 // 数组
Chan								 // 通道
Func								 // 函数
Interface						 // 接口
Map								   // 映射
Ptr								   // 指针
Slice								 // 切片
String							 // 字符串
Struct							 // 结构体
UnsafePointer				 // 底层指针
*/func GetNameJosnValue(jsonValue interface{}) []string {var parms []stringswitch obj := jsonValue.(type) {case map[string]interface{}:for k, _ := range obj {parms = append(parms, k)}case []interface{}:for _, v := range obj {for m, _ := range v.(map[string]interface{}) {parms = append(parms, m)}return parms}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}return parms
}func GetNameToStringValue(k string, m map[string]interface{}) string {value := ""objCheck := reflect.ValueOf(m[k])switch objCheck.Kind() {case reflect.String:value = m[k].(string)case reflect.Int:value = string(m[k].(int))case reflect.Int32:value = string(m[k].(int32))case reflect.Int64:value = strconv.FormatInt(m[k].(int64), 10)case reflect.Float32:value = fmt.Sprintf("%f", m[k].(float32))case reflect.Float64:value = strconv.FormatFloat(m[k].(float64), 'f', -1, 64)case reflect.Map:result, err := json.Marshal(m[k])if err != nil {fmt.Println("json Marshal failed :", err)}value = string(result)case reflect.Slice:tmp := m[k].([]interface{})result, err := json.Marshal(tmp)if err != nil {fmt.Println("json Marshal failed :", err)}value = string(result)case reflect.Interface:for _, v := range m {for t, _ := range v.(map[string]interface{}) {value = string(t)}}default:fmt.Printf("m[k] %v is of unknown type :", m[k], reflect.TypeOf(m[k]))}return value
}func InterfaceToMapByReflection(v interface{}) map[string]interface{} {result := make(map[string]interface{})fmt.Println("InterfaceToMapByReflection v:", reflect.TypeOf(v))switch obj := v.(type) {case map[string]interface{}:result = objcase []interface{}:for _, v := range obj {result = v.(map[string]interface{})break}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}return result
}func SplitSeps(s string, seps ...string) interface{} {result := []interface{}{}if len(seps) == 0 {return result}tmp := strings.Split(s, seps[0])for _, sep := range seps[1:] {for _, r := range tmp {temp := strings.Split(r, sep)m := make(map[string]interface{})m["key"] = temp[0]m["value"] = temp[1]result = append(result, m)}}return result
}func SplitSepsToArray(s string, seps ...string) []string {if len(seps) == 0 {return []string{s}}result := strings.Split(s, seps[0])for _, sep := range seps[1:] {var temp []stringfor _, r := range result {temp = append(temp, strings.Split(r, sep)...)}result = temp}return result
}func Split(s, sep string) []string {if s == "" {return nil}return strings.Split(s, sep)
}func MapToJson(i interface{}) string {//将map数据转化为JSON格式字符串bytes, err := json.Marshal(i)//判断是否转换成功if err != nil {fmt.Println("JSON格式转换失败,错误信息为:", err)}return string(bytes)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序蓝牙连接 uniApp蓝牙连接设备

蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…

游戏开发团队配置与协作流程

游戏开发技术图谱 - 知乎 游戏制作的流程是什么啊&#xff1f; - 知乎 系统策划&#xff1a;一张图梳理游戏系统的生产流程 - 知乎 游戏开发入门&#xff08;十一&#xff09;游戏引擎架构-CSDN博客

全局定制序列化

作用:将返回实体类中的属性如果为null 变成"" package com.example.micrweb.config;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.f…

linux驱动——原子操作

linux驱动——原子操作 原子操作 API Linux 内核定义了叫做 atomic_t 的结构体来完成整型数据的原操作&#xff0c;在使用是使用原子变量来代替整型变量。此结构体定义在 include/linux/types.h 文件中&#xff0c;定义如下&#xff1a; typedef struct {int counter; }atom…

websocket与node.js实现

什么是 websocket&#xff1f; websoket 是一种网络通信协议&#xff0c;基于 tcp 连接的全双工通信协议&#xff08;客户端和服务器可以同时收发信息&#xff09;&#xff0c;值得注意的是他不基于 http 协议&#xff0c;websocket 只有在建立连接的时候使用到 http 协议进行…

Kubernetes(k8s)之Pod详解

文章目录 Kubernetes之Pod详解一、Pod介绍pod结构pod定义 二、Pod配置pod基本配置镜像拉取策略启动命令环境变量端口设置资源配额 三、Pod生命周期创建和终止初始化容器钩子函数容器探测重启策略 四、Pod调度定向调度NodeNameNodeSelector 亲和性调度NodeAffinityPodAffinityPo…

风电场叶片运输车模型-FBX格式-带动画-数字孪生场景搭建

FBX格式的风电场中叶片运输车辆模型&#xff0c;按照真实尺寸建模&#xff0c;车辆多个部位带动画效果&#xff0c;适用于风电场三维数字化场景和风电场数字孪生使用&#xff0c;也可以用来作为各种三维平台的测试模型。 模型效果图 下载地址 叶片运输车模型下载地址

php生成xml数据

在PHP中&#xff0c;你可以使用以下几种方法生成XML数据&#xff1a; 使用DOM扩展&#xff1a; $xml new DOMDocument(1.0, UTF-8); $root $xml->createElement(root); $xml->appendChild($root); $child $xml->createElement(child); $root->appendChild($ch…

使用 Raspberry Pi、Golang 和 HERE XYZ 制作实时地图

到目前为止&#xff0c;您可能已经看过我的一些与 Raspberry Pi 和位置数据相关的教程。我是这些小型物联网 (IoT) 设备的忠实粉丝&#xff0c;并编写了有关使用 Golang 进行 WLAN 定位 和 使用 Node.js 进行 GPS 定位的教程。 我想继续沿着 Golang 路线&#xff0c;做一个关于…

目标检测YOLO实战应用案例100讲-基于YOLO的小目标检测改进算法

目录 前言 国内外研究现状 常规尺寸目标检测算法 小目标的检测算法

stm32定时器输入捕获模式

频率测量 频率测量有两种方法 测频法&#xff1a;在闸门时间T内&#xff0c;对上升沿或下降沿计次&#xff0c;得到N&#xff0c;则评率fxN/T测周法&#xff1a;两个上升沿内&#xff0c;以标准频率fc计次得到N&#xff0c;则频率fx fc/N中界频率&#xff1a;测频法和测周法误…

Spark的通用运行流程与Spark YARN Cluster 模式的运行流程

Spark的通用运行流程 集群启动后Worker节点会向Master节点心跳汇报资源Client向Driver提交APP&#xff0c;根据不同的运行模式在不同的地方创建Driver。Driver以粗粒度的方式向Master注册应用并申请资源&#xff08;在Application执行之前&#xff0c;将所有的资源申请完毕&…

助力企业前行——ScalaSpark最佳实践课程

时间飞逝&#xff0c;转眼间我们的Scala&Spark培训课程已经圆满结束&#xff01;在这段精彩的学习旅程中&#xff0c;你们展现了坚韧、决心和追求卓越的品质。 scala(Scalable Language)是一种多范式的编程语言&#xff0c;其设计的初衷是要集成面向对象编程和函数式编程的…

Cookie与Session知识

目录 一.Cookie与Session的发展史 1.Cookie的发展史 2.Session的发展史 3.Cookie和Session的关系 4.总结 二.Cookie与Session详解 1.Cookie 2.Session 3.token 4.总结 三.Django操作Cookie 1.设置Cookie 2.获取Cookie 3.设置超时时间 4.注销Cookie 5.登录功能实…

【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)&#xff1f; 独立成分分析简单来说&#xff0c;就是给定很多的样本X&#xff0c;通…

Springboot-热部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

C++ DAY08 异常

概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在 , 空指针&#xff0c;内存不足 等等&#xff09; 在 C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的返回值标识错误&#xff1b; 二是使用 errn…

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…

PDF转Word,1行Python代码就够了,免费用

大家好&#xff0c;这里是程序员晚枫。 今年十一假期没出去旅游&#xff0c;在家里更新一套原创课程&#xff0c;&#x1f449;给小白的《50讲Python自动化办公》。 所有功能&#xff0c;都只需要1行代码&#xff0c;非常适合非程序员入门Python使用。 目前全网播放量直逼100…

RK3588平台开发系列讲解(嵌入式AI篇)RKNPU详解

文章目录 一、CPU、GPU、FPGA和NPU介绍二、CPU、GPU、FPGA和NPU区别三、NPU 应用四、RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍什么是RKNPU。 一、CPU、GPU、FPGA和NPU介绍 二、CPU、GPU、FPGA和NPU区别 若考虑成本、功耗、计算能力以及体…