说说为什么写Gorm,因为公司新项目需要,研究了下Go下的gorm。对于一个项目首先考虑的问题,就是封装一些常用的工具方法,例如多参数查询 where or Like 还有order by Limit 等等,如果不封装后面代码写多了,每个地方代码都不一样,维护更新比较头大。

  代码框架用的是gin,通过一个完整的案例贴代码吧,经过测试,只要把相关的查询参数梳理好,传参就可以出结果了。

 1 // 管理员列表
2 func ListHandler(c *gin.Context){
3 var ResponseRes = common.ResponseMain{
4 Message: "ok",
5 Code: http.StatusOK,
6 Data:"",
7 }
8 type Paramet struct {
9 Page int `form:"page" json:"page" uri:"page"`
10 Limit int `form:"limit" json:"page" uri:"page"`
11 Sort string `form:"sort" json:"sort" uri:"sort"`
12 Name string `form:"name" json:"name" uri:"name"`
13 }
14 var Parament = &Paramet{}
15 if err:= c.BindQuery(Parament); err != nil {
16 ResponseRes.Message = err.Error()
17 ResponseRes.Code=http.StatusMethodNotAllowed
18 c.JSON(http.StatusOK,ResponseRes)
19 return
20 }
21 fmt.Println("接收参数",Parament)
22 var db = model.Db
23 var BcAdmin []common.BcAdmin
24 db.LogMode(true);
    // 传递查询where参数,用了map来定义二维数组
25 where:=map[string]map[string]string{
26 "AND":{"status":"1","role":"agent"},
27 "OR":{"pass":"123456"},
28 "LIKE":{"name":Parament.Name,"id":"1"},
29 }
30 db.Table("bc_admin"). // 指定表名,如果不指定,表名查询会带复数 加s es,提示查询不到
31 Select("*"). //查询全部字段,暂时没有几个字段,就全部*
32 Scopes(model.Where(where)). // 封装的查询方法需要被Scopes使用
33 Scopes(model.Order(Parament.Sort)).
34 Scopes(model.Paginate(Parament.Page,Parament.Limit)).
35 Find(&BcAdmin)
36 ResponseRes.Data = &BcAdmin
37 c.JSON(http.StatusOK,ResponseRes)
38 }

下面是封装的数据库方法

package model
/**
主要是用于链接数据库
分配链接Db
*/
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
)
// 数据库Db已连接
var Db *gorm.DB func init(){
db, err := gorm.Open("mysql", "jiangsheng:**123456a***_@tcp(rm-d5e97cc4d4o0698c4xo**.mysql.rds.aliyuncs.com:3306)/bc?charset=utf8mb4&parseTime=true&loc=Local")
if err != nil {
log.Panic("bc数据库链接失败",err)
return
}
// 如果设置禁用表名复数形式属性为 true,`User` 的表名将是 `user`
db.SingularTable(true)
Db = db
log.Println("---数据库初始化链接成功---")
//defer db.Close() // 后面做连接池
}
/**
分页封装
*/
func Paginate(page int,pageSize int) func(db *gorm.DB) *gorm.DB {
return func (db *gorm.DB) *gorm.DB {
if page == 0 {
page = 1
}
switch {
case pageSize > 100:
pageSize = 100
case pageSize <= 0:
pageSize=10
}
offset :=( page - 1 ) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
/**
排序判断
*/
func Order(sort string) func(db *gorm.DB) *gorm.DB {
return func (db *gorm.DB) *gorm.DB {
// 判断字符串第一个字符是 + -
mark := sort[0:1]
orderStr := sort[1:]
switch {
case mark == "-":
orderStr =orderStr+` ASC`
default:
orderStr =orderStr+` DESC`
}
return db.Order(orderStr)
}
}
/**
where查询
*/
func Where(wheres map[string]map[string]string) func(db *gorm.DB) *gorm.DB {
var andWhere, orWhere = map[string]interface{}{}, map[string]interface{}{}
var likeWhere string
for key,value := range wheres {
//组装where
if key=="AND" {
for key2,value2 := range value {
andWhere[key2]=value2
}
}
if key=="OR" {
for key2,value2 := range value {
orWhere[key2]=value2
}
}
if key=="LIKE" {
for key2,value2 := range value {
likeWhere +=key2+` LIKE "`+value2+`%" OR `
}
// 去除尾部OR
likeWhere = likeWhere[:len(likeWhere)-3]
}
}
return func (db *gorm.DB) *gorm.DB {
return db.Where(andWhere).Where(likeWhere).Or(orWhere)
}
}

  Go的文档相对PHP并不多,自己也做个记录,方便有需要的人可以借鉴参考

Golang Gorm 封装 分页查询 Where Order 查询的更多相关文章

  1. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  2. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  3. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  4. 10 star组件之分页, search模糊查询, action批量处理

    1.分页组件高阶 1.分页的class形式(有bug,请看下面的) """ 自定义分页组件 """ class Pagination(obj ...

  5. Server Sql 多表查询、子查询和分页

    一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...

  6. 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)

    上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下. · Mysql mysql的分页可以直接使用关键字limit,句子写起来比较方便. 语法: ① limit m,n -- ...

  7. Mysql--子查询、分页查询、联合查询

    一. 子查询的定义 出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句. 外部查询:select.inser ...

  8. 数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

    1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1.表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有同 ...

  9. SqlServer分页存储过程(多表查询,多条件排序),Repeater控件呈现数据以及分页

        存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出 ...

随机推荐

  1. Ubuntu22.04 安装配置VNC Server

    如果转载, 请注明出处 https://www.cnblogs.com/milton/p/16730512.html Ubuntu22.40下VNC和远程桌面的区别 使用远程桌面时, 用户必须在hos ...

  2. 货币转换I

    A=input() if A[0] in ['U','u']: RMB=(eval(A[3:]))*6.78 print("RMB{:.2f}".format(RMB)) else ...

  3. PAT (Basic Level) Practice 1012 数字分类 分数 20

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1​ = 能被 5 整除的数字中所有偶数的和: A2​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1​−n ...

  4. 自然语言处理NLP程序包(NLTK/spaCy)使用总结

    NLTK和SpaCy是NLP的Python应用,提供了一些现成的处理工具和数据接口.下面介绍它们的一些常用功能和特性,便于对NLP研究的组成形式有一个基本的了解. NLTK Natural Langu ...

  5. 「国产系统」Tubian 0.1,兼容Windows和Android的GNU/Linux系统!

    Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Tubian是我的自用系统整理而成的Linux发行版,基于Deb ...

  6. 【Wine使用经验分享】Wine字体显示问题处理

    字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...

  7. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  8. 规则引擎深度对比,LiteFlow vs Drools!

    前言 Drools是一款老牌的java规则引擎框架,早在十几年前,我刚工作的时候,曾在一家第三方支付企业工作.在核心的支付路由层面我记得就是用Drools来做的. 难能可贵的是,Drools这个项目在 ...

  9. SQL语句编写的练习(MySQL)

    SQL语句编写的练习(MySQL) 一.建表 1.学生表(Student) 学号 | 姓名 | 性别 | 出生年月 | 所在班级 create table Student( sno varchar(2 ...

  10. 成功 解决 @keyup.enter=“search()“ 在el-input 组件中不生效的问题

    1.问题描述 在输入框中.输入内容.点击回车.没有效果 问题代码 2.问题解决思路 查看官网的解释说明: 要使用.native修饰符 3.问题解决 修改后的代码 修改后的效果