Go--封装Gin框架(Curd)

通过前几天的了解,可知到Gin是一个包儿,所以为了方便使用需要进行封装,我是对照的Laravel 框架封装的小框架,这个小框架是MVC并且是四层架构的小框架里面封装了mysql,redis等。今天简单介绍一下如何连接数据库并且书写一下简单的curd。 大家也可以点下我得首页 有一套gin+gorm完成的demo 这时候有人会觉得二者有什么区别?这两者最大的区别就是引入的sql包儿不一样 所以书写起来也会有些区别 感兴趣的朋友可以点击首页去看看……也可以一起交流一下 

首先介绍一下框架目录

App 目录
app 目录包含应用程序的核心代码,我们将在稍后详细探讨该目录;不管怎样,应用程序中几乎所有的类都位于此目录中。Common 公共 Controller控制器 Models 模型 Services 服务层


Config 目录
顾名思义,config 目录包含应用程序的所有配置文件。最好把这些文件都浏览一遍,并熟悉所有可用的选项。


Database 目录
database 目录包含数据库迁移,模型工厂和种子生成器文件。mysql配置


Routes 目录
routes 目录包含应用程序的所有路由定义。


templates 目录
templates 目录书写一些html的web页面

main.go 入口文件

如何连接数据库   

连接方法也可以看下gorm官方文档,这里我将配置文件给单独定义封装了

// 引入gorm 与mysql  go get -u gorm.io/gorm   go get -u gorm.io/driver/mysql

package mysql

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

// 全局mysql 连接器 DB
var SqlDB *sql.DB

// 定义连接数据库配置
type dbConfig struct {
	dbType      string //数据库类型 mysql
	dbName      string //数据库名称
	user        string //数据库账号/用户名
	password    string //数据库密码
	host        string //数据库ip 域名:端口
	tablePrefix string //表头
}

// 自动调用方法 
func init() {
	//定义错误信息
	var err error
	//配置信息
	cfg := &dbConfig{
		dbType:      "mysql",
		dbName:      "gin",
		user:        "gin",
		password:    "99999",
		host:        "xxxxxxxxx:3306",
		tablePrefix: "",
	}
	//连接
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		cfg.user,
		cfg.password,
		cfg.host,
		cfg.dbName)

	//打开链接
	SqlDB, err = sql.Open("mysql", dsn)

	//错误信息提示
	if err != nil {
		log.Fatal("数据库连接错误:", err)
	}
	err = SqlDB.Ping()
	if err != nil {
		log.Fatal(err.Error())
	}
	//设置空闲连接池中的最大连接数
	SqlDB.SetMaxIdleConns(20)
	//设置空闲连接池中的最大连接数
	SqlDB.SetMaxOpenConns(20)
}

简单书写一套curd

数据库:

Controller:

package Controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
	"test/app/Models"
)

// index
func Index(c *gin.Context) {
	c.String(http.StatusOK, "it is working")
}

// 获取所有记录
func GetAll(c *gin.Context) {
	//实例化
	t := Models.Test{}
	rs, _ := t.All()
	c.JSON(http.StatusOK, gin.H{"data": rs})
}

// 查询一条数据
func GetOne(c *gin.Context) {
	idString := c.Param("id")
	id, _ := strconv.Atoi(idString)
	t := Models.Test{Id: id}
	rs, _ := t.First()
	c.JSON(http.StatusOK, gin.H{"data": rs})
}

// 插入
func Add(c *gin.Context) {
	//表单接值
	username := c.Request.FormValue("username")
	fmt.Println("username==", username)
	//校验
	if username == "" {
		msg := fmt.Sprintf("username字段为空")
		c.JSON(http.StatusBadRequest, gin.H{"msg": msg})
	}
	t := Models.Test{
		UserName: &username,
	}
	t.Insert()
	c.JSON(http.StatusOK, gin.H{"msg": "添加成功"})

}

// 删除
func Del(c *gin.Context) {
	idString := c.Request.FormValue("id")
	id, _ := strconv.Atoi(idString)
	t := Models.Test{
		Id: id,
	}
	t.Deleted()
	c.JSON(http.StatusOK, gin.H{"msg": "删除成功"})
}

// 修改
func Edit(c *gin.Context) {
	idString := c.Request.FormValue("id")
	id, _ := strconv.Atoi(idString)
	username := c.Request.FormValue("username")
	//校验
	if username == "" {
		msg := fmt.Sprintf("username字段为空")
		c.JSON(http.StatusBadRequest, gin.H{"msg": msg})
	}
	t := Models.Test{
		Id:       id,
		UserName: &username,
	}
	t.Update()
	c.JSON(http.StatusOK, gin.H{"msg": "修改成功"})
}

Model:

package Models

import (
	"fmt"
	"log"
	"test/database/mysql"
)

// 引入gorm 与mysql  go get -u gorm.io/gorm   go get -u gorm.io/driver/mysql
type Test struct { //定义实体
	Id       int     `json:"id" gorm:"column:id"`
	UserName *string `json:"username" gorm:"column:username"`
}

// 映射表名
func (t *Test) TableNam() string {
	return "test"
}

// 新增方法
func (t *Test) Insert() int {
	//插入语法
	rs, err := mysql.SqlDB.Exec("insert into test(username)value(?,?)", t.UserName)
	//错误打印
	if err != nil {
		log.Fatal(err)
	}
	//更新条数
	res, err := rs.RowsAffected()
	fmt.Println(res)
	if err != nil {
		log.Fatal(err)
	}
	//返回新增id
	return t.Id
}

// 查询其中某一条记录
func (t *Test) First() (test Test, err error) {
	test = Test{}
	err = mysql.SqlDB.QueryRow("select * from test where id = ?", t.Id).Scan(
		&test.Id, &test.UserName)
	return
}

// 查询全部记录
func (t *Test) All() (test []Test, err error) {
	rows, err := mysql.SqlDB.Query("select * from test")
	for rows.Next() {
		t := Test{}
		err := rows.Scan(&t.Id, &t.UserName)
		if err != nil {
			log.Fatal(err)
		}
		test = append(test, t)
	}
	rows.Close()
	return
}

// 修改更新
func (t *Test) Update() int {
	rs, err := mysql.SqlDB.Exec("update test set username=?  where id=?", t.UserName, t.Id)
	if err != nil {
		log.Fatal(err)
	}
	row, err := rs.RowsAffected()
	fmt.Println(row)
	if err != nil {
		log.Fatal(err)
	}
	return t.Id
}

// 删除
func (t *Test) Deleted() int64 {
	rs, err := mysql.SqlDB.Exec("delete from test where id=?", t.Id)
	if err != nil {
		log.Fatal(err)
	}
	rows, err := rs.RowsAffected()
	if err != nil {
		log.Fatal(err)
	}
	return rows
}

package routes

import (
	"github.com/gin-gonic/gin"
	"test/app/Controller"
)

// 注册路由
func InitRouter() *gin.Engine {
	router := gin.Default()

	router.GET("/", Controller.Index)
	//设置路由组
	testGroup := router.Group("api/v1/test")
	{
		testGroup.GET("/lists", Controller.GetAll)
		testGroup.POST("/add", Controller.Add)
		testGroup.GET("/get/:id", Controller.GetOne)
		testGroup.PUT("/update", Controller.Edit)
		testGroup.DELETE("/del", Controller.Del)
	}
	return router
}

输出的话就自己试试喽 我接下来会用第二种方法也就是Gorm官网的方法写一套Curd

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值