当前位置: 首页 > news >正文

【最佳实践】gorm 联表查询 joins

内容

  • 使用gorm的一些技巧、经验
  • 常规使用示例
  • 如何在一对一、一对多、多对一的关系下使用gorm进行联表查询
    其他gorm使用和进阶用法参考官方文档 https://gorm.io/zh_CN/docs/index.html

优雅表迁移注册

  1. 表自动迁移方式,常见的方式如下:
#model层定义model
package models
type Cluster struct{}
#global层创建gorm.db对象,并注册迁移表结构
package global
func AutoMigrate() (err error) {if err = db.AutoMigrate(dbms.Cluster{},dbms.Instance{},dbms.Account{},); err != nil {return errors.Wrap(err, "创建数据库表失败")}return nil
}

这种显示调用方式的缺点是每次新建表结构都要去找global 层的迁移方法并修改,以下推荐一种隐式迁移表结构,通过创建一个迁移全局对象,并把表结构注册分别注册到对象中,最后db.AutoMigrat调用全局变量即可。

#model层定义model和创建全局迁移表对象
package models
var AddMigrate []interface{} type Cluster struct{}func init() {  // 包初始化后默认注册待迁移表对象AddMigrate = append(AddMigrate, Cluster{})
}#global层创建gorm.db对象,并调用全局迁移表对象
package global
func AutoMigrate() (err error) {if err = db.AutoMigrate(model.AddMigrate...); err != nil {return errors.Wrap(err, "创建数据库表失败")}return nil
}

常规操作示例

first、last、take、find区别

  • first会进行排序,主键升序;检索单个对象,LIMIT 1;not found会报错
  • last会进行排序,主键降序;检索单个对象,LIMIT 1;not found会报错
  • take不会进行排序;检索单个对象,LIMIT 1;not found会报错
  • find 获取所有对象;not found 不会报错

查询find

r := s.DB.Model(&models.Cluster{}).Where(&models.Cluster{Name: req.Name, EnvCode: req.EnvCode, ClusterType: req.ClusterType}).Count(&total).Find(&res)if r.Error != nil {return nil, 0, errors.Annotate(r.Error, "查询数据库失败")}

查询take

err := s.DB.Where(&models.Instance{ID: req.ID}).Take(&ins).Error

create单个记录

if err := s.DB.Create(&models.Cluster{Name:          cluster.Name,EnvCode:       cluster.EnvCode,MasterVipHost: cluster.MasterVipHost,}).Error; err != nil {return errors.Annotate(err, "创建记录失败")}

事务性批量插入

	if err = db.CreateInBatches(list, len(list)).Error; err != nil {return errors.Annotate(err, "批量创建账号记录失败")}

一次性批量插入

if err = db.Create(list).Error; err != nil {return errors.Annotate(err, "批量创建账号记录失败")}

delete

	if err = s.DB.Delete(&models.Cluster{ID: id}).Error; err != nil {return errors.Annotate(err, "删除记录失败")}

查询某个字段

	var total int64err := s.DB.Model(&models.Instance{}).Where("cluster_id = ?", id).Count(&total).Errorif err != nil {return errors.Annotate(err, "查询数据库异常")}或者var total int64err := s.DB.Model(&models.Instance{}).Select("count(*)").Where("cluster_id = ?", id).take(&total).Errorif err != nil {return errors.Annotate(err, "查询数据库异常")}

更新某些字段,推荐指定where条件

	if err = s.DB.Where("id = ?",req.ID).Updates(&models.Instance{Name:           req.Name,InstanceHost:   req.InstanceHost,InstancePort:   req.InstancePort,ManageUser:     req.ManageUser,ManagePassword: req.ManagePassword,ClusterRole:    req.ClusterRole,Description:    req.Description,}).Error; err != nil {return errors.Annotate(err, "更新记录失败")}

hook简单使用

可以通过gorm提供的hook和context结合,实现变更时自动更新user信息

