中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

做招標代理應關注的網(wǎng)站網(wǎng)站推廣技巧有哪些

做招標代理應關注的網(wǎng)站,網(wǎng)站推廣技巧有哪些,做醫(yī)療器械網(wǎng)站,佛山網(wǎng)站建設價格多少概述 如果您沒有Golang的基礎,應該學習如下前置課程。 Golang零基礎入門Golang面向對象編程Go Web 基礎Go語言開發(fā)REST API接口_20240728 基礎不好的同學每節(jié)課的代碼最好配合視頻進行閱讀和學習,如果基礎比較扎實,則閱讀本教程鞏固一下相…

概述

如果您沒有Golang的基礎,應該學習如下前置課程。

  • Golang零基礎入門
  • Golang面向對象編程
  • Go Web 基礎
  • Go語言開發(fā)REST API接口_20240728

基礎不好的同學每節(jié)課的代碼最好配合視頻進行閱讀和學習,如果基礎比較扎實,則閱讀本教程鞏固一下相關知識點即可,遇到不會的知識點再看視頻。

視頻課程

最近發(fā)現(xiàn)越來越多的公司在用Golang了,所以精心整理了一套視頻教程給大家,這個是其中的第5部,后續(xù)還會有很多。

視頻已經(jīng)錄制完成,完整目錄截圖如下:
在這里插入圖片描述

打個小廣告,目前處于特價階段,一節(jié)課只需要1塊錢,29節(jié)課只需要29元哦。如果有需要,請前往我的淘寶店鋪“Python私教”下單。

課程目錄

  • 01 使用Go語言連接MySQL
  • 02 ySQL官方庫的拉取和使用
  • 03 打開和關閉連接
  • 04 創(chuàng)建用戶表
  • 05 新增用戶
  • 06 根據(jù)ID查詢用戶
  • 07 查詢所有的用戶
  • 08 根據(jù)ID修改用戶
  • 09 根據(jù)ID刪除用戶
  • 10 使用預處理查詢所有的用戶
  • 11 使用預處理新增用戶
  • 12 事務的介紹和使用
  • 13 回顧RESTAPI接口開發(fā)
  • 14 開發(fā)獲取所有用戶信息的接口
  • 15 使用HTTP客戶端測試獲取所有用戶接口
  • 16 開發(fā)和測試根據(jù)ID獲取用戶的接口
  • 17 開發(fā)和測試新增用戶的接口
  • 18 開發(fā)和測試根據(jù)ID修改用戶的接口
  • 19 開發(fā)根據(jù)ID刪除用戶的接口
  • 20 新增數(shù)據(jù)的SQL代碼分析
  • 21 實現(xiàn)MySQL通用新增數(shù)據(jù)的方法
  • 22 測試MySQL通用新增數(shù)據(jù)的方法
  • 23 封裝并測試通用的修改數(shù)據(jù)的方法
  • 24 封裝并測試通用的刪除方法
  • 25 封裝通用的查詢所有數(shù)據(jù)的方法
  • 26 將查詢的數(shù)據(jù)轉換為字典
  • 27 優(yōu)化查詢所有用戶的方法
  • 28 實現(xiàn)根據(jù)ID查詢并進行測試
  • 29 總結

精品代碼

完整代碼實在是太多了,放棄了給大家分享完整代碼的想法,這里摘錄一些個人認為比較精品的代碼。

封裝將SQL查詢結果轉換為字典的方法

這個方法想了很久,也查閱了大量的資料,最終被實現(xiàn)了。

代碼封裝如下:

package zdpgo_mcrudimport ("database/sql""errors""fmt""strings"
)func GetBy(db *sql.DB,tableName string,columns []string,conditions map[string]interface{},
) (data []map[string]interface{}, err error) {if db == nil {err = errors.New("db is nil")return}if tableName == "" {err = errors.New("tableName is empty")return}var columnStr stringif columns == nil || len(columns) == 0 {columnStr = "*"} else {columnStr = strings.Join(columns, ",")}sqlStr := fmt.Sprintf("select %s from %s",columnStr,tableName,)// 構造查詢條件whereValues := []interface{}{}whereKeys := []string{}if conditions != nil && len(conditions) > 0 {// select * from user// select * from user where k=vfor k, v := range conditions {whereKeys = append(whereKeys, fmt.Sprintf("%s=?", k))whereValues = append(whereValues, v)}whereStr := strings.Join(whereKeys, ",")sqlStr += " where " + whereStr}// 準備執(zhí)行查詢var stmt *sql.Stmtstmt, err = db.Prepare(sqlStr)if err != nil {fmt.Println(err)return}defer stmt.Close()// 執(zhí)行查詢var rows *sql.Rowsrows, err = stmt.Query(whereValues...)defer rows.Close()if rows == nil {err = errors.New("rows is nil")return}count := len(columns)                   // 列的個數(shù)values := make([]interface{}, count)    // 一組數(shù)據(jù)的值valuePtrs := make([]interface{}, count) // 一組數(shù)據(jù)的值的對應地址for rows.Next() {for i := 0; i < count; i++ {valuePtrs[i] = &values[i] // 將列的數(shù)據(jù)的值的地址取出來,賦值給地址值}err = rows.Scan(valuePtrs...) // 獲取各列的值,放在對應地址中if err != nil {return}item := make(map[string]interface{}) // 構建列名和值的對應關系 {name:張三,age:22}for i, col := range columns {var v interface{}     // 臨時值val := values[i]      // 對應的值b, ok := val.([]byte) // 判斷能不能轉換為字節(jié)數(shù)組,實際上就是判斷是不是字符串if ok {v = string(b) // 轉換為字符串} else {v = val}item[col] = v}data = append(data, item)}return
}

使用方法如下:

package mainimport ("database/sql""fmt""github.com/zhangdapeng520/zdpgo_mcrud"_ "github.com/zhangdapeng520/zdpgo_mysql"
)var (db  *sql.DBerr error
)func initMySQL() {dbUrl := "root:root@tcp(127.0.0.1:3306)/test"db, err = sql.Open("mysql", dbUrl)if err != nil {fmt.Println(err)return}
}func closeMySQL() {db.Close()
}func main() {initMySQL()defer closeMySQL()err = db.Ping()if err != nil {fmt.Println(err)return}conditions := map[string]interface{}{"id": 1,}data, err := zdpgo_mcrud.GetBy(db,"user",[]string{"id", "name", "age"},conditions,)if err != nil {fmt.Println(err)return}fmt.Println(data)
}

有了這個方法以后,我們就有了一個通用的查詢方法,不用再寫重復的SQL語句了。

實現(xiàn)用戶增刪改查REST API接口

這個需要大家學習我之前的前置課,就是那個REST API的基礎課。

再結合這個課程的MYSQL基礎知識,就可以開發(fā)了。

服務端代碼如下:

package mainimport ("database/sql""fmt""github.com/zhangdapeng520/zdpgo_httprouter"_ "github.com/zhangdapeng520/zdpgo_mysql""net/http""time"
)var (db  *sql.DBerr error
)func initMySQL() {dbUrl := "root:root@tcp(127.0.0.1:3306)/test"db, err = sql.Open("mysql", dbUrl)if err != nil {fmt.Println(err)return}
}func closeMySQL() {db.Close()
}type User struct {Id   int64  `json:"id"`Name string `json:"name"`Age  int    `json:"age"`
}func DbGetAllUser() []User {var users []UsersqlStr := "select id,name,age from user"var stmt *sql.Stmtstmt, err = db.Prepare(sqlStr)if err != nil {fmt.Println(err)return users}defer stmt.Close()var rows *sql.Rowsrows, err = stmt.Query()defer rows.Close()// 讀取for rows.Next() {var (uid  int64name stringage  int)err = rows.Scan(&uid, &name, &age)if err != nil {fmt.Println(err)return users}users = append(users, User{uid, name, age})fmt.Println(uid, name, age)}return users
}
func DbGetUser(uid string) []User {var users []UsersqlStr := "select id,name,age from user where id=?"var stmt *sql.Stmtstmt, err = db.Prepare(sqlStr)if err != nil {fmt.Println(err)return users}defer stmt.Close()var rows *sql.Rowsrows, err = stmt.Query(uid)defer rows.Close()// 讀取for rows.Next() {var (uid  int64name stringage  int)err = rows.Scan(&uid, &name, &age)if err != nil {fmt.Println(err)return users}users = append(users, User{uid, name, age})fmt.Println(uid, name, age)}return users
}func DbAddUser(name string, age int) int64 {sqlStr := "insert into user(name,age) values (?,?)"var stmt *sql.Stmtstmt, err = db.Prepare(sqlStr)if err != nil {fmt.Println(err)return -1}defer stmt.Close()var result sql.Resultresult, err = stmt.Exec(name, age)if err != nil {fmt.Println(err)return -1}var uid int64uid, err = result.LastInsertId()if err != nil {fmt.Println(err)return -1}fmt.Println("插入成功,ID是:", uid)return uid
}func DbUpdateUser(name string, age int, id string) int64 {sqlStr := "update user set name=?, age=? where id=?"var result sql.Resultresult, err = db.Exec(sqlStr, name, age, id)if err != nil {fmt.Println(err)return 0}var rowNum int64rowNum, err = result.RowsAffected()if err != nil {fmt.Println(err)return 0}fmt.Printf("更新 %d 條數(shù)據(jù)成功\n", rowNum)return rowNum
}func DbDeleteUser(id string) int64 {sqlStr := "delete from user where id=?"var result sql.Resultresult, err = db.Exec(sqlStr, id)if err != nil {fmt.Println(err)return 0}var rowNum int64rowNum, err = result.RowsAffected()if err != nil {fmt.Println(err)return 0}fmt.Printf("刪除 %d 條數(shù)據(jù)成功\n", rowNum)return rowNum
}func RouterGetAllUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {users := DbGetAllUser()zdpgo_httprouter.ResponseSuccess(w, &users)
}func RouterGetUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {uid := ps.ByName("id")users := DbGetUser(uid)var user Userif len(users) > 0 {user = users[0]}zdpgo_httprouter.ResponseSuccess(w, &user)
}func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var user Userzdpgo_httprouter.GetJson(r, &user)uid := DbAddUser(user.Name, user.Age)user.Id = uidzdpgo_httprouter.ResponseSuccess(w, &user)
}
func RouterUpdateUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {var user Userzdpgo_httprouter.GetJson(r, &user)uid := ps.ByName("id")updateRows := DbUpdateUser(user.Name, user.Age, uid)zdpgo_httprouter.ResponseSuccess(w, updateRows)
}
func RouterDeleteUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {uid := ps.ByName("id")updateRows := DbDeleteUser(uid)zdpgo_httprouter.ResponseSuccess(w, updateRows)
}func main() {initMySQL()defer closeMySQL()err = db.Ping()if err != nil {fmt.Println(err)return}router := zdpgo_httprouter.New()router.GET("/user", RouterGetAllUser)router.GET("/user/:id", RouterGetUser)router.POST("/user", RouterAddUser)router.PUT("/user/:id", RouterUpdateUser)router.DELETE("/user/:id", RouterDeleteUser)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

客戶端代碼也有增刪改查的,這里以根據(jù)ID刪除為例子。

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/user/3"data := map[string]interface{}{}resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, data)if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

總結

本套教程主要講解Go語言操作MySQL的基礎知識,同時還講解了如何結合之前學習的REST API的基礎知識,開發(fā)用戶增刪改查的API接口,最后還通過對MySQL通用方法的封裝,讓大家學習到MySQL的進階使用技巧。

如果您需要完整的源碼,打賞20元即可。

人生苦短,我用Python,我是您身邊的Python私教~

http://www.risenshineclean.com/news/42256.html

相關文章:

  • 北京網(wǎng)頁山東東營網(wǎng)絡seo
  • vi包括哪些內容附子seo
  • 濟南網(wǎng)站建設新風向合肥網(wǎng)站seo推廣
  • 河北 全部陽性了汕頭seo排名
  • 為什么最近好多網(wǎng)站維護沈陽疫情最新消息
  • 網(wǎng)站建設職能績效目標網(wǎng)站建設 全網(wǎng)營銷
  • 電腦軟件和網(wǎng)站怎么做win7優(yōu)化大師官方網(wǎng)站
  • 微信公眾號如何創(chuàng)建視頻鏈接站長seo軟件
  • wordpress新聞列表如何制作seo點擊器
  • 用動易做的校園網(wǎng)站建站平臺
  • 如何做網(wǎng)站哪個站推廣營銷網(wǎng)站定制公司
  • 慶云網(wǎng)站建設ihuibestseo外包網(wǎng)站
  • 智慧農(nóng)業(yè)網(wǎng)站建設網(wǎng)絡銷售
  • 天河做網(wǎng)站設計一個新產(chǎn)品怎么推廣
  • 免費b2b網(wǎng)站推廣嘿嘿2023年最新新聞摘抄
  • 手機端網(wǎng)站提交表單驗證代碼畢節(jié)地seo
  • 建設網(wǎng)站所有步驟蘇州百度
  • 蘇州專門網(wǎng)站線上推廣方案
  • 做非物質文化遺產(chǎn)網(wǎng)站的風險長沙優(yōu)化排名
  • 互聯(lián)網(wǎng)開網(wǎng)站怎么做企業(yè)網(wǎng)站建設的作用
  • 網(wǎng)站建設后期維護個人在線網(wǎng)站推廣
  • 方正集團網(wǎng)站是誰做的電腦培訓網(wǎng)上免費課程
  • 中國科協(xié)網(wǎng)站建設招標游戲推廣是什么工作
  • 開通網(wǎng)站后今天國內新聞
  • 網(wǎng)站地圖做計劃任務seo搜索引擎優(yōu)化人才
  • 江蘇省建設招標網(wǎng)站首頁阿里云域名查詢和注冊
  • 網(wǎng)站備案org甘肅百度推廣電話
  • 深圳門戶網(wǎng)站建設方案搜索引擎營銷的案例有哪些
  • 找人做網(wǎng)站價格鄭州seo網(wǎng)絡營銷
  • 響應式自適應網(wǎng)站模板杭州seo培訓