有关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.rhkb.cn/news/6984.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OS Copilot功能测评:智能助手的炫彩魔法

简介: OS Copilot 是一款融合了人工智能技术的智能助手,专为Linux系统设计,旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程,重点评测了其三个核心参数:-t(模式…

C++ lambda表达式

目录 1.lambda表达式 1.1什么是Lambda表达式? 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式? Lambda表达式是C11标准引入的一种匿名函数,它允许你在需要函数的地方直接编写代码…

环境变量配置与问题解决

目录 方法 配置了还是运行不了想要的东西 解决方案 为什么 解决方案 方法 方法一:此电脑右击-属性-相关链接-高级系统设置-环境变量(N)-系统变量里面找到Path-三个确定】 方法二:winr cmd 黑框输入sysdm.cpl,后面…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽:ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞:攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求,利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

【优选算法】10----无重复字符的最长子串

---------------------------------------begin--------------------------------------- 题目解析: 看到这一类题目,有没有那种一眼就感觉时要用到滑动窗口的感觉,铁子们? 讲解算法原理: 方法一: 暴力解法&#xff…

5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

HTML5 Web Worker 的使用与实践

引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…

使用 OpenCV 和 Python 轻松实现人脸检测

目录 一、准备工作 二、加载人脸检测模型 三、读取图像并进行人脸检测 四、处理视频中的人脸检测 五、优化人脸检测效果 六、总结 在人工智能和计算机视觉领域,人脸检测是一项非常基础且重要的技术。通过人脸检测,我们可以在图像或视频中识别并定位人脸,进而进行后续的…

GPB独立站外链:构建长期权威的SEO基础SEO的竞争

最终比拼的是资源,而外链资源是决胜的关键之一。GPB独立站外链正是为那些希望稳步提升网站权重的企业提供的一项长期投资方案。通过这些来自独立域名的高质量外链,你的网站不仅会获得谷歌的信任,还能在激烈的市场竞争中脱颖而出 GPB外链的最…

rocketmq顺序消费简述

概述 再引入mq解耦部分业务操作后,一些场景还需要顺序处理; 这就需要mq顺序消费了; rocketmq的顺序消费关键点在于对messagequeue的有序消费; 一个topic下有多个messagequeue(默认是4个),而且…

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名(所有节点)配置静态IP(所有节点)关闭防火墙和seLinux,清除iptables规则(所有节点)关闭交换分区(所有节点)修改/etc/hosts文件&…

net Core Ocelot(1)单地址,多地址

Ocelot 网关技术 》》》配置文件 》》》单地址 {"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", "Post" ],"UpstreamPathTe…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统(GIS)在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时,有时不清楚后端服务接口的具体路径,可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

每日十题八股-2025年1月24日

1.面试官:Kafka 百万消息积压如何处理? 2.面试官:最多一次、至少一次和正好一次有什么区别? 3.面试官:你项目是怎么存密码的? 4.面试官:如何设计一个分布式ID? 5.面试官:单点登录是怎么工作的…

Docker—搭建Harbor和阿里云私有仓库

Harbor概述 Harbor是一个开源的企业级Docker Registry管理项目,由VMware公司开发。‌它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务,提供比Docker官方公共镜像仓库更为丰富和安全的功能,特别适合企业环境使用。‌12 Harb…

基于Docker的Spark分布式集群

目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群,能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢?顾名思义,就是我们用户自己定义和设置的类型。 在C语言中,我们的自定义数据类型一共有三种,它们分别是:结构体(struct),枚举(enum),联合(union)。接下来,我…

记录让cursor帮我给ruoyi-vue后台管理项目整合mybatis-plus

自己整合过程中会出现 work.web.exception.GlobalExceptionHandler :100 | 请求地址/admin/device/install/detail/1,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.fire.mapper.DeviceInstallMapper.selectById at o…

HUMANITY’S LAST EXAM (HLE) 综述:人工智能领域的“最终考试”

论文地址:Humanity’s Last Exam 1. 背景与动机 随着大型语言模型(LLMs)能力的飞速发展,其在数学、编程、生物等领域的任务表现已超越人类。为了系统地衡量这些能力,LLMs 需要接受基准测试(Benchmarks&…