// 通过controller层传递带有用户信息的context到services层,用gorm.session创建新的db// controller层保存用户信息到context
context.WithValue(ctx, Cookie, cookie)//controller层传递ctx
services.NewInstanceService(c.Context()).GetInstanceDetail(id)//services层
DB:   global.DB.WithContext(ctx),// 模型注册hook
func (m *Instance) BeforeCreate(tx *gorm.DB) (err error) {m.CreateUser = sso.GetNameFromCtx(tx.Statement.Context)return nil
}func (m *Instance) BeforeUpdate(tx *gorm.DB) (err error) {m.ModifyUser = sso.GetNameFromCtx(tx.Statement.Context)return nil
}func (m *Instance) BeforeDelete(tx *gorm.DB) (err error) {m.ModifyUser = sso.GetNameFromCtx(tx.Statement.Context)return nil
}

联表查询实例

以下示例主要实践两个表的关联查询,更多、更复杂的关联查询建议直接使用原生sql进行查询

关联模型定义

表关联,常用使用方式,以下

  • 通过定义表名同名的模型,并指定关联外键,如下
// instance与cluster关联关系 instance belongs to cluster
type Instance struct {ID              int    `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name            string `json:"name" gorm:"type:varchar(64);not null;comment:集群名"`InstanceHost    string `json:"instanceHost" gorm:"type:varchar(64);not null;comment:实例连接地址"`InstancePort    string `json:"instancePort" gorm:"type:varchar(64);not null;comment:实例连接端口"`InstanceVersion string `json:"instanceVersion" gorm:"type:varchar(64);not null;comment:实例版本"`ClusterID      int64  `json:"clusterId" gorm:"type:int(11);not null;default:0;comment:关联表cluster"` // 指定关联外键,belongs to关系Cluster        Cluster `json:"cluster,omitempty"` // belongs to关系Model `json:",omitempty"`
}type Cluster struct {ID            int64  `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name          string `json:"name" gorm:"type:varchar(64);not null;default:;comment:集群名"`EnvCode       string `json:"envCode" gorm:"type:varchar(64);not null;default:;comment:环境code"`Model `json:",omitempty"`
}// 用法 关联查看instance和cluster表
var list []Instance
res := gorm.DB.Joins("Cluster").Where("cluster_id = 1").where(&instance{Name: "test"}).Find(&list) // 注意joins中必须是关联的结构体名,不能是表名
if res.Error != nil {return errors.New(err,"查询记录失败")
}
fmt.Println(list)
// select * from dbms_instance LEFT JOIN `dbms_cluster` `Cluster` ON `dbms_instance`.`cluster_id` = `Cluster`.`id` AND `Cluster`.`deleted` = 0 WHERE `dbms_instance`.`name` = "test" AND `dbms_instance`.`deleted` = 0

其他关联关系用法类型

  • 通过手动创建结构体模型承载返回数据,查询时需要指定关联表和关联关系,示例如下
// 模型定义
package models
type Instance struct {ID              int    `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name            string `json:"name" gorm:"type:varchar(64);not null;comment:集群名"`InstanceHost    string `json:"instanceHost" gorm:"type:varchar(64);not null;comment:实例连接地址"`InstancePort    string `json:"instancePort" gorm:"type:varchar(64);not null;comment:实例连接端口"`InstanceVersion string `json:"instanceVersion" gorm:"type:varchar(64);not null;comment:实例版本"`ClusterID      int64  `json:"clusterId" gorm:"type:int(11);not null;default:0;comment:关联表cluster"` // 指定关联外键,belongs to关系Model `json:",omitempty"`
}type Cluster struct {ID            int64  `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name          string `json:"name" gorm:"type:varchar(64);not null;default:;comment:集群名"`EnvCode       string `json:"envCode" gorm:"type:varchar(64);not null;default:;comment:环境code"`Model `json:",omitempty"`
}// 联合查询 dbms_为表名前缀
type InstanceInfo struct {models.InstanceCluster models.Cluster
}
selectRes := new(InstanceInfo)
res := s.DB.Model(&models.Instance{}).Select("dbms_instance.*,dbms_cluster.*").Joins("Cluster").Where("dbms_instance.cluster_id = 1").Find(selectRes)
if res.Error != nil {return ""
}
fmt.Println(selectRes)

常用关联gorm语句示例

关联关键字:joins、preload

  • joins支持一对一、多对一,生成一条查询sql进行查询
  • preload都支持,分多次查询sql查询,并对结果聚合

