Go语言之GORM框架(二) ——GORM的单表操作

前言

在上一篇文章中,我们对Gorm进行了介绍,而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下,下面我们对单表进行操作的表结构如下:

type Student struct {
	ID   uint   `gorm:"size:3"`
	Name string `gorm:"size:8"`
	Age  int    `gorm:"size:3"`
	Sex  string `gorm:"size:3"`
	Email *string `gorm:"size:32"`
}

好了,话不多说,开始我们今天的内容

表的初始化

在这里插入图片描述
首先我们确定一下我们已经将要演示的数据库内相关内容清空掉了,然后我们就可以开始连接数据库并创建students表了:

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type Student struct {
	ID    uint    `gorm:"size:3"`
	Name  string  `gorm:"size:8"`
	Age   int     `gorm:"size:3"`
	Sex   string  `gorm:"size:3"`
	Email *string `gorm:"size:32"`
}

var myDB *gorm.DB

func init() {
	user := "root"
	password := "aaaa"
	dbname := "gorm"
	ip := "127.0.0.1"
	port := "3306"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败,err:", err)
		return
	}
	fmt.Println("数据库连接成功")
	myDB = db
}

func main() {
	err := myDB.AutoMigrate(&Student{})
	if err != nil {
		fmt.Println("students表创建失败,err:", err)
		return
	}
	fmt.Println("students表创建成功")
}

在这里插入图片描述

单表操作

创建并插入数据

插入单条数据

func SingleInsert(student Student) {
	res := myDB.Create(&student)
	if res.Error != nil {
		fmt.Println("插入数据失败,err:", res.Error)
		return
	}
	fmt.Println("插入数据成功")
}

func main() {
	err := myDB.AutoMigrate(&Student{})
	if err != nil {
		fmt.Println("students表创建失败,err:", err)
		return
	}
	fmt.Println("students表创建成功")

	email := "fengxu@163.com"
	student := Student{
		Name:  "fengxu",
		Age:   18,
		Sex:   "男",
		Email: &email,
	}
	SingleInsert(student)
}

运行成功,查找数据库:
在这里插入图片描述
这样我们就成功将一条记录插入数据库了

批量插入数据

func Insert(StudentList []Student) {
	var StudentList []Student
	for i := 0; i < 10; i++ {
		email := fmt.Sprintf("No.%d@163.com", i)
		student := Student{
			Name:  fmt.Sprintf("No.%d", i),
			Age:   18 + i,
			Sex:   "男",
			Email: &email,
		}
		StudentList = append(StudentList, student)
	}
	res := myDB.Create(&StudentList)
	if res.Error != nil {
		fmt.Println("插入数据失败,err:", res.Error)
		return
	}
	fmt.Println("插入数据成功")
}

在这里插入图片描述
这显示我们成功向students表中批量插入数据。

插入数据的细节

  • 这里的email我为了表示它可以为空,将它的类型设置成了指针,所以我们在传值的时候也要传指针
  • 我们在使用Create函数时,传递的是指针,而不是具体值
  • 由于我们传入到Create函数的是student的指针,所以student在此之后就会出现该记录的其他消息了,比如下面这样:
func SingleInsert(student Student) {
	//插入单条数据
	email := "fengxu@163.com"
	student := Student{
		Name:  "luoyu",
		Age:   18,
		Sex:   "男",
		Email: &email,
	}
	SingleInsert(student)
	res := myDB.Create(&student)
	if res.Error != nil {
		fmt.Println("插入数据失败,err:", res.Error)
		return
	}
	fmt.Println("插入数据成功")
	fmt.Println(student)
}

打印的结果为:

{13 luoyu 180xc0001e0830}

单表插入的完整代码:

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type Student struct {
	ID    uint    `gorm:"size:3"`
	Name  string  `gorm:"size:8"`
	Age   int     `gorm:"size:3"`
	Sex   string  `gorm:"size:3"`
	Email *string `gorm:"size:32"`
}

var myDB *gorm.DB

func init() {
	user := "root"
	password := "ba161754"
	dbname := "gorm"
	ip := "127.0.0.1"
	port := "3306"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败,err:", err)
		return
	}
	fmt.Println("数据库连接成功")
	myDB = db
}

func SingleInsert(student Student) {
	res := myDB.Create(&student)
	if res.Error != nil {
		fmt.Println("插入数据失败,err:", res.Error)
		return
	}
	fmt.Println("插入数据成功")
	fmt.Println(student)
}

