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

对象关系映射(ORM)

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于实现面向对象编程语言中对象模型与关系型数据库中数据模型之间的映射。它解决了对象模型与关系模型之间的 "阻抗不匹配" 问题,让开发者可以用面向对象的方式操作数据库,而无需编写复杂的 SQL 语句。

一、ORM 的核心思想

ORM 的核心思想是将数据库表与 Java 类对应,表中的字段与类的属性对应,表中的记录与类的实例对应。通过这种映射关系,开发者可以:

  • 用 Java 对象操作替代 SQL 操作
  • 避免手动编写 SQL 语句和处理结果集
  • 专注于业务逻辑而非数据访问细节
  • 提高开发效率和代码可维护性
二、ORM 的核心组成
  1. 实体类(Entity):与数据库表对应的 Java 类
  2. 映射规则:定义实体类与表、属性与字段之间的映射关系
  3. 会话(Session):负责实体对象与数据库之间的交互
  4. 查询语言:ORM 框架提供的面向对象查询方式(如 HQL、JPQL)
  5. 缓存机制:提高查询效率的缓存策略
三、Java 中主流的 ORM 框架
  1. Hibernate:功能全面的 ORM 框架,完全符合 JPA 规范
  2. MyBatis:轻量级 ORM 框架,保留 SQL 控制权,更灵活
  3. Spring Data JPA:基于 JPA 的简化数据访问层框架
  4. JPA(Java Persistence API):ORM 规范,不是具体实现
四、ORM 实现原理简析

ORM 框架的核心原理基于 Java 反射和动态代理:

  1. 通过反射获取实体类的元数据(属性、注解等)
  2. 根据映射规则生成对应的 SQL 语句
  3. 执行 SQL 并将结果集通过反射映射回 Java 对象
  4. 使用动态代理实现延迟加载等高级特性
五、JPA 基础示例

JPA 是 Java EE 的规范,定义了 ORM 的标准接口,以下是一个简单示例:

import javax.persistence.*;
import java.util.Date;// 实体类与表映射
@Entity
@Table(name = "t_user")
public class User {// 主键映射@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 字段映射@Column(name = "user_name", length = 50, nullable = false)private String username;@Column(name = "create_time")private Date createTime;// 省略getter和setterpublic Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public Date getCreateTime() { return createTime; }public void setCreateTime(Date createTime) { this.createTime = createTime; }
}