对于有where条件情况下的注意事项:

  • where中条件有几种方式

    • string,类似where(“id = ?”,id)或者where("name = @name or name2=@name ",map[string]interface{}{name:“xiaozhuang”})
    • struct,类似where(&Instance{Name:“xiaozhuang”})
    • map,类似where(&map[string]interface{}{“name”: “jinzhu”, “age”: 20})

    推荐使用struct,只有struct可以忽略零值,节省很多判断逻辑

  • 如果where条件中包含的是model/table或者接受结果的模型的表,则无论一对一、多对一、一对多都可以直接使用。

  • 一对多中,如果where条件中包含的是关联的表的条件,则需要preload+join结合使用进行查询 且joins中要手写一层关联关系,否则(只用joins手写关联关系)返回的结果只是进行了筛选,不会赋值到结果结构体中

    todo 例子

示例:

  1. 一对一、多对一
type Cluster struct {ID            int64                 `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name          string                `json:"name" gorm:"type:varchar(64);not null;default:'';comment:集群名"`EnvCode       string                `json:"envCode" gorm:"type:varchar(64);not null;default:'';comment:环境code"`MasterVipHost string                `json:"masterVipHost" gorm:"type:varchar(128);not null;default:'';comment:集群读写vip地址"`Instances     []Instance            `json:"instance,omitempty"`Deleted       soft_delete.DeletedAt `json:"-" gorm:"index:idx_deleted"`Model         `json:",omitempty"`
}type Instance struct {ID              int64                 `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name            string                `json:"name" gorm:"type:varchar(64);not null;default:'';comment:集群名"`ManagePassword  string                `json:"managePassword" gorm:"type:varchar(256);not null;default:'';comment:管理密码"`ClusterID       int64                 `json:"clusterId" gorm:"type:int(11);not null;default:0;comment:关联表cluster"`ClusterRole     int                   `json:"clusterRole" gorm:"type:tinyint(4);not null;default:0;comment:在集群中的角色 3:主库 4:从库 5 离线库"`Cluster         Cluster               `json:"cluster,omitempty"`Deleted         soft_delete.DeletedAt `json:"-" gorm:"index:idx_deleted"`Model           `json:",omitempty"`
}

正确示例 where筛选条件只有查询的表有,或者没有条件,此时用joins和preload都可以实现

var list []*models.Instancs
if err := s.DB.Joins("Cluster").Where(&models.Instance{InstanceType: 3}).Find(&list).Error; err != nil {return nil, 0, errors.Annotate(err, "查询数据库失败")
}
// select中内容进行截取,方便阅读SELECT `dbms_instance`.`id`,`dbms_instance`.`name`,`Cluster`.`id` AS `Cluster__id`, FROM `dbms_instance` LEFT JOIN `dbms_cluster` `Cluster` ON `dbms_instance`.`cluster_id` = `Cluster`.`id` AND `Cluster`.`deleted` = 0 WHERE `dbms_instance`.`instance_type` = 3 AND `dbms_instance`.`deleted` = 0

错误示例 两个表都有where筛选条件条件

可以发现语句只进行了条件筛选,并没有select出结果

 var list []*models.Instance
if err := s.DB.Joins("left join dbms_cluster t1 on t1.id = dbms_instance.cluster_id").Where("t1.env_code = ?","hbos-test").Where(&models.Instance{InstanceType: 3}).Find(&list).Error; err != nil {return nil, 0, errors.Annotate(err, "查询数据库失败")
}
// select中内容进行截取,方便阅读
SELECT `dbms_instance`.`id`,`dbms_instance`.`name`,`dbms_instance`.`instance_host`, FROM `dbms_cluster` left join dbms_instance t1 on t1.cluster_id = dbms_cluster.id WHERE t1.instance_type = 3 AND `dbms_cluster`.`env_code` = 'hbos-test' AND `dbms_cluster`.`deleted` = 0

正确示例 两个表都有where筛选条件条件

可以发现,通过preload语句先进行一次查询,两次查询结果进行聚合可以得到我们想要的多对一的查询结果

 var list []*models.Instance
if err := s.DB.Preload("Cluster").Joins("left join dbms_cluster t1 on t1.id = dbms_instance.cluster_id").Where("t1.env_code = ?","hbos-test").Where(&models.Instance{InstanceType: 3}).Find(&list).Error; err != nil {return nil, 0, errors.Annotate(err, "查询数据库失败")
}
// select中内容进行截取,方便阅读
SELECT * FROM `dbms_cluster` WHERE `dbms_cluster`.`id` = 6 AND `dbms_cluster`.`deleted` = 0SELECT `dbms_instance`.`id`,`dbms_instance`.`name`,`dbms_instance`.`instance_host` FROM `dbms_instance` left join dbms_cluster t1 on t1.id = dbms_instance.cluster_id WHERE t1.env_code = 'hbos-test' AND `dbms_instance`.`instance_type` = 3 AND `dbms_instance`.`deleted` = 0
  1. 一对多