func Insert(StudentList []Student) {
	res := myDB.Create(&StudentList)
	if res.Error != nil {
		fmt.Println("插入数据失败,err:", res.Error)
		return
	}
	fmt.Println("插入数据成功")
}

func main() {
	err := myDB.AutoMigrate(&Student{})
	if err != nil {
		fmt.Println("students表创建失败,err:", err)
		return
	}
	fmt.Println("students表创建成功")

	//插入单条数据
	email := "fengxu@163.com"
	student := Student{
		Name:  "luoyu",
		Age:   18,
		Sex:   "男",
		Email: &email,
	}
	SingleInsert(student)

	//批量插入数据
	var StudentList []Student
	for i := 0; i < 10; i++ {
		email := fmt.Sprintf("No.%d@163.com", i)
		student := Student{
			Name:  fmt.Sprintf("No.%d", i),
			Age:   18 + i,
			Sex:   "男",
			Email: &email,
		}
		StudentList = append(StudentList, student)
	}
	Insert(StudentList)
}

单表查询

前言

在讲解单表查询之前,我们先来看一个很简单的单表查询代码

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Student struct {
	ID    uint    `gorm:"size:3"`
	Name  string  `gorm:"size:8"`
	Age   int     `gorm:"size:3"`
	Sex   string  `gorm:"size:3"`
	Email *string `gorm:"size:32"`
}

var myDB *gorm.DB
var mysqllogger logger.Interface

func init() {
	user := "root"
	password := "ba161754"
	dbname := "gorm"
	ip := "127.0.0.1"
	port := "3306"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败,err:", err)
		return
	}
	fmt.Println("数据库连接成功")
	myDB = db
}

func initLogger() {
	var mysqlLogger logger.Interface
	mysqlLogger = logger.Default.LogMode(logger.Info) //设置日志打印级别
	mysqlLogger = logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // (日志输出的目标,前缀和日志包含的内容)
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  true,        // 使用彩色打印
		},
	)
	myDB.Logger = mysqlLogger
}

func main() {
	var student Student
	initLogger()
	myDB.Session(&gorm.Session{
		Logger: mysqllogger,
	})

	myDB.Take(&student) //默认查找第一条数据
	fmt.Println(student)
	student = Student{}

	myDB.First(&student) //查找第一条数据
	fmt.Println(student)
	student = Student{}

	myDB.Last(&student) //查找最后一条数据
	fmt.Println(student)
}

输出结果为:
在这里插入图片描述
这里我在打印出查询结果的同时也打印出了它们原生的sql语句,我们可以看到相对于原生sql语句,GORM的语句相对比较简单。

当然和我们平时利用各种各样的筛选条件来进行查询,我们在GORM也可以利用各种各样的条件来完成查询,,最后我们介绍一下下面我们可能会使用的函数:

  • Take:用于从数据库中检索符合条件的第一条记录,并将其填充到指定的结构体中。如果没有指定特定的条件,它会默认返回第一条记录。
  • Find:用于从数据库中检索符合条件的所有记录,并将它们填充到指定的结构体切片中。你可以使用Where函数来添加条件限制,以便只检索满足特定条件的记录。

单条记录查询

  • 根据主键查询
	myDB.Take(&student, 1)
	fmt.Println(student)
	myDB.Take(&student, "1")
	fmt.Println(student)

注意:这里指定主键时可以是数字也可以是字符串

  • 根据其他条件来查询
	myDB.Take(&student, "name = ?", "fengxu")
	fmt.Println(student)

这里我们用?来作为占位符,这样可以有效的防止sql注入

  • 根据struct来查询
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)
	fmt.Println(student)
	student = Student{}
  • 获取查询结果
	var studentList []Student
		err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected  //获取查询结果条数
	fmt.Println(count)
}

完整代码:

func SingleSerach() {
	var student Student
	var studentList []Student

	//根据主键查询
	myDB.Take(&student, 1)
	fmt.Println(student)
	student = Student{}

	myDB.Take(&student, "3")
	fmt.Println(student)
	student = Student{}

	//根据字段查询
	myDB.Take(&student, "name = ?", "fengxu")
	fmt.Println(student)
	student = Student{}

	//根据struct来查询
	//student.ID = 4
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)
	fmt.Println(student)
	student = Student{}

	err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected
	fmt.Println(count)
}

