什么是 ORM
ORM(Object–relational mapping) 是一种编程技术和模式,用于将关系型数据库中的数据映射到对象导向编程语言中的对象,从而在应用程序中以面向对象的方式来处理数据库操作。
它允许开发人员使用类和对象来表示数据库表和记录,而不需要直接编写 SQL 查询语句。ORM 系统负责将对象的操作转化为对数据库的操作,同时也负责将数据库中的数据转化为对象,提供了一种更高层次、抽象的数据库访问方法。
一些常见的ORM框架和库包括 Hibernate(Java)、Entity Framework(.NET)、Django ORM(Python)、Sequelize(Node.js),以及各种其他语言和平台上的 ORM 工具。这些工具通常提供以下功能:
-
对象映射:ORM 工具会自动将数据库表映射到编程语言中的类,表的列映射到类的属性,从而简化了数据模型的管理。
-
查询语言:它们通常提供自己的查询语言或 API,使开发人员能够使用面向对象的方式查询和操作数据库,而不必编写原始的SQL查询。
-
数据关系管理:ORM 可以处理表之间的关系,如一对多、多对一、多对多等,使开发人员能够更自然地表示和操作这些关系。
-
数据库独立性:ORM 工具通常提供数据库独立性,允许应用程序在不同数据库管理系统上运行,而不必更改大部分应用程序代码。
-
自动生成模式:一些 ORM 框架可以自动生成数据库模式、迁移数据和进行数据库操作,从而减少了手动数据库管理的工作。
-
缓存管理:一些 ORM 工具支持缓存技术,可以提高应用程序的性能。
ORM的主要目标是简化数据库操作,提高开发效率,减少错误和提供更高的抽象级别,使开发人员可以更专注于业务逻辑而不必过多关注数据库细节。但需要注意,ORM 并不是在所有情况下都是最佳选择,特别是在需要高度优化性能的情况下,可能需要直接编写 SQL 查询语句。
为什么需要 ORM
-
数据模型一致性:ORM 使开发人员能够使用面向对象的编程语言来表示数据库表和关系,这有助于保持数据模型的一致性。开发人员可以在代码中使用类和对象来表示数据库表和记录,而不需要手动编写 SQL 语句。
-
提高生产效率:ORM 减少了开发人员编写和维护SQL查询语句的工作量。这意味着开发人员可以更快地开发应用程序,因为他们可以专注于业务逻辑而不是数据库细节。
-
跨数据库兼容性:ORM 通常提供了跨不同数据库管理系统的兼容性。这意味着您可以更容易地切换或同时使用不同类型的数据库,而不必更改大部分应用程序代码。
-
安全性:ORM 可以帮助防止 SQL 注入攻击,因为它们通常会自动处理输入数据的转义和参数化查询。
-
抽象数据库细节:ORM 将数据库细节进行了抽象,使开发人员可以更专注于业务逻辑,而不必过多关注数据库的特定实现细节。
-
代码维护性:ORM 可以使代码更容易维护,因为它们将数据库访问逻辑集中在一个地方,而不是分散在应用程序的各个部分。
-
自动化:ORM 通常提供了自动生成数据库模式、迁移数据和进行数据库操作的工具,减少了手动管理数据库的需求。
Sequelize
Sequelize 是适用于 Oracle、Postgres、MySQL、MariaDB、SQLite 和 SQL Server 等的现代 TypeScript 和 Node.js ORM。
现在从一个小案例开始:
目录结构
1
2
3
4
5
6
7
.
├── index.js
├── models
│ ├── admin.js
│ └── db.js
├── package-lock.json
└── package.json
在 db.js 中进行数据库的连接
1
2
3
4
5
6
7
8
const Sequelize = require("sequelize")
const sequelize = new Sequelize("database", "username", "password", {
host: "localhost",
dialect: "mysql"
})
module.exports = sequelize
在 admin.js 中进行模型对象的创建,也就是用于映射到具体某个表的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const sequelize = require("./db")
const { DataTypes } = require("sequelize")
// 创建一个模型对象
const Admin = sequelize.define("Admin", {
loginId: {
type: DataTypes.STRING,
allowNull: false
},
loginPwd: {
type: DataTypes.STRING,
allowNull: false
},
name: {
type: DataTypes.STRING,
allowNull: false
}
}, {
createdAt: false,
updatedAt: false,
paranoid: true // 一个 paranoid 表示一个被告知删除记录 不会真正删除它的表 一个名为 deletedAt 的特殊列会将其值设置为该删除请求的时间戳
})
const createModel = async () => {
await Admin.sync({ alter: true })
console.log("模型 Admin 同步完成")
}
createModel()
module.exports = Admin
最后在 index.js 中进行导入 admin.js,并使用 node 命令运行它,大功告成。
更多有关 Sequelize 的学习参见官方文档 https://sequelize.org