type Cluster struct {ID            int64                 `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name          string                `json:"name" gorm:"type:varchar(64);not null;default:'';comment:集群名"`EnvCode       string                `json:"envCode" gorm:"type:varchar(64);not null;default:'';comment:环境code"`MasterVipHost string                `json:"masterVipHost" gorm:"type:varchar(128);not null;default:'';comment:集群读写vip地址"`Instances     []Instance            `json:"instance,omitempty"`Deleted       soft_delete.DeletedAt `json:"-" gorm:"index:idx_deleted"`Model         `json:",omitempty"`
}type Instance struct {ID              int64                 `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:自增id"`Name            string                `json:"name" gorm:"type:varchar(64);not null;default:'';comment:集群名"`ManagePassword  string                `json:"managePassword" gorm:"type:varchar(256);not null;default:'';comment:管理密码"`ClusterID       int64                 `json:"clusterId" gorm:"type:int(11);not null;default:0;comment:关联表cluster"`ClusterRole     int                   `json:"clusterRole" gorm:"type:tinyint(4);not null;default:0;comment:在集群中的角色 3:主库 4:从库 5 离线库"`Cluster         Cluster               `json:"cluster,omitempty"`Deleted         soft_delete.DeletedAt `json:"-" gorm:"index:idx_deleted"`Model           `json:",omitempty"`
}

正确示例 where筛选条件只有查询的表有,或者没有条件,此时只能用preload,用joins会报错

注意:一对多下preload中指定的模型名要加s后缀

	var clusterIns []models.Clusterif err := s.DB.Preload("Instances").Where(&models.Cluster{ClusterType: MASTER}).Find(&clusterIns).Error; err != nil {return nil, 0, errors.Annotate(err, "查询实例所在集群记录失败")}//
SELECT * FROM `dbms_instance` WHERE `dbms_instance`.`cluster_id` = 6 AND `dbms_instance`.`deleted` = 0
SELECT * FROM `dbms_cluster` WHERE `dbms_cluster`.`id` = 6 AND `dbms_cluster`.`deleted` = 0

错误示例 where筛选条件只有查询的表有,或者没有条件,此时只能用preload,用joins会报错

可以发现sql语句出现问题

	var clusterIns []models.Clusterif err := s.DB.Preload("Instances").Where(&models.Cluster{ClusterType: MASTER}).Find(&clusterIns).Error; err != nil {return nil, 0, errors.Annotate(err, "查询实例所在集群记录失败")}//
SELECT `dbms_cluster`.`id`,`dbms_cluster`.`name`,`dbms_cluster`.`env_code` FROM `dbms_cluster` Instance WHERE `dbms_cluster`.`cluster_type` = 3 AND `dbms_cluster`.`deleted` = 0

正确示例 两个表都有where筛选条件条件

var clusterIns []models.Cluster
if err := s.DB.Preload("Instances").Joins("left join dbms_instance t1 on t1.cluster_id = dbms_cluster.id").Where("t1.instance_type = ?", 3).Where(&models.Cluster{ClusterType: 3}).Find(&clusterIns).Error; err != nil {return nil, 0, errors.Annotate(err, "查询实例所在集群记录失败")}// 		
SELECT * FROM `dbms_instance` WHERE `dbms_instance`.`cluster_id` = 20 AND `dbms_instance`.`deleted` = 0
SELECT `dbms_cluster`.`id`,`dbms_cluster`.`name` FROM `dbms_cluster` left join dbms_instance t1 on t1.cluster_id = dbms_cluster.id WHERE t1.instance_type = 3 AND `dbms_cluster`.`cluster_type` = 3 AND `dbms_cluster`.`deleted` = 0

总结:

  • 一对一关系:可直接使用gorm原生的Joins/preload来查询关联表的数据。
  • 多对一关系:多表有where条件要手写一层关联关系,否则直接用preload/Joins
  • 一对多关系: 多表有where条件要手写一层关联关系,否则直接用preload。
  • 多对多关系:有一张关联表,所以需要手写两层关联关系。