多条记录查询

  • 简单示例:
func MultipleSearch() {
	var studentList []Student
	myDB.Find(&studentList)
	for _, v := range studentList {
		fmt.Println(v)
	}

	//上面我们打印的email是地址,我们需要对它进行序列化
	for _, v := range studentList {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}
}
  • 按照主键来查询
	studentList1 := []Student{}
	myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)
	for _, v := range studentList1 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

	studentList2 := []Student{}
	myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})
	for _, v := range studentList2 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

注意:这里其实用不用前片都可以,但是测试结果是切片速度明显较快,建议使用切片

  • 按照其他条件来查询
	//根据字段查询
	studentList := []Student{}
	myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)
	for _, v := range studentList {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

全部代码:

func MultipleSearch() {
	var studentList []Student
	myDB.Find(&studentList)
	for _, v := range studentList {
		fmt.Println(v)
	}

	//按主键查询
	studentList1 := []Student{}
	myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)
	for _, v := range studentList1 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}
	
	studentList2 := []Student{}
	myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})
	for _, v := range studentList2 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

	//根据字段查询
	studentList = []Student{}
	myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)
	for _, v := range studentList {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}
}

单表数据的更新

示例:

func Update() {
	var student Student
	myDB.Take(&student, 1)
	student.Name = "三玖"
	student.Sex = "女"
	myDB.Save(&student)
	fmt.Println(student)
}

注意:

  • Save会保留所有的字段,哪怕我们将字段的值设为0
  • Save函数其实是一个组合操作,如果当前不存在该字段,则是执行Create否则执行Update
  • 不要将 SaveModel一同使用, 这是 未定义的行为

单列更新

  • 更新单列指定字段
	//更新指定字段
	student = Student{}
	myDB.Take(&student)
	student.Age = 19
	myDB.Select("age").Save(&student)
	fmt.Println(student)
  • 批量更新
	//同时更新单个指定字段
	studentList := []Student{}
	myDB.Where("name like ?", "No.%").Find(&studentList).Update("age", 19)
	for _, v := range studentList {
		fmt.Println(v.Name, v.Age)
	}
	
	//同时更新多个指定字段
	Email := "sanjiu@163.com"
	new_student := Student{
		Age:   20,
		Sex:   "女",
		Email: &Email,
	}
	myDB.Model(&student).Where("name=?", "三玖").Updates(new_student)  //方法一:struct
	
	myDB.Model(&student).Where("name=?", "三玖").Updates(map[string]interface{}{
		"age":   20,
		"sex":   "女",
		"email": "sanjiu@163.com",
	})//  方法二:map

注意:Updates函数在struct方法更新字段时会自动忽略零值,如果想避免建议使用map或使用Select函数说明一下要更新的字段,示例如下:

DB.Model(&Student{}).Where("age = ?", 21).Select("gender", "email").Updates(Student{
  Email:  &email,
  Gender: false,
})

单表删除

func Delete() {
	var student Student
	var studentlist []Student
	myDB.Take(&student, 1)
	myDB.Delete(&student) //单行删除

	myDB.Take(&studentlist, []int{1, 2, 3})
	myDB.Delete(&studentlist) //批量删除
}

代码汇总

以上有关单表操作的全部代码:

package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Student struct {
	ID    uint    `gorm:"size:3"`
	Name  string  `gorm:"size:8"`
	Age   int     `gorm:"size:3"`
	Sex   string  `gorm:"size:3"`
	Email *string `gorm:"size:32"`
}

var myDB *gorm.DB
var mysqllogger logger.Interface

func init() {
	user := "root"
	password := "nicai"
	dbname := "gorm"
	ip := "127.0.0.1"
	port := "3306"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败,err:", err)
		return
	}
	fmt.Println("数据库连接成功")
	myDB = db
}

func initLogger() {
	var mysqlLogger logger.Interface
	mysqlLogger = logger.Default.LogMode(logger.Info) //设置日志打印级别
	mysqlLogger = logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // (日志输出的目标,前缀和日志包含的内容)
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  true,        // 使用彩色打印
		},
	)
	myDB.Logger = mysqlLogger
}

func SingleSerach() {
	var student Student
	var studentList []Student

	//根据主键查询
	myDB.Take(&student, 1)
	fmt.Println(student)
	student = Student{}

	myDB.Take(&student, "3")
	fmt.Println(student)
	student = Student{}

	//根据字段查询
	myDB.Take(&student, "name = ?", "fengxu")
	fmt.Println(student)
	student = Student{}

	//根据struct来查询
	//student.ID = 4
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)
	fmt.Println(student)
	student = Student{}

	err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected
	fmt.Println(count)
}

func MultipleSearch() {
	var studentList []Student
	myDB.Find(&studentList)
	for _, v := range studentList {
		fmt.Println(v)
	}

	//按主键查询
	studentList1 := []Student{}
	myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)
	for _, v := range studentList1 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

	studentList2 := []Student{}
	myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})
	for _, v := range studentList2 {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}

	//根据字段查询
	studentList = []Student{}
	myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)
	for _, v := range studentList {
		data, _ := json.Marshal(v)
		fmt.Println(string(data))
	}
}

func Update() {

	//update操作示例
	var student Student
	myDB.Take(&student, 1)
	student.Name = "三玖"
	student.Sex = "女"
	myDB.Save(&student)
	fmt.Println(student)

	//更新指定字段
	student = Student{}
	myDB.Take(&student)
	student.Age = 19
	myDB.Select("age").Save(&student)
	fmt.Println(student)

	//同时更新多列的指定字段
	studentList := []Student{}
	myDB.Where("name like ?", "No.%").Find(&studentList).Update("age", 19)
	for _, v := range studentList {
		fmt.Println(v.Name, v.Age)
	}

	//同时更新多列
	Email := "sanjiu@163.com"
	new_student := Student{
		Age:   20,
		Sex:   "女",
		Email: &Email,
	}
	myDB.Model(&student).Where("name=?", "三玖").Updates(new_student) //方法一:struct

	myDB.Model(&student).Where("name=?", "三玖").Updates(map[string]interface{}{
		"age":   20,
		"sex":   "女",
		"email": "sanjiu@163.com",
	}) //  方法二:map
}

func Delete() {
	var student Student
	var studentlist []Student
	myDB.Take(&student, 1)
	myDB.Delete(&student) //单行删除

	myDB.Take(&studentlist, []int{1, 2, 3})
	myDB.Delete(&studentlist) //批量删除
}

func main() {
	//var student Student
	initLogger()
	myDB.Session(&gorm.Session{
		Logger: mysqllogger,
	})

	//myDB.Take(&student) //默认查找第一条数据
	//fmt.Println(student)
	//student = Student{}
	//
	//myDB.First(&student) //查找第一条数据
	//fmt.Println(student)
	//student = Student{}
	//
	//myDB.Last(&student) //查找最后一条数据
	//fmt.Println(student)
	Delete()
}

结语

上面仅仅是我基于Gorm框架学习的一些笔记,详细可以参考:
GORM官方文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器人回调接口完善

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…

Python学习---利用Python操作数据库

如何理解连接connection和游标 cursor&#xff1f; connection就像是连接出发地和目的地的高速公路cursor就像是在高速公路上的货车-拉货我们使用游标就可以完成对数据的操作当我们完成操作完成后就可以停下货车&#xff0c;然后公路再停止使用。 pysql实现查询 ""…

需求开发和管理

人们对需求术语的困惑甚至延伸到整个学科的称谓上。有些作者将整个范围都称为“需求工程”。有些人统称为“需求管理”。还有些人认为这些活动属于广义上的业务分析的一个分支。我们发现&#xff0c;最好将需求工程分为需求开发和需求管理&#xff0c;如图所示。不管项目遵循什…

ubuntu2404 AMD64 编译并安装virtualbox7.0.18

ubuntu2404 AMD64 编译并安装virtualbox7.0.18 0、官方参考文档&#xff1a; https://www.virtualbox.org/wiki/Linux%20build%20instructions 1、下载源码&#xff1a; $ wget https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18.tar.bz2 2、安装库&…

基于信号分解方法的机械故障诊断方法存在的问题

一方面&#xff0c;由于结构共振、测试噪声的干扰&#xff0c;为了确保分解精度&#xff0c;需要给定准确的参数初值(例如&#xff0c;瞬时频率)。研究人员通常认为零部件特征频率与通过传动比和驱动转速计算的理论值基本吻合&#xff0c;并基于理论值设置参数初值。事实上&…

Pytest对协程异步函数进行单元测试

安装 安装基础包 pytest&#xff0c;pytest-asyncio pip install pytest pytest-asyncio测试&#xff1a; pytest -s -v ./python-code/do-async/aiohttp_session_pytest.py书写规范 类名必须以 Test 开头方法和函数名必须以test开头 class TestAddFunc(object): # 测试…

AIGC 006-textual-inversion使用文本反转实现个性化文本到图像生成!

AIGC 006-textual-inversion使用文本反转实现个性化文本到图像生成&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一种新颖的技术&#xff0c…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

揭秘Python安装目录:你的编程宝库隐藏了哪些宝藏?

python3.10安装目录结构 Python310/ │ ├── DLLs/ # Python 解释器所需的 DLL 文件 ├── Doc/ # Python 的 官方文档和参考手册 ├── include/ # 头文件和静态库文件 ├── Lib/ # Python 标准库 ├── libs/ …

可以免费试用得微信辅助工具wetool升级版,可以群发,可以清理僵尸粉,可以自动回复,可以批量添加

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

【C语言】二叉树的实现

文章目录 前言⭐一、二叉树的定义&#x1f6b2;二、创建二叉树&#x1f3a1;三、二叉树的销毁&#x1f389;四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f332;五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…

决策控制类软件项目的团队配置

决策控制类软件项目的团队配置怎样才是最合适的&#xff1f;目的就是实现高效的项目协作以及为企业降本增效。软件项目的主要费用来源是研发人员的开支以及差旅费用。 下面的思维导图从项目与产品的关系、团队架构、项目成员配置、项目可复制性、招聘这几点进行说明如何组织人…

力扣刷题--2176. 统计数组中相等且可以被整除的数对【简单】

题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k &#xff0c;请你返回满足 0 < i < j < n &#xff0c;nums[i] nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。 示例 1&#xff1a; 输入&#xff1a;nums [3,1,2,2,2,1,3], k …

VMware安装Windows Server 2012 R2

1.下载镜像 迅雷&#xff1a;ed2k://|file|cn_windows_server_2012_r2_vl_with_update_x64_dvd_6052729.iso|5545527296|BD499EBCABF406AB82293DD8A5803493|/ 2. 安装过程 【创建新的虚拟机】→ 【自定义】→ 【下一步】 【下一步】 【稍后安装】→ 【下一步】 选择版本 自定…

数据结构(五)

数据结构&#xff08;五&#xff09; 常见的排序算法内部排序交换插入选择归并基数 外部排序基于归并的 常见的排序算法 内部排序 交换 冒泡&#xff1a;每一次运行总会将最小的或者最大的放到前面&#xff0c;如果需要交换&#xff0c;一直在交换 快速排序*&#xff1a;经过…

python如何把字符串变成小写字母

Python中&#xff0c;将字符串中的字母转换成小写字母&#xff0c;字符串变量提供了2种方法&#xff0c;分别是title()、lower()。 Python title()方法 title()方法用于将字符串中每个单词的首字母转为大写&#xff0c;其他字母全部转为小写&#xff0c;转换完成后&#xff0…

SpringBoot+Vue开发记录(六)-- 后端配置mybatis

原型图什么的就先不管&#xff0c;后面再写。 本篇文章的主要内容就是springboot通过mybatis操作数据库实现增删改查。 重点是mybatis配置与相关文件数据&#xff0c;以后开新项目忘记了怎么配置的话可以再照着这个搞。 这算是最基础的部分了吧。 文章目录 一&#xff0c;配置…

计算机毕业设计 | SpringBoot招投标 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…

xgboost项目实战-保险赔偿额预测与信用卡评分预测001

目录 算法代码 原理 算法流程 xgb.train中的参数介绍 params min_child_weight gamma 技巧 算法代码 代码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1QV7nMC5ds5wSh-M9kuiwew?pwdx48l 提取码&#xff1a;x48l 特征直方图统计&#xff1a; fig, …

STL源码刨析:序列式容器之vector

目录 1.序列式容器和关联式容器 2.vector的定义和结构 3.vector的构造函数和析构函数的实现 4.vector的数据结构以及实现源码 5.vector的元素操作 前言 本系列将重点对STL中的容器进行讲解&#xff0c;而在容器的分类中&#xff0c;我们将容器分为序列式容器和关联式容器。本章…