- 目录结构
- 创建数据库连接对象
model.go文件
package model
import (
"log"
_ "github.com/go-sql-driver/mysql" // _ 只调用init函数 // sql驱动包
"github.com/jmoiron/sqlx" // sql操作包
)
var Db *sqlx.DB
func init() {
db, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/news?charset=utf8&parseTime=True")
if err != nil {
log.Fatalln(err.Error())
}
Db = db
}
- 获取数据库数据(adaptor层)
article.go文件
package model
import (
"time"
)
// 结构体对应数据库表字段,没有用到的字段可以忽略
type Article struct {
Id int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Author string `json:"author,omitempty"`
Content string `json:"content,omitempty"`
Hits string `json:"hits,omitempty"`
utime time.Time `json:"utime,omitempty"`
}
// 获取单条数据
func AriticleGet(id int64) (Article, error) {
mod := Article{}
//err := Db.Get(&mod, "select * from Article where id = ? limit 1", id) // 数据库字段与结构体字段必须对应
err := Db.Unsafe().Get(&mod, "select * from Article where id = ? limit 1", id) // 不检测结构体字段与数据库字段是否对应
return mod, err
}
// 获取多条数据
func ArticleList() ([]Article, error) {
models := make([]Article, 0, 10)
err := Db.Unsafe().Select(&models, "select * from article limit 10")
return models, err
}
// 删除数据
func ArticleDel(id int64) bool {
row, _ := Db.Exec("delete from article where id = ?", id)
if row == nil {
return false
}
// 影响行数
rows, _ := row.RowsAffected()
if rows >= 1 {
return true // 删除成功
}
return false
}
// 插入数据
func ArticleAdd(mod *Article) error {
_, err := Db.Exec("insert into article(title, author, content, hits, utime) values(?,?,?,?,?)", mod.Title, mod.Author, mod.Content, mod.Hits, mod.utime)
return err
}
- 主函数
main.go文件,启动http服务
package main
import (
"APP01/model"
"encoding/json"
"net/http"
)
// 创建一个结构体,结构体字段与数据库字段一一对应
type Class struct {
id int64
name string
desc string
}
func home(w http.ResponseWriter, r *http.Request) {
var id int64 = 1
// 查询sql数据
mod, err := model.AriticleGet(id)
if err != nil {
// 错误处理
Fail(w, err.Error())
return
}
// 序列化数据
json_data, _ := json.Marshal(mod)
// 写入字节流数据
w.Write(json_data)
}
func add(w http.ResponseWriter, r *http.Request) {
// 获取前端Form数据
r.ParseForm()
mod := &model.Article{} // 初始化结构体
mod.Title = r.Form.Get("title")
mod.Author = r.Form.Get("author")
mod.Content = r.Form.Get("content")
mod.Hits, _ = strconv.Atoi(r.Form.Get("hits")) // 前端传参后是字符类型,将string类型转换成int类型
mod.Utime = time.Now()
// 插入数据
err := model.ArticleAdd(mod)
if err == nil {
Succ(w, "删除成功")
return
}
Fail(w, "添加失败")
return
}
// 成功
func Succ(w http.ResponseWriter, msg string, data ...interface{}) { // data 可变参数
mod := Reply{
code: 200
msg: msg
}
if len(data) > 0 {
mod.data = data[0]
}
buf, _ := json.Marshal(mod)
w.Header().Set("Content-Type", "application/json")
w.Write(buf)
}
// 失败
func Fail(w http.ResponseWriter, msg string, data ...interface{}) {
mod := Reply{
code: 300
msg: msg
}
if len(data) > 0 {
mod.data = data[0]
}
buf, _ := json.Marshal(mod)
w.Header().Set("Content-Type", "application/json")
w.Write(buf)
}
type Reply struct {
code int64 // 状态标识
msg string // 用户提示信息
data interface{} // 返回数据
}
// sql操作
func main() {
// 创建路由
http.HandleFunc("/home", home)
http.HandleFunc("/add", add) // 添加数据
// 监听端口
http.ListenAndServe(":8080", nil)
}