1、安装包:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2、帮助类MySqlUtil:
package utils
import (
"fmt"
"gin_demo/config"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"strconv"
)
type mySqlUtil struct {
DB *gorm.DB
}
//全局变量, 外部使用utils.MySqlClient来访问
var MySqlClient mySqlUtil
func InitMySqlUtil(config config.DatabaseConfig) error {
dsn := buildDatabaseDSN(config)
fmt.Println(dsn)
dd, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Warn),
})
if err != nil {
panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn)
}
sqlDB, err := dd.DB()
if err != nil {
panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn)
}
if config.MaxOpenConns > 0 {
sqlDB.SetMaxOpenConns(config.MaxOpenConns)
}
if config.MaxIdleConns > 0 {
sqlDB.SetMaxIdleConns(config.MaxIdleConns)
}
fmt.Printf("\nDefault atabase connection successful: %s\n", dsn)
//初始化全局redis结构体
MySqlClient = mySqlUtil{DB: dd}
return nil
}
func buildDatabaseDSN(config config.DatabaseConfig) string {
switch config.Driver {
case "mysql":
return fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?%s",
config.User,
config.Password,
config.Host,
strconv.Itoa(config.Port),
config.DbName,
config.Options,
)
case "postgres":
return fmt.Sprintf(
"host=%s port=%s user=%s dbname=%s password=%s options='%s'",
config.Host,
strconv.Itoa(config.Port),
config.User,
config.DbName,
config.Password,
config.Options,
)
case "sqlite3":
return config.DbName
case "mssql":
return fmt.Sprintf(
"sqlserver://%s:%s@%s:%s?database=%s&%s",
config.User,
config.Password,
config.Host,
strconv.Itoa(config.Port),
config.DbName,
config.Options,
)
}
panic("DB Connection not supported:" + config.Driver)
return ""
}
3、定义一个含有基础增删改查的类,其它数据库操作类都继承这个:
package dao
import (
"errors"
"fmt"
"gin_demo/utils"
)
type BaseDao struct {
}
//新增
func (BaseDao) Add(model interface{}) (err error) {
err = utils.MySqlClient.DB.Create(model).Error
return
}
//根据Id查询
func (BaseDao) Get(model interface{}, id int) error {
fmt.Println("UserInfoDao Get")
if id < 1 {
return errors.New("请输入id")
}
_ = utils.MySqlClient.DB.First(&model, id)
return nil
}
//更新
func (BaseDao) UpdateModel(value interface{}) (err error) {
err = utils.MySqlClient.DB.Save(value).Error
return
}
//删除
func (BaseDao) DeleteModel(value interface{}) (err error) {
err = utils.MySqlClient.DB.Delete(value).Error
return
}
4、用户相关的增删改查,继承BaseDao:UserInfoDao
package dao
import (
"gin_demo/models"
"gin_demo/utils"
)
type UserInfoDao struct {
BaseDao
}
var UserInfo = UserInfoDao{}
//修改用户名
func (UserInfoDao) UpdateUserName(name string, id int) error {
err := utils.MySqlClient.DB.Model(&models.UserInfo{}).Where("id = ?", id).Update("name", name).Error
return err
}
//分页查询用户列表
func (UserInfoDao) GetUserPageList(index int, size int) ([]models.UserInfo, error) {
results := make([]models.UserInfo, 0)
err := utils.MySqlClient.DB.Model(&models.UserInfo{}).Where("age < ?", 20).Where("name LIKE ?", "%王").Limit(size).Offset(index * size).Find(&results).Error
return results, err
}
package models
//数据库表结构
type UserInfo struct {
Id int `gorm:"primaryKey;autoIncrement" form:"id"`
Name string `form:"name"`
Age int `form:"age"`
}
// 自定义表名
func (UserInfo) TableName() string {
return "userinfo"
}
5、main.go初始化数据库:
package main
import (
"gin_demo/config"
"gin_demo/routers"
"gin_demo/utils"
"github.com/gin-gonic/gin"
)
func main() {
conf, err := config.ParseConfig("./config/app.json")
if err != nil {
panic("读取配置文件失败," + err.Error())
}
//fmt.Printf("conf:%#v\n", conf)
utils.InitRedisUtil(conf.RedisConfig.Addr, conf.RedisConfig.Port, conf.RedisConfig.Password)
utils.InitMySqlUtil(conf.Database)
//创建一个默认的路由引擎
engine := gin.Default()
routers.RegisterRouter(engine)
engine.Run(":9090")
}
6、使用:
package controller
import (
"gin_demo/config"
"gin_demo/dao"
"gin_demo/models"
"github.com/gin-gonic/gin"
"net/http"
"strconv"
)
type UserController struct {
}
//新增用户
func (controller *UserController) Add(context *gin.Context) {
//name := context.PostForm("name")
var user models.UserInfo
err := context.ShouldBindJSON(&user)
if err != nil {
context.JSON(http.StatusOK, gin.H{"msg": "参数错误"})
return
}
dao.UserInfo.Add(&user)
context.JSON(http.StatusOK, gin.H{"user": user})
}
//查询用户
func (controller *UserController) Get(context *gin.Context) {
id, _ := strconv.Atoi(context.Query("id"))
println("id:", id)
var user models.UserInfo
dao.UserInfo.Get(&user, id)
context.JSON(http.StatusOK, gin.H{
"id": id,
"conf": config.GetConfig(),
"user": user,
//"hello": hello,
})
}
//分页查询
func (controller *UserController) GetPageList(context *gin.Context) {
index, _ := strconv.Atoi(context.Query("index"))
println("index:", index)
size, _ := strconv.Atoi(context.Query("size"))
println("size:", size)
list, _ := dao.UserInfo.GetUserPageList(index, size)
context.JSON(http.StatusOK, gin.H{
"users": list,
})
}
//分页查询
func (controller *UserController) UpdateUserName(context *gin.Context) {
name := context.PostForm("name")
println("name:", name)
id, _ := strconv.Atoi(context.PostForm("id"))
println("id:", id)
_ = dao.UserInfo.UpdateUserName(name, id)
context.JSON(http.StatusOK, gin.H{
"code": 1,
})
}