使用 JPA 进行数据操作:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.Date;
import java.util.List;public class JpaDemo {public static void main(String[] args) {// 创建EntityManagerFactoryEntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");EntityManager em = emf.createEntityManager();// 新增操作em.getTransaction().begin();User user = new User();user.setUsername("ORM示例");user.setCreateTime(new Date());em.persist(user); // 保存对象em.getTransaction().commit();// 查询操作User foundUser = em.find(User.class, 1L); // 根据ID查询System.out.println("找到用户: " + foundUser.getUsername());//  JPQL查询List<User> users = em.createQuery("SELECT u FROM User u WHERE u.username LIKE :name", User.class).setParameter("name", "%示例%").getResultList();// 更新操作em.getTransaction().begin();foundUser.setUsername("更新后的名称");em.merge(foundUser); // 更新对象em.getTransaction().commit();// 删除操作em.getTransaction().begin();em.remove(foundUser); // 删除对象em.getTransaction().commit();// 关闭资源em.close();emf.close();}
}
六、MyBatis 示例

MyBatis 是另一种流行的 ORM 框架,更注重 SQL 的灵活性:

  1. 实体类:
public class User {private Long id;private String username;private Date createTime;// 省略getter和setter
}
  1. Mapper 接口:
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserMapper {@Select("SELECT * FROM t_user WHERE id = #{id}")User findById(Long id);void insert(User user);void update(User user);void delete(Long id);
}
  1. XML 映射文件(UserMapper.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper"><insert id="insert" parameterType="com.example.entity.User">INSERT INTO t_user (user_name, create_time)VALUES (#{username}, #{createTime})</insert><update id="update" parameterType="com.example.entity.User">UPDATE t_userSET user_name = #{username}, create_time = #{createTime}WHERE id = #{id}</update><delete id="delete" parameterType="java.lang.Long">DELETE FROM t_user WHERE id = #{id}</delete>
</mapper>
  1. 使用示例:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;public class MyBatisDemo {public static void main(String[] args) {// 获取SqlSessionFactory(实际应用中通过配置文件初始化)SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);// 查询User user = userMapper.findById(1L);System.out.println("用户名称: " + user.getUsername());// 新增User newUser = new User();newUser.setUsername("MyBatis示例");newUser.setCreateTime(new Date());userMapper.insert(newUser);// 提交事务session.commit();}}private static SqlSessionFactory getSqlSessionFactory() {// 实际应用中通过MyBatis配置文件创建return null;}
}
七、ORM 的优缺点

优点

  1. 提高开发效率,减少重复的 SQL 编写工作
  2. 使代码更面向对象,符合 Java 编程思想
  3. 屏蔽不同数据库的差异,便于数据库迁移
  4. 提供缓存机制,提升性能
  5. 简化事务管理等数据访问层功能

缺点

  1. 对于复杂查询,ORM 生成的 SQL 可能效率不高
  2. 过度封装可能导致调试困难
  3. 学习成本较高,需要掌握特定框架的用法
  4. 某些场景下性能可能不如直接使用 JDBC
八、ORM 的适用场景
  1. 中大型企业级应用
  2. 业务逻辑复杂,数据模型多变的系统
  3. 需要快速开发和迭代的项目
  4. 团队协作开发,需要统一数据访问规范的场景

ORM 技术已经成为 Java 企业级开发的基础,掌握一种主流 ORM 框架是 Java 开发者的必备技能。在实际项目中,应根据项目需求和团队情况选择合适的 ORM 框架,平衡开发效率和系统性能。

http://www.dtcms.com/a/406275.html

相关文章:

  • 在VS Code 中为Roo Code 添加 Bright Data 的本地MCP服务器
  • 专业的制作网站开发公司wordpress界面404
  • Python Pillow库详解:图像处理的瑞士军刀
  • AI 时代的安全防线:国产大模型的数据风险与治理路径
  • Deepoc具身智能模型:为传统机器人注入“灵魂”,重塑建筑施工现场安全新范式
  • 鸿蒙NEXT安全控件解析:实现精准权限管控的新范式
  • 创建自己的网站广告图片
  • GraphRAG:引领自然语言处理进入深层语义分析新纪元
  • 免费的个人简历电子版seo怎么优化排名
  • 5、urbane-commerce 微服务统一依赖版本管理规范
  • 17.DHCP服务器及DNS服务
  • 如何在 Vue 中打印页面:直接用 web-print-pdf(npm 包)
  • 响应式网站内容布局网站开发团队成员介绍
  • PaintBoard+cpolar:云端画板的远程创作方案
  • 9月25日星期四今日早报简报微语报早读
  • 零基础学AI大模型之AI大模型可视化界面
  • 深圳建设工程项目网站沈阳网站模板建站
  • (二)3.1.9 生产“稳”担当:Apache DolphinScheduler Worker 服务源码全方位解析
  • Linux-01(Linux 基础命令)
  • 苹果群控系统的游戏运营
  • 英迈思做的网站怎么样建设网站时 首先要解决两个问题 一是什么
  • 风险网站如何解决办法关于加强公司 网站建设的通知
  • 7、revision 是 Maven 3.5+ 引入的现代版本管理机制
  • Maven入门:高效构建Java项目
  • Hadess入门到实战(2) - 如何管理Maven制品
  • maven pom文件中<dependencyManagement><dependencies><dependency> 三者的区别
  • Django数据库连接数超限问题分析与解决方案
  • 软考 UML 用例图 extend扩展关系 include包含关系 泛化继承inherit关系
  • 代码随想录算法训练营第五十一天|99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积
  • Maven setting文件中<mirrors>(镜像)和 <servers>两个标签的区别