通过前几天的了解,可知到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