相关文章:

4、paxos协议

一、paxos历史 Paxos算法是一个高容错性的分布式一致性算法。Paxos算法的作者Leslie Lamport 在1982年提出的。下面的分布式协议个人感觉也是借鉴paxos。 二、paxos算法思想 paxos算法解决分布式数据一致性。具体步骤如下 1、lead提出议案且这个议案编号是最新议案&#xf…...

7K325T 引脚功能详解

本文针对7K325T芯片,详细讲解硬件连接需要注意的技术点,可以作为设计和检查时候的参考文件。为了方便使用,按照Bank顺序排列,包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括DS182、UG470、UG475、UG476等。…...

【设计模式】装饰者模式:以造梦西游的例子讲解一下装饰者模式,这也是你的童年吗?

文章目录1 概述1.1 问题1.2 定义1.3 结构1.4 类图2 例子2.1 代码2.2 效果图3 优点及适用场景3.1 优点3.2 适用场景1 概述 1.1 问题 众所周知,造梦西游3有四个角色,也就是师徒四人,这师徒四人每个人都有自己专属的武器和装备。假定我们以及设…...

QT 编译zlib

博主环境:QT 5.9.1 VS2105 从zlib官网下载zlib源代码,官网链接:https://www.zlib.net/,根据自己的需求进行下载,博主下载的是zip格式的。 下载完成后,进行解压。打开Developer Command Prompt for VS2015…...

沉睡者IT - 为你解密那些卖虚拟资源和知识付费课程的平台到底有多简单和多赚钱。

潜力博主推荐,点击上面关注博主 ↑ ↑ 上图为平台首页面截图,官方总站演示:vip.zzzz.la 备用演示:VIP.网站 1.虚拟资源平台介绍! (1)虚拟资源项目站是一个在线知识付费平台,全自动…...

斐波那契数列、跳台阶、矩形覆盖、而进制中1的个数、判断是否是素数

文章目录1、斐波那契数列2、跳台阶3、矩形覆盖4、二进制中1的个数5、判断是否是素数1、斐波那契数列 本题考点: 间复杂度,fib理解,剪枝重复计算 牛客链接 题目描述: 解题思路: 代码: class Solution {…...

【Designing ML Systems】第 5 章 :特征工程

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…...

第5章 C语言高级的库函数

文章目录文档配套视频讲解链接地址第05章 C库函数5.1 assert.h 断言库5.2 ctype.h 测试和映射字符5.3 math.h 数学库5.4 stdlib.h 标准库1. 字符串转整数、浮点数2. strtod 把字符串中的数字转换成浮点数并返回数字的下一个字符的位置3. strtol 字符串转整数4. strtoul 字符串转…...

PCL Super4PCS算法实现点云粗配准(版本二)

目录 一、算法概述参数解析二、代码实现三、结果展示四、编译好的库一、算法概述 Win10系统下实现Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。与版本一实现方式不同的是:这里直接将OpenGR集成到PCL中,目前网上也有很多相关的实现代…...

括号有效配对题型问题解法

目录 问题描述: 问题一:怎么判断一个括号字符串有效? 问题二:如果一个括号字符串无效,返回至少填几个字符能让其整体有效。 问题三:返回一个括号字符串中,最长的括号有效子串的长度。 问题四…...

前端学习路线(一)

很多人问我前端学习的路线是怎么样的,css要学多久,js高级要不要学,先学node.js还是先学vue,所以想通过一篇博文来讲一下这个事情 要不要学前端三剑客 这个问题是很多想快速上手前端的同学问的最多的一个问题,因为有很…...

【Linux系统】网络配置保姆级教学

目录 文章目录网络配置yum install tree 安装和tree显示Linux网络配置[原理图](https://so.csdn.net/so/search?q原理图&spm1001.2101.3001.7020)查看ip和网关ipconfig查看windows网络配置ifconfig查看Linux网络配置ping测试主机之间网络连通性Linux网络环境配置**第一种方…...

kibana 操作elasticsearch索引

前言 使用kibana可以很方便的对es进行各种操作,比如创建索引,删除索引,查询文档等,本篇先演示如何基于kibana 对es的索引进行常见的操作。 环境准备 请提前安装好es和kibana,可以参考 docker搭建es kibana操作es索引…...

什么是IP路由?思科与华为在IP路由配置上有啥区别?

什么是 IP 路由? IP 路由是将数据包从一个网络上的主机发送到不同远程网络上的另一台主机的过程。这个过程通常由路由器完成,路由器检查数据包的目标 IP 地址,确定下一跳地址,然后转发数据包。路由器使用路由表来确定应将数据包转…...

应该记住的10个SQL 查询

注意:所有查询都是用PostgreSQL编写的。 文章目录选择所有行where 语句Group by and Have 子句Order By and Limit日期函数内连接、左连接或右连接子查询相关子查询Case When 子句窗口函数对值进行排序选择所有行 SELECT * FROM employees如下: where…...

java毕业生设计医院新型冠状病毒疫苗接种管理系统计算机源码+系统+mysql+调试部署+lw

java毕业生设计医院新型冠状病毒疫苗接种管理系统计算机源码系统mysql调试部署lw java毕业生设计医院新型冠状病毒疫苗接种管理系统计算机源码系统mysql调试部署lw本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:…...

【python】都2022年不会还有人不会在电脑桌面上养宠物吧~

前言 嗨喽~大家好呀,这里是魔王呐 ! 上班枯燥,对着冷冰冰的电脑,相信很多小伙伴即使摸鱼,心情也不愉快。 这时如果有个萌宠能大家进行实时互动,这该有多好呀。再无聊的工作也能增添那么一丝趣味。 今天博主就来给大…...

双十一3000元投影仪评测排名,性价比最高的投影仪是什么品牌

今年的双十一各位都付尾款了吗?作为一年一度的大型电商节活动相信每个人都有参与,尤其是家用产品买的人应该会很多,就比如投影仪,能够代替电视使用,还能呈现出百寸以上的画面,视觉感觉俱佳。可以说3000元左…...

嵌入式分享合集106

一、可控硅控制电路实例 可控硅是可控硅整流器的简称。可控硅有单向、双向、可关断和光控几种类型。它具有体积小、重量轻、效率高、寿命长、控制方便等优点,被广泛用于可控整流、调压、逆变以及无触点开关等各种自动控制和大功率的电能转换的场合。 单向可控硅是一…...

翻译文本的软件有哪些?这几个翻译工具你可以试试看

文本翻译,是我们在生活中或工作中比较常见的一个需求。例如有时收到一份英文资料,没时间逐字翻译成中文,那就需要借助翻译工具来帮忙了;或者是有时需要将一些内容翻译成英文,而碰巧遇到句子不知道如何翻译,…...

Android 通过Room操作SQLite数据库

谷歌推荐使用Room操作数据库,Room在 SQLite 上提供了一个抽象层,在充分利用 SQLite强大功能的同时,能够流畅地访问数据库。 Room的三个主要组件: 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。…...

css--内外边距、 盒子模型、位置、浮动

一、内外边距 1.margin 1.1属性为给定元素设置所有四个(上下左右)方向的外边距属性。 上下左右具有四个方向:margin-top、margin-right、margin-bottom、margin-left可取值:length:固定值 percentage:相对于包…...

数据结构每日亿题(六)

文章目录一.用队列实现栈2.大概思路3.代码实现3.13.23.33.43.53.63.7二.用栈实现队列2.大概思路3.代码实现3.13.23.33.43.53.63.7三.结束一.用队列实现栈 原题传送门:力扣 题目:题目的意思是:给你两个队列,让你实现后入先出的操作…...

Java八股文

2022年接近年底了,想必绝大多数的小伙伴跳槽的心已经蠢蠢欲动。但一边又是互联网寒冬、大厂裁员,导致人心惶惶,想跳又不敢跳。但现在罡哥,给大家整理了八股文大厂面试真题和面试技巧。这里免费分享给大家。 资料包括:…...

自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……

前言 从2017年6月开始接触自动化至今,已经有好几年了,从17年接触UI自动化(unittestselenium)到18年接触接口自动化(unittestrequests)再到18年自己编写自动化平台(后台使用python的flask&#…...

蓝桥杯刷题(二)

蓝桥杯刷题一.空间二.排序三.成绩分析四.蛇形填数五.跑步锻炼&#xff08;较难&#xff09;一.空间 这道题很简单&#xff0c;要弄清单位间的转换和如何输出就可以啦 #include <stdio.h>int main() {printf("%.0f",256/(32/4/2/1024.0000/1024));return 0; }记…...

进程和线程详解

目录 前言&#xff1a; 操作系统定位 并发 并行 并发 进程 描述 PCB 管理 内存管理 进程间通信 线程 小结&#xff1a; 前言&#xff1a; 当一个程序运行起来时&#xff0c;操作系统要为之分配一些资源&#xff0c;这样的运行起来的程序称之为一个进程。为了有效解…...

flex blaze+java通信的例子

步骤&#xff1a; 1&#xff1a;建立java web程序 2&#xff1a; 下载blazeDS包&#xff0c;解压后将WEB-INF下的 flex&#xff0c;lib&#xff0c;web.xml复制到java程序的WEB-INF下 3&#xff1a;打开web.xml文件将以下代码的注释去掉&#xff0c;并修改 <param-value>…...

Allegro如何输出IDF文件操作指导

Allegro如何输出IDF文件操作指导 Allegro支持输出IDF文件,用于导入结构软件中检查和查看,具体操作如下 点击File-export-IDF 会弹出一个对话框,file name type选择IDF 然后点击export,输出IDF文件,文件已经输出 This section is describe what the function allegro h…...

生产工艺审批管理系统java项目开发jsp编程软件myeclipse开发Mysql数据库计算机网页

一、源码特点 JSP 生产工艺审批管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0…...

actionScript 数组去重

public function unique(array:Array):Array { for (var i:int0; i < array.length; i) { for (var j:inti 1; j < array.length; j) { //注意 if (array[i] array[j]) { array.splice(j, 1); j--; } } } return array…...

【C++音视频开发】初级篇 | RGB与YUV

前言 本专栏将不间断更新有关C音视频开发的内容&#xff0c;其中有初级篇、中级篇与高级篇的内容&#xff0c;包括但不限于音视频基础、FFmpeg实战、QT、流媒体客户端、流媒体服务器、WebRTC实战、Android NDK等等。是博主花了将近5000元购买的课程中的知识点&#xff0c;其中…...

Html-文本属性

常用的文本属性 属性描述说明font-size字体大小单位是px&#xff0c;浏览器默认是16px。font-family字体多个字体中间用逗号链接&#xff0c;先解析第1个字体,如果没有解析第2个字体,以此类推color颜色 red;#ff0;rgb(255,0,0); 0-255font-weight加粗 bolder(更粗的&#xff09…...

Dockerfile

Dockerfile指令集 对于Dockerfiel而言&#xff0c;是在学习docker工具里面&#xff0c;最重点的内容&#xff0c;它可以帮助我们生成自己想要的基础镜像。部署一个容器最重要的就是镜像&#xff0c;指令都已经内置好了。 FROM 这个镜像的妈妈是谁&#xff1f;&a…...

Java反射04:获取运行时类的属性结构及其内部结构

文章目录获取运行时类的属性结构及其内部结构新建测试类1.获取每一个Field&#xff08;属性&#xff09;2.获取运行时类的方法结构3.获取运行时类的构造器4.获取当前运行时所继承的父类和接口5.获取当前运行时类的注解、包、泛型获取运行时类的属性结构及其内部结构 通过反射获…...

双软企业认定需要什么条件

认定双软企业的好处 1、税收优惠:所得税两免三减半。双软认证企业&#xff0c;自获利年度起&#xff0c;第一年和第二年免征企业所得税&#xff0c;第三年至第五年减半征收企业所得税。 增值税超过3%的部分即征即退。 2、政策支持:各地政府对于科研专项资金、税收减免科技计划、…...

qsettings 读写注册表

qsettings简单的实现一个注册表读写操作&#xff0c;记录程序中需要保存的信息。使用qsettings声明对象之前&#xff0c;需要指明qsettings的组织名和应用名&#xff0c;分别利用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()来指定组织名…...

【JavaScript高级进阶】构造函数和原型,学会prototype

目录 前言 1.构造函数和原型 1.1使用prototype解决内存浪费的问题 1.2constructor构造函数构造器构造函数 2.原型链 2.1js中成员查找规则 2.2原型对象this指向 2.3扩展内置对象 3.call作用 4.继承 4.1利用原型对象继承 写在最后 前言 哈喽哈喽大家好&#xff0c;因为…...

VMware16虚拟机添加硬盘(磁盘)和挂载硬盘(磁盘)

记录&#xff1a;317 场景&#xff1a;在VMware16虚拟机&#xff0c;安装了CentOS 7.9操作系统场景下&#xff0c;添加硬盘(磁盘)和挂载硬盘(磁盘)。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.机器配置 机器名称&#xff1a;B200&#xff1b;主机名称&#xff…...

【学生个人网页设计作品】使用HMTL制作一个超好看的保护海豚动物网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…...

短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

感谢您的关注&#xff0c;请收藏以免忘记&#xff0c;点赞以示鼓励&#xff0c;评论给以建议&#xff0c;爱你哟 项目编号&#xff1a;BS-PT-071 一&#xff0c;项目简介 本项目基于Springbootvue开发实现了一个电影点播和短视频分享平台&#xff0c;名为爱奇艺影视平台系统。…...

基于Springboot+mybatis+mysql+html图书管理系统

基于Springbootmybatismysqlhtml图书管理系统一、系统介绍二、功能展示1.用户登陆2.图书管理3.读者管理4.借还管理5.密码修改6.图书查询&#xff08;读者&#xff09;7.个人信息&#xff08;读者&#xff09;8.我的借还&#xff08;读者&#xff09;一、系统介绍 系统主要功能…...

【数据结构】第三章 栈和队列

1.单选(2分) ‏下列关于队列的叙述正确的是&#xff08; &#xff09;。 A.在队列中只能删除数据 B.队列是先进先出的线性表 C.队列是后进先出的线性表 D.在队列中只能插入数据 正确答案&#xff1a;B 2.单选(2分) ‌一个栈的输入序列为1&#xff0c;2&#xff0c;3&#xff0…...

公众号网课查题系统

公众号网课查题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…...

02 LaTex之小tips

1.运行 2.头&#xff0b;尾 \documentclass[11pt]{article}\usepackage{algorithm, algpseudocode} \usepackage{amsmath,amssymb,amsthm} \usepackage{mathrsfs}% huaxie zimu \textwidth 16cm\textheight 22cm\oddsidemargin0cm\evensidemargin\oddsidemargin\usepackage{un…...

使用kubeadm搭建高可用集群-k8s相关组件及1.16版本的安装部署

本文是向大家分享k8s相关组件及1.16版本的安装部署&#xff0c;它能够让大家初步了解k8s核心组件的原理及k8s的相关优势&#xff0c;有兴趣的同学可以部署安装下。 什么是kubernetes kubernetes是Google 开源的容器集群管理系统&#xff0c;是大规模容器应用编排系统&#xff…...

为了摸鱼,我开发了一个工具网站

&#x1f3e1; 博客首页&#xff1a;派 大 星 ⛳️ 欢迎关注 &#x1f433; 点赞 &#x1f392; 收藏 ✏️ 留言 &#x1f3a2; 本文由派大星原创编撰 &#x1f6a7; 系列专栏&#xff1a;《开源专栏》 &#x1f388; 本系列主要输出作者自创的开源项目 &#x1f517; 作品&…...

CodeForces - 545E Paths and Trees 最短路建树

题目链接&#xff1a;点击查看 Little girl Susie accidentally found her elder brothers notebook. She has many things to do, more important than solving problems, but she found this problem too interesting, so she wanted to know its solution and decided to a…...

koa + pug模板引擎

模板引擎 模板引擎&#xff1a;模板引擎是web应用中动态生成html的工具&#xff0c;负责将数据和模板结合。常见模板引擎有&#xff1a;ejs、jade&#xff08;现更名为pug&#xff09;、Handlebars、Nunjucks、Swig等&#xff1b;使用模板引擎可以是项目结构更加清晰&#xff…...

数字集成电路设计(二、Verilog HDL基础知识)

文章目录1. 语言要素1.1 空白符1.2 注释符1.3 标识符1.3.1 转义标识符1.4 关键字1.5 数值1.5.1 整数及其表示方式1.5.2 实数及其表示方式1.5.3 字符串及其表示方式2. 数据类型2.1 物理数据类型2.1.1 连线型2.1.2 寄存器型2.2 连线型和寄存器型数据类型的声明2.2.1 连线型数据类…...