何为ORM?

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,采用元数据来描述对象与关系映射的细节。只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

ORM框架分类

传统的 jdbc 是手工的,需要程序员加载驱动、建立连接、创建 Statement 对象、定义SQL语句、处理返回结果、关闭连接等操作

ORM分为两种类型,全自动ORM和半自动ORM,以Java中常见的两种ORM框架举例:

  • Hibernate 是自动化的,内部封装了JDBC,连 SQL 语句都封装了,理念是即使开发人员不懂SQL语言也可以进行开发工作,向应用程序提供调用接口,直接调用即可。

  • Mybatis 是半自动化的,是介于 jdbc 和 Hibernate之间的持久层框架,也是对 JDBC 进行了封装,不过将SQL的定义工作独立了出来交给用户实现,负责完成剩下的SQL解析,处理等工作。

两者根本区别

  • 全自动ORM不需要手动编写SQL,只需要操作相应对象即可,大大降低了对象与数据库的耦合性,而半自动ORM需要手动编写 SQL,可移植性全自动框架比半自动框架更高

  • 半自动框架支持动态SQL,处理列表,存储过程,开发工作量相对大些;全自动框架提供了对应语言操作数据库,如果项目需要支持多种数据库,代码开发量少,但 SQL语句的优化困难


模型定义

模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成

简单来说就是我们日常开发中定义的结构体

type User struct {ID           uintName         stringEmail        *stringAge          uint8Birthday     *time.TimeMemberNumber sql.NullStringActivatedAt  sql.NullTimeCreatedAt    time.TimeUpdatedAt    time.Time
}

gorm.Model

gorm倾向于约定大于配置,默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间

针对上述约定,GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {ID        uint           `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`
}

可以把gorm.Model嵌入自定义结构体中

type User struct {gorm.ModelName string
}
// 等效于
type User struct {ID        uint           `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`Name string
}

这样做有什么好处?

Create和Update的时候自动填充创建时间和更新时间,在创建的时候自动检测主键冲突,如果冲突则更新

在查询的时候自动保证数据不是被逻辑删除的

// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.Debug().First(&product, 1)                 // 根据整形主键查找

对应的SQL

当需要逻辑删除的时候,不需要额外编写update语句去更新,直接使用gorm中封装的Delete即可。

// Delete - 删除 product
db.Debug().Delete(&product)

对应的SQL

如果不想使用gorm.Model该如何达到上述效果?

字段标签

声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 camelCase 风格

type User struct {CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充UpdatedAt int       // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳纳秒数填充更新时间Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间Created   int64 `gorm:"autoCreateTime"`      // 使用时间戳秒数填充创建时间
}

更多标签:https://gorm.io/zh_CN/docs/models.html#embedded_struct

https://gorm.io/zh_CN/docs/associations.html#tags

Question:为什么支持这么多字段标签?

Migration特性

支持Migration特性,支持根据Go Struct结构自动生成对应的表结构。

// 根据User结构体,自动创建表结构.
db.AutoMigrate(&User{})

注意

【Gorm】增删改查使用入门相关推荐

  1. mybatis教程--实现增删改查的入门教程

    1 开发环境 jdk1.7.0_72 eclipse:eclipse-3.7-indigo mysql:mysql5.1 1.1 创建数据库 先导入sql_table.sql,再导入sql_data. ...

  2. gorm增删改查总结

    gorm在创建表时使用CreateTable方法进行处理,其参数可以是结构体变量的地址形式,也可以是结构体的地址形式. 例如: var t Tecent db.CreateTable(&t)或 ...

  3. golang gorm增删改查db.Model db.Where db.Table

    1. 创建 创建记录: user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}db.NewRecord(user) ...

  4. MySQL 学习一:新手一学就会,MySQL 零基础增删改查简单入门教程

    文章目录 前言 一.MySQL 的相关概念介绍 二.Windows 下 MySQL 的配置 2.1.MySQL 安装配置步骤 2.2.MySQL 服务的启动.停止与卸载 三.MySQL 脚本的基本组成 ...

  5. springboot+mybatis+mysql(增删改查xml入门编程)

    jdk1.8 idea 2017.2.6 springboot 2.x 项目搭建省略,直接上代码: 项目结构: application.properties配置 server.port=8086#加载 ...

  6. android 入门 006(sqlite增删改查)

    android 入门 006(sqlite增删改查) package cn.rfvip.feb_14_2_sqlite;import android.content.Context; import a ...

  7. mybatis完整增删改查入门实例

    mybatis完整增删改查入门实例 编程步骤 ①创建Java工程. ②导入jar包. ③创建sqlMapConfig.xml配置文件,这是mybatis的入口. ④创建数据库,数据库表user_c,插 ...

  8. ABP入门系列(5)——展现层实现增删改查

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终 ...

  9. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

最新文章

  1. 本科毕业的互联网女主管,却被迫要嫁给开挖掘机的高中毕业生!这是咋回事?...
  2. Spring 整合 RocketMQ
  3. 动态规划(一)入门例子
  4. 上传文件至数据库并下载
  5. Ubuntu 添加、删除ppa源
  6. sonarqube代码检核工具安装
  7. 【CV学习笔记】ROI与泛洪填充
  8. 请求服务器获取微信openid,Golang通过小程序获取微信openid的方法示例
  9. python语言表白语句简单_简短的表白情话
  10. ES5和ES6的继承有哪些优劣?
  11. 学Java开发到底能做什么工作?
  12. 已解决idea连接数据库异常:Exception in thread “main“ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
  13. 票房破9亿,翻拍片《误杀》凭什么口碑票房双丰收?
  14. 组策略 gpedit.msc 及修复“无法为文件 appv.admx (*.admx)找到适当的资源文件(错误=2)”报错
  15. DVWA环境搭建教程-手把手最详细介绍
  16. 哎!无奈,遇到DDos到底应该怎么办?阿里云将你扔进黑洞;腾讯云清退你!
  17. 洛谷 1417 烹调方案
  18. 《吹小号的天鹅|寻找C站宝藏》
  19. Apache服务网页和安全优化(带有小实验,轻松学习)
  20. java公共自行车租赁系统

热门文章

  1. 提高无线局域网网速的技巧
  2. centos下配置django、uwsgi和nginx(亲测成功)
  3. 数据库常用的增删改查sql语句
  4. word文件带有打开密码怎么办?
  5. 计算机组成原理知识点汇总(考研用)——第七章:输入/输出系统
  6. 河南省小学计算机教室配备目录,河南省教育厅关于印发《河南省中小学2021年春季电教教材推荐目录》的通知...
  7. 阿迪达斯再次开启球鞋快闪日,多款联名系列参与
  8. 微信公众号的配置及部署
  9. 每天学点儿树莓派(番外一)——AirPlay播放器
  10. Android 8.0 后使用AudioFocus音频焦点处理音频抢占问题