gorm实现动态sql

news2024/10/6 10:31:57

文章目录

  • 前言
      • 需求
      • 实现步骤

前言

书接上回,解决了选择性的忽略某些字段这个问题,新的问题出现,想要使用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中的一小部分,以后用到别的部分自己也会分享出来,如有错误,望大佬指正。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/757393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于linux下的高并发服务器开发(第一章)- 文件属性操作函数

08 / 文件属性操作函数 1、access.c #include <unistd.h>int access(const char *pathname, int mode); 作用&#xff1a;判断某个文件是否有某个权限&#xff0c;或者判断文件是否存在 参数&#xff1a; - pathname: 判断的文件路径 - mode: …

nacos注册中心+Ribbon负载均衡+完成openfeign的调用(超详细步骤)

目录 1.注册中心 1.1.nacos注册中心 1.2. 微服务注册和拉取注册中心的内容 2.3.修改订单微服务的代码 3.负载均衡组件 3.1.什么是负载均衡 3.2.什么是Ribbon 3.3.Ribbon 的主要作用 3.4.Ribbon提供的负载均衡策略 4.openfeign完成服务调用 4.1.什么是OpenFeign 4.2…

搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)

文章目录 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools2.3 分词问题(中文不友好) 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;1&#xff09;查看数据卷…

相机图像质量研究(1)Camera成像流程介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

检测到目标X-XSS-Protection响应头缺失

详细描述 HTTP X-XSS-Protection 响应头是 Internet Explorer&#xff0c;Chrome 和 Safari 的一个特性&#xff0c;当检测到跨站脚本攻击 (XSS)时&#xff0c;浏览器将停止加载页面。 X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。 解决办法 将您的服务…

清华青年AI自强作业hw7:基于Yolo实现位置检测任务

清华青年AI自强作业hw7&#xff1a;基于Yolo实现位置检测任务 简述作业实现相关链接 一起学AI系列博客&#xff1a;目录索引 简述 hw7作业为基于Yolo模型&#xff0c;对PASCAL_VOC_2007数据集的20类物体进行位置探测。数据集为600张图像&#xff0c;因此建议训练迭代次数小于10…

chrome插件”hello-world“开发详细流程以及日志定位

本插件开发文档翻译于Google官方文档Chrome Extension development basics - Chrome Developers 一、插件开发 hello-world插件开发的具体流程如下&#xff1a; 创建目录hello-world&#xff0c; 存放源代码 在此目录中创建一个名为manifest.json的新文件并添加以下代码&…

会声会影2023旗舰版Corel VideoStudio Ultimate 2023 V26.0.0.136整合盘版本

会声会影2023旗舰版Corel VideoStudio Ultimate 2023 V26.0.0.136整合盘版本是一款有趣且直观的视频编辑器&#xff0c;包含高级工具和高级效果&#xff0c;智能功能和最佳性能的高级视频编辑软件&#xff0c;将您最美好的时刻和生活体验变成令人惊叹的电影。 从自定义标题和过…

克服“一支笔,一双手,一道力扣(Leetcode)做一宿”的窘境:我的烦恼和建议

文章目录 每日一句正能量前言原因建议自己相关的经历可能存在的问题根据问题进行分解或建立思维导图分享好用的刷题网站并进行介绍后记 每日一句正能量 想升高&#xff0c;有两样东西&#xff0c;那就是必须作鹰&#xff0c;或者作爬行动物。——巴尔扎克 前言 作为一名计算机…

用Maven的exec插件执行Java程序

Maven的exec插件介绍 利用maven的exec插件可以执行系统和Java程序。 官网资源 exec插件官网&#xff1a;https://www.mojohaus.org/exec-maven-plugin/java-mojo.html Goals exec:exec表示在一个单独的进程内执行系统和Java程序。 exec:java表示在当前的Java虚拟机内执行J…

Jetpack Compose之学习前的准备~

作者&#xff1a;TimeFine 一、为啥学习Compose 学习Compose一开始我是拒绝的&#xff0c;因为习惯改变太大&#xff0c;写xml挺好的为啥要卷Compose&#xff1f; 后来看了郭霖大佬的文章 写给初学者的Jetpack Compose教程&#xff0c;为什么要学习Compose&#xff1f; 觉得大…

MySQL 进阶之王,MySql 性能实战源码 + 笔记 + 项目实战

随着互联网时代的兴起&#xff0c;MySQL 在数据库领域日益显现出举足轻重的地位&#xff0c;它不断扩大的用户群体就是很好的证明。在这样的背景下&#xff0c;需要越来越多的人在知识资源方面为之付出&#xff0c;将自己对 MySQL 数据库的学习过程、运维经验、个人理解等记录下…

强强联手!迅镭激光与安易控达成战略合作,双方携手发展再提速!

7月伊始&#xff0c;安易控中国首个新能源船舶动力电池系统自动化制造基地揭幕仪式在珠海高新区隆重举行&#xff0c;迅镭激光与安易控达成战略合作&#xff0c;双方秉承开放、共赢的合作理念&#xff0c;在船舶动力电池系统领域全面合作&#xff0c;共同为船舶动力系统与储能系…

前端 | (一)前端简介 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;前言&#x1f4da;课程前序知识&#x1f407;两位先驱&#x1f407;计算机基础知识&#x1f407;应用软件架构&#x1f407;浏览器&#x1f407;网页相关概念…

电解质溶液的电传导率

1 概述 在通电、交变磁场等外界作用下&#xff0c;溶液的离子浓度分布变化导致溶液电传导率改变。在电镀、电泳等电化学作业中&#xff0c;需要考虑离子浓度和电传导率之间的相互影响导致的质量问题。 仿真的电镀层厚度分布&#xff08;图源&#xff1a;comsol.com&#xff09;…

【玩转Linux操作】Linux进程(进程基本介绍,父子进程,终止进程,进程树)

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;进程的基本介绍&#x1f354;显示系统执行的进程⭐…

uniapp实现微信小程序自带的分享功能

定义 share.js 文件 export default {data() {return {// 默认的全局分享内容share: {title: 标题,path: /pages/index/index, // 全局分享的路径imageUrl: , // 全局分享的图片(可本地可网络)}}},// 定义全局分享// 1.发送给朋友onShareAppMessage(res) {return {title: this…

剑指offer37.序列化二叉树

先不讲题目&#xff0c;先讲讲序列化和反序列化。 一&#xff0c;序列化与反序列化 在Java中&#xff0c;序列化和反序列化是用于将对象转换为字节流和将字节流转换回对象的过程。序列化是将对象转换为字节流&#xff0c;以便可以在网络上传输或保存到文件中。而反序列化则是…

jb2文件在web端展示之easyJBIG2show

easyJBIG2show an easy JBIG2 file web show github地址 一、背景 最近无意中接触到了一个二维码图片&#xff0c;该图片格式是jb2格式。翻阅资料发现JBIG标准最初在1993年发布&#xff0c;在当时被广泛应用于传真机和文档扫描仪等设备中。JBIG采用了一种自适应二进制编码算…

7.14~7.15学习总结

Java的前置知识学习时间截至了&#xff0c;慌的一批~~。 看看自己学的&#xff0c;再看看要求学的&#xff0c;简直&#xff1a; 现在继续&#xff1a;IO流里面的Commons_IO的用法&#xff1a; public class Main {public static void main(String[]args) throws IOException…