您的位置:首页 > 数据库 > SQL

go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

2019-07-22 17:25 295 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/KongYu01/article/details/96855725

go语言学习第八天==》mysql数据库增删改查、用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

  • 引包
    import的作用是引包,当引入包时,该包下文件的所有init()函数都会被执行,并且可以使用该包下的所有函数
    当使用"_"符号时表示只执行包内init()函数 不引入包名内的其他函数
import (
"database/sql"
//注意看如上对"_"符号的描述
_ "github.com/go-sql-driver/mysql"
)
  • 连接数据库函数

注:open在执行时只设置连接参数,没有真正连接数据库
只在实际操作时才真正连接数据库

sql.open(驱动名,数据源dsn)(*DB,err)
//即(其中[]内表示可选)
sql.open(驱动名,“用户名:密码@[连接方式](主机:端口号)/数据库名[?参数=值]”)
//举列
db,err:=sql.open("mysql","root:tiger@(127.0.0.1:3306)/test")

查询:

rows, _ := db.Query("select * from ...");

查询单行

rows, _ := db.QueryRow("select * from ...");

曾删改

rows,_:=db.Exec(...)

预处理语句

stmt,_:=db.Prepare("select * from userinfo where username=?")

demo:
使用预处理语句的增删改查

package main

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

//定义结构体用于存储查询到的行数据信息
type userinfo struct{
Id int16
Username string
Age  int16
}

func main(){
//设置连接参数
db,_:=sql.Open("mysql","root:tiger@(127.0.0.1:3306)/test")
defer db.Close()
var uu userinfo
username:="aaa"

///////////////////////////////查询
stmt,_:=db.Prepare("select * from  userinfo where username=?")
rows,_:=stmt.Query(username)
for rows.Next(){
//Scan里面的参数个数必须和查询得到的行内数据个数一致
//比如rows.Scan(&uu.Id,&uu.Username)将取不到值
rows.Scan(&uu.Id,&uu.Username,&uu.Age)
fmt.Println(uu.Id,uu.Username,uu.Age)
}

///////////////////////////// 增加
// 上面定义过stmt所以不用:=
stmt,_=db.Prepare("insert into userinfo values(?,?,?)")
uu.Id=98
uu.Username="block"
uu.Age=98
ret,_:=stmt.Exec(uu.Id,uu.Username,uu.Age)
//获取影响的行数
ins_nums,_:=ret.RowsAffected()
fmt.Println("增加数据影响行数",ins_nums)

//////////////////////////删除
stmt,_=db.Prepare("delete from userinfo where username=?")
uu.Username="block"
//上面定义过ret所以不用:=
ret,_=stmt.Exec(uu.Username)
ins_nums,_=ret.RowsAffected()
fmt.Println("删除数据影响行数",ins_nums)

//////////////////////////修改
stmt,_=db.Prepare("update userinfo set age=? where username=?")
uu.Username="ttt"
uu.Age=999
ret,_=stmt.Exec(uu.Age,uu.Username)
ins_nums,_=ret.RowsAffected()
fmt.Println("修改数据影响行数",ins_nums)

///////////////////////////批量增加
stmt,_=db.Prepare("insert into userinfo values(?,?,?)")
/*
u1:=userinfo{
Id:   6,
Username:   "kkk",
Age:    777,
}
u2:=userinfo{
7,
"kkk",
777,
}
us:=[2]userinfo{u1,u2}

*/
//或者这样初始化
us:=[2]userinfo{
{
66,
"kkk",
777,
},
{
77,
"kkk",
777,
},
}
for _,u :=range us{
ret,_=stmt.Exec(u.Id,u.Username,u.Age)
ins_nums,_=ret.RowsAffected()
fmt.Println("增加数据影响行数",ins_nums)
}

}
  • 发起http请求

1发起http的get请求
原型

func (c *Client) Get(url string) (r *Response, err error)
package main
import (
"io/ioutil"
"fmt"
"net/http"
"log"
"encoding/json"
)
func main(){

resp, err := http.Get("http://127.0.0.1:8888/test")
if err != nil {
log.Fatal(err)
}
defer  resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}

///////////////////////////////
//如果返回为json数据则可以进行json解析
//这里解析为map
myMap := make(map[string]interface{})
// json.Unmarshal([]byte(jsonBuf), &m1)
json.Unmarshal(body, &myMap)
fmt.Println(myMap)
////////////////////////////////////

fmt.Println(string(body))
}

2发起post请求
原型
参数为:请求地址、将要 POST 数据的资源类型(MIMEType)、数据的比特流([]byte形式)

func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err      error)

//第二个参数要设置成”application/x-www-form-urlencoded”,
//否则post参数无法传递

package main
import (
"io/ioutil"
"fmt"
"net/http"
"log"
"encoding/json"
"strings"
)
func main(){

//第二个参数要设置成”application/x-www-form-urlencoded”,
//否则post参数无法传递
//传图片使用
//resp, err := http.Post("http://example.com/upload", "image/jpeg", &imageDataBuf)
resp, err := http.Post("http://127.0.0.1:8888/test",
"application/x-www-form-urlencoded",
strings.NewReader("qqq=aaa"))

if err != nil {
log.Fatal(err)
}
defer  resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}

///////////////////////////////
//如果返回为json数据则可以进行json解析
//这里解析为map
myMap := make(map[string]interface{})
// json.Unmarshal([]byte(jsonBuf), &m1)
json.Unmarshal(body, &myMap)
fmt.Println(myMap)
////////////////////////////////////

fmt.Println(string(body))
}

3发起 PostForm(也属于post请求)
原型
参数:地址、请求参数
不用指定application/x-www-form-urlencoded

func (c *Client) PostForm(url string, data url.Values) (r *Response, err error)
package main
import (
"io/ioutil"
"fmt"
"net/http"
"log"
"encoding/json"
"net/url"
)
func main(){

resp, err := http.PostForm("http://127.0.0.1:8888/test",
url.Values{"key1": {"Value1"}, "key2": {"value2"}})

if err != nil {
log.Fatal(err)
}
defer  resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}

///////////////////////////////
//如果返回为json数据则可以进行json解析
//这里解析为map
myMap := make(map[string]interface{})
// json.Unmarshal([]byte(jsonBuf), &m1)
json.Unmarshal(body, &myMap)
fmt.Println(myMap)
////////////////////////////////////

fmt.Println(string(body))
}

4发起Head请求
原型
只有一个参数,就不剧烈了

func (c *Client) Head(url string) (r *Response, err error)

5发起do请求
原型
如果要发起的请求需要设置头参数,cookie之类的数据就用此方法
参数:设置好的请求参数

func (c *Client) Do(req *Request) (resp *Response, err error)

demo

package main
import (
"io/ioutil"
"fmt"
"net/http"

"encoding/json"
"strings"
)
func main(){

client := &http.Client{}

/////////////////////////////////////
///设置一系列请求参数
req, err := http.NewRequest("POST", "http://127.0.0.1:8888/test",
strings.NewReader("aaa=bbb"))
if err != nil {
// 错误处理
}
//设置请求类型为参数
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
//设置Cookie头
req.Header.Set("Cookie", "aaa=bbb")

//发起请求
resp, err := client.Do(req)
///////////////////////////////////////

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}

///////////////////////////////
//如果返回为json数据则可以进行json解析
//这里解析为map
myMap := make(map[string]interface{})
// json.Unmarshal([]byte(jsonBuf), &m1)
json.Unmarshal(body, &myMap)
fmt.Println(myMap)
////////////////////////////////////

fmt.Println(string(body))
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: