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

有关ORM

什么是 ORM

ORM(对象关系映射,Object-Relational Mapping)是一种编程技术,用于在面向对象编程语言中实现对象与关系数据库之间的映射。通过ORM,开发者可以使用面向对象的方式操作数据库,而无需直接编写SQL语句。

ORM 的核心功能

  1. 对象与表的映射:将数据库表映射为编程语言中的类,表中的每一行对应一个对象实例,每一列对应对象的属性。
  2. 数据操作:提供增删改查(CRUD)等操作的接口,开发者通过操作对象间接操作数据库。
  3. 关系管理:支持表之间的关联(如一对一、一对多、多对多),并通过对象关系表达这些关联。
  4. 查询语言:提供面向对象的查询语言(如Hibernate的HQL),简化复杂查询的编写。

ORM 的优点

  • 提高开发效率:减少手动编写SQL的工作量,专注于业务逻辑。
  • 代码可维护性:面向对象的代码更易理解和维护。
  • 数据库无关性:ORM框架通常支持多种数据库,便于切换数据库系统。
  • 减少错误:自动生成SQL语句,降低手写SQL出错的风险。

ORM 的缺点

  • 性能问题:自动生成的SQL可能不够高效,复杂查询时性能较差。
  • 学习成本:需要学习ORM框架的使用方法。
  • 灵活性不足:某些复杂查询可能难以通过ORM实现,仍需手写SQL。

ORM解决了哪些问题

数据库操作的便捷性

  • 简化数据访问代码:在传统的数据库操作中,程序员需要编写大量的SQL语句来完成数据的增删改查等操作。而ORM框架通过提供一套抽象的接口和方法,使得程序员可以使用面向对象的方式来操作数据库。例如,在使用Hibernate ORM框架时,可以通过调用对象的方法来实现数据的插入、更新和删除,无需直接编写SQL语句。像session.save(entity)就可以将一个Java对象保存到数据库中,大大减少了代码量,提高了开发效率。
  • 减少错误和提高可维护性:由于ORM框架封装了SQL语句的生成和执行过程,程序员不需要手动编写SQL语句,从而减少了因手写SQL语句而导致的语法错误、SQL注入等安全问题。同时,当数据库表结构发生变化时,通过调整ORM框架中的映射配置,就可以使代码适应新的数据库结构,而不需要修改大量的SQL语句,提高了代码的可维护性。

对象与关系数据库的映射问题

  • 自动映射对象到数据库表:在面向对象的程序设计中,数据通常以对象的形式存在,而关系数据库中数据是以表的形式存储的。ORM框架可以自动将程序中的对象映射到数据库中的表。例如,在一个Java项目中,有一个User类,ORM框架可以将这个类映射到数据库中的user表,类的属性对应表的字段。程序员只需要定义好对象和数据库表之间的映射关系,ORM框架就可以自动处理对象和数据库表之间的转换。
  • 处理复杂的数据关系:现实世界中的数据往往存在复杂的关系,如一对一、一对多、多对多等关系。ORM框架能够很好地处理这些复杂的数据关系。以Hibernate为例,它支持多种关联映射策略,如使用@OneToOne@OneToMany@ManyToOne@ManyToMany注解来定义对象之间的关联关系,并且可以自动处理关联数据的加载和保存。例如,在一个订单系统中,一个订单(Order)对应多个订单项(OrderItem),通过ORM框架可以方便地实现这种一对多关系的映射和操作。

提高开发效率和可移植性

  • 提高开发效率:ORM框架提供了一套通用的数据操作接口和方法,程序员可以快速地实现数据的持久化操作,而不需要花费大量时间去编写和调试SQL语句。同时,许多ORM框架还提供了代码生成工具,可以根据数据库表结构自动生成对应的实体类和数据访问对象(DAO)代码,进一步提高了开发效率。
  • 提高数据库的可移植性:不同的数据库系统(如MySQL、Oracle、SQL Server等)有不同的SQL方言。ORM框架可以屏蔽不同数据库之间的差异,提供统一的数据访问接口。程序员在编写代码时,不需要关心具体的数据库类型,只要配置好ORM框架的数据库连接信息,就可以在不同的数据库之间切换,提高了应用程序的可移植性。例如,一个使用MyBatis ORM框架开发的应用程序,从MySQL数据库迁移到PostgreSQL数据库时,只需要修改数据库连接配置和部分数据库方言相关的配置,而不需要修改大量的数据访问代码。

事务管理

  • 简化事务处理:在多用户并发访问的系统中,事务管理是非常重要的。ORM框架通常提供了事务管理的功能,可以简化事务的处理过程。程序员可以通过配置或编程的方式定义事务的边界,ORM框架会自动管理事务的提交和回滚。例如,在Spring框架中,可以使用@Transactional注解来声明事务,当方法执行成功时,事务自动提交;如果方法执行过程中出现异常,事务自动回滚,从而保证了数据的一致性和完整性。
  • 集成事务管理策略:ORM框架可以与应用程序的事务管理策略进行集成。例如,Hibernate可以与Spring的事务管理器集成,利用Spring提供的声明式事务管理功能,实现事务的传播行为、隔离级别等的灵活配置。这样,程序员可以根据不同的业务场景,选择合适的事务管理策略,确保系统的稳定运行。

Node中常用的ORM有哪些

在 Node.js 生态系统中,ORM(对象关系映射)工具是开发者与数据库交互的重要工具。它们通过将数据库表映射为 JavaScript 对象,简化了数据库操作。以下是 Node.js 中常用的 ORM 工具及其特点:


1. TypeORM

特点

  • 支持多种数据库:MySQL、PostgreSQL、SQLite、MariaDB、MongoDB 等。
  • TypeScript 优先:原生支持 TypeScript,提供强大的类型检查和代码提示。
  • Active Record 和 Data Mapper 模式:支持两种常见的 ORM 模式。
  • 迁移和同步:支持数据库迁移和自动同步。

适用场景

  • 需要 TypeScript 支持的项目。
  • 使用多种数据库的项目。

示例

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;
}

2. Sequelize

特点

  • 支持多种数据库:PostgreSQL、MySQL、SQLite、SQL Server 等。
  • 成熟的生态系统:拥有丰富的插件和社区支持。
  • 强大的查询功能:支持复杂的查询和事务。
  • 迁移支持:提供数据库迁移工具。

适用场景

  • 需要支持多种数据库的项目。
  • 需要复杂查询和事务管理的项目。

示例

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

(async () => {
  await sequelize.sync();
  const user = await User.create({ name: 'John' });
  console.log(user.toJSON());
})();

3. Prisma

特点

  • 类型安全的数据库访问:自动生成 TypeScript 类型,提供更好的开发体验。
  • 声明式数据模型:通过 Prisma Schema 定义数据模型。
  • 强大的查询功能:支持链式调用和复杂查询。
  • 数据库迁移:提供直观的迁移工具。

适用场景

  • 需要类型安全和现代化开发体验的项目。
  • 使用 GraphQL 或 RESTful API 的项目。

示例

// schema.prisma
model User {
  id    Int    @id @default(autoincrement())
  name  String
}
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

async function main() {
  const user = await prisma.user.create({
    data: { name: 'John' },
  });
  console.log(user);
}

main();

4. Mongoose

特点

  • 专为 MongoDB 设计:提供强大的 MongoDB 操作功能。
  • Schema 定义:通过 Schema 定义数据模型和验证规则。
  • 中间件支持:支持 pre/post 钩子函数。
  • 丰富的插件:社区提供了大量插件。

适用场景

  • 使用 MongoDB 的项目。
  • 需要 Schema 验证和中间件支持的项目。

示例

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

const userSchema = new mongoose.Schema({
  name: String,
});

const User = mongoose.model('User', userSchema);

const user = new User({ name: 'John' });
user.save().then(() => console.log('User saved'));

5. Knex.js

特点

  • SQL 查询构建器:支持链式调用,生成 SQL 查询。
  • 支持多种数据库:PostgreSQL、MySQL、SQLite、SQL Server 等。
  • 迁移和种子数据:提供数据库迁移和种子数据工具。
  • 轻量级:不强制使用 ORM 模式,灵活性高。

适用场景

  • 需要直接操作 SQL 的项目。
  • 需要灵活性和轻量级工具的项目。

示例

const knex = require('knex')({
  client: 'sqlite3',
  connection: { filename: './mydb.sqlite' },
});

knex('users')
  .insert({ name: 'John' })
  .then(() => console.log('User inserted'));

6. Objection.js

特点

  • 基于 Knex.js:继承了 Knex.js 的查询构建功能。
  • 支持多种数据库:PostgreSQL、MySQL、SQLite 等。
  • Active Record 模式:支持模型实例操作。
  • 灵活的查询:结合了 SQL 的灵活性和 ORM 的便利性。

适用场景

  • 需要结合 SQL 和 ORM 优势的项目。
  • 需要灵活查询和模型操作的项目。

示例

const { Model } = require('objection');
const Knex = require('knex');

const knex = Knex({ client: 'sqlite3', connection: { filename: './mydb.sqlite' } });
Model.knex(knex);

class User extends Model {
  static get tableName() {
    return 'users';
  }
}

async function createUser() {
  const user = await User.query().insert({ name: 'John' });
  console.log(user);
}

createUser();

7. Waterline

特点

  • 适配器模式:支持多种数据库(如 MySQL、MongoDB、PostgreSQL)。
  • 统一的 API:无论使用哪种数据库,API 保持一致。
  • Sails.js 的默认 ORM:与 Sails.js 框架深度集成。

适用场景

  • 使用 Sails.js 框架的项目。
  • 需要统一 API 操作多种数据库的项目。

示例

const Waterline = require('waterline');
const sailsMysqlAdapter = require('sails-mysql');

const waterline = new Waterline();

const userCollection = Waterline.Collection.extend({
  identity: 'user',
  connection: 'myLocalMySQL',
  attributes: {
    name: 'string',
  },
});

waterline.loadCollection(userCollection);

waterline.initialize({ adapters: { mysql: sailsMysqlAdapter } }, (err, ontology) => {
  if (err) throw err;
  const User = ontology.collections.user;
  User.create({ name: 'John' }).then(console.log);
});

总结

  • TypeORM:适合 TypeScript 项目,支持多种数据库。
  • Sequelize:成熟稳定,适合复杂查询和事务管理。
  • Prisma:现代化、类型安全,适合 GraphQL 和 RESTful API。
  • Mongoose:专为 MongoDB 设计,适合 Schema 验证和中间件支持。
  • Knex.js:轻量级 SQL 查询构建器,适合直接操作 SQL。
  • Objection.js:结合 SQL 和 ORM 的优势,适合灵活查询。
  • Waterline:适合 Sails.js 项目,支持多种数据库。

根据项目需求和技术栈选择合适的 ORM 工具,可以大大提高开发效率和代码质量。


http://www.kler.cn/a/519631.html

相关文章:

  • mysql 学习6 DQL语句,对数据库中的表进行 查询 操作
  • 矩阵的秩在机器学习中具有广泛的应用
  • 案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设
  • websocket实现
  • (2)STM32 USB设备开发-USB虚拟串口
  • [特殊字符]【计算机视觉】r=2 采样滤波器全解析 ✨
  • golang命令大全1--概述
  • Maven面试试题及其答案解析
  • 基础项目实战——学生管理系统(c++)
  • 【Elasticsearch】Springboot编写Elasticsearch的RestAPI
  • Vue 响应式渲染 - 模板语法
  • BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机
  • 如何实现一个简单的中文错别字高亮系统?
  • 使用python-docx包进行多文件word文字、字符批量替换
  • 【数据分享】1929-2024年全球站点的逐日降水量数据(Shp\Excel格式)
  • springboot使用tomcat浅析
  • 【全栈】SprintBoot+vue3迷你商城(7)
  • 从入门到精通:HttpClient深度剖析与实战指南
  • SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)
  • Maven的继承与聚合特性:大型项目管理的利器
  • 【Linux笔记】Day5
  • Vue 3 30天精进之旅:Day 04 - 计算属性与侦听器
  • Labview替代平台ATECLOUD的兼容性如何?
  • Docker常用知识点问题
  • K8S中的数据存储之基本存储
  • 共同建设:GAEA 社区如何塑造 AI 的未来