gorm实现动态sql

文章介绍了如何利用Gorm库在Go语言中实现动态SQL查询,以满足根据前端传递的非空字段进行商品信息模糊搜索的需求。通过定义商品和搜索请求的结构体,建立路由、控制器和服务层的交互,最后在MySQL层利用条件判断构建动态查询语句,避免了过度依赖链式编程的方式。
摘要由CSDN通过智能技术生成

前言

书接上回,解决了选择性的忽略某些字段这个问题,新的问题出现,想要使用gorm完成动态sql,我只知道mybatis中使用标签可以完成动态sql,不会使用gorm完成动态sql,下面通过一个需求学习一下gorm的动态sql。

需求

要求实现功能:商品的字段为商品ID、商品名字、商品价格、商品介绍、商品分类,前端传来的数据为名字、介绍、分类,该三个字段均可能为空,根据前端传来的不为空的数据进行模糊查询,并将查询到的数据返回给前端。

实现步骤

1、先定义商品结构体和搜索请求结构体

type Commodity struct {
	CommodityId     int64   `json:"commodity_id" gorm:"not null;comment:'商品ID'"`
	Name            string  `json:"name" gorm:"comment:'商品名'"`
	Price           float64 `json:"price" gorm:"comment:'价格'"`
	Introduction    string  `json:"introduction" gorm:"comment:'商品简介'"`
	Classify        string  `json:"classify" gorm:"comment:'分类'"`
}
type SearchCommodityReq struct {
	Name         string `json:"name" gorm:"omitempty;comment:'商品名'"`
	Introduction string `json:"introduction" gorm:"omitempty;comment:'商品简介'"`
	Classify     string `json:"classify" gorm:"omitempty;comment:'分类'"`
}

2、route 层

com := r.Group("commodity")
{
	com.GET("searchCommodityByQuery", controller.SearchCommodityByQuery) //通过名字、介绍、分类进行查询
}

3、controller 层

func SearchCommodityByQuery(c *gin.Context) {
	// 查询到的商品不一定为1个,需要使用切片
	var commodity []model.Commodity
	var searchComReq model.SearchCommodityReq
	if err := c.ShouldBindJSON(&searchComReq); err != nil {
		zap.L().Error("SearchCommodityByQuery with param invalid,err:", zap.Error(err))
		app.ResponseError(c, app.CodeInvalidParam)
		return
	}
	commodity, err := service.SearchCommodityByQuery(searchComReq)
	if err != nil {
		zap.L().Error("service.SearchCommodityByQuery(searchComReq) is failed", zap.Error(err))
		app.ResponseErrorWithMsg(c, err.Error())
		return
	}
	c.JSON(http.StatusOK,commodity)
}

4、service 层

func SearchCommodityByQuery(req model.SearchCommodityReq) (commodity []model.Commodity, err error) {
	if commodity, err = mysql.SearchCommodityByQuery(req); err != nil {
		zap.L().Error("mysql.SearchCommodityByQuery(req) is failed", zap.Error(err))
		return
	}
	return
}

5、mysql 层

func SearchCommodityByQuery(req model.SearchCommodityReq) (commodity []model.Commodity, err error) {
	name := req.Name
	introduction := req.Introduction
	classify := req.Classify
	query := global.GB_MDB.Model(&commodity)
	if name != "" {
		query = query.Where("name like ?", "%"+name+"%")
	}
	if introduction != "" {
		query = query.Where("introduction like ?", "%"+introduction+"%")
	}
	if classify != "" {
		query = query.Where("classify like ?", "%"+classify+"%")
	}
	err = query.Find(&commodity).Error
	// 之前的思路写的代码
	//err = global.GB_MDB.Model(&commodity).
	//	Where("name like ?", name).
	//	Or("introduction", introduction).
	//	Or("classify", classify).
	//	Find(&commodity).
	//	Error
	return
}

我在 mysql 层摒弃之前使用的“得心应手”的链式编程,感觉自己故步自封了,太依赖于链式编程,使得思维固化了,使用拼接的方式进行查询数据恰好可以到达动态sql的查询。

这篇博客学习的动态sql 只是动态sql中的一小部分,以后用到别的部分自己也会分享出来,如有错误,望大佬指正。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值