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

14、Java 对象关系映射(ORM)框架:简化数据库操作的利器

嘿,Java 开发者们!在我们的编程旅程中,经常会遇到一个重要的任务,那就是将 Java 对象和数据库表进行交互。传统的 JDBC 编程虽然强大,但代码往往会变得繁琐且容易出错。这时候,对象关系映射(ORM)框架就闪亮登场啦 它可以极大地简化我们的数据库操作,将 Java 对象和数据库表之间的映射变得更加简单、直观和高效。今天,我们就来深入探讨一下 Java 中的 ORM 框架,看看它们是如何改变我们与数据库打交道的方式,让我们的开发工作更加轻松愉快吧!

一、ORM 框架的概念

1. 什么是 ORM?

对象关系映射(Object Relational Mapping,简称 ORM)是一种编程技术,它允许我们使用面向对象的方式来操作数据库,而不是直接编写 SQL 语句。ORM 框架会在 Java 对象和数据库表之间建立一种映射关系,将 Java 类映射到数据库表,将类的对象映射到表的行,将对象的属性映射到表的列。这样,我们就可以通过操作 Java 对象来完成数据库的操作,如插入、查询、更新和删除,而无需手动编写大量的 SQL 代码。

2. ORM 的优势

  • 代码简洁性:避免了大量的 JDBC 样板代码,使代码更加简洁和易于维护。
  • 对象导向:让开发人员专注于业务逻辑,使用面向对象的思维方式,而不是在对象和数据库表之间频繁转换。
  • 可移植性:可以轻松切换数据库,因为 ORM 框架会处理不同数据库之间的差异。

二、流行的 ORM 框架

1. Hibernate

Hibernate 是一个非常流行的开源 ORM 框架,它提供了强大的功能和丰富的特性。

1.1 配置 Hibernate

首先,我们需要在项目中添加 Hibernate 依赖,对于 Maven 项目,可以在 pom.xml 中添加:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.32.Final</version>
</dependency>

1.2 配置文件

我们需要配置 hibernate.cfg.xml 文件,指定数据库连接信息、方言等:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/mydatabase</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="dialect">org.hibernate.dialect.MySQL5Dialect</property><property name="hibernate.show_sql">true</property><mapping class="com.example.Student"/></session-factory>
</hibernate-configuration>

1.3 定义实体类

创建一个 Java 类,并使用注解或 XML 映射到数据库表:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;private String name;private int age;// 构造函数、getter 和 setter 方法public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

1.4 使用 Hibernate 进行数据库操作

以下是使用 Hibernate 进行基本数据库操作的示例:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateExample {public static void main(String[] args) {// 创建 SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 创建 SessionSession session = sessionFactory.openSession();try {// 开始事务session.beginTransaction();// 创建一个新的 Student 对象Student student = new Student("Alice", 25);// 保存对象session.save(student);// 提交事务session.getTransaction().commit();} catch (Exception e) {// 回滚事务session.getTransaction().rollback();e.printStackTrace();} finally {// 关闭 Sessionsession.close();sessionFactory.close();}}
}

2. MyBatis

MyBatis 是另一个优秀的 ORM 框架,它采用了一种不同的方式,将 SQL 语句与 Java 代码结合,提供了更灵活的数据库操作方式。

2.1 配置 MyBatis

在 pom.xml 中添加 MyBatis 依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>

2.2 配置文件

配置 mybatis-config.xml 文件,包含数据源和映射文件的信息:

<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/example/StudentMapper.xml"/></mappers>
</configuration>

2.3 映射文件和接口

创建 StudentMapper.xml 映射文件:

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.StudentMapper"><insert id="insertStudent" parameterType="com.example.Student">INSERT INTO students (name, age) VALUES (#{name}, #{age})</insert>
</mapper>

并创建一个对应的接口:

package com.example;import com.example.Student;public interface StudentMapper {void insertStudent(Student student);
}

2.4 使用 MyBatis 进行数据库操作

以下是使用 MyBatis 进行数据库操作的示例:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.Reader;public class MyBatisExample {public static void main(String[] args) throws IOException {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);SqlSession session = sqlSessionFactory.openSession();try {Student student = new Student("Bob", 30);StudentMapper mapper = session.getMapper(StudentMapper.class);mapper.insertStudent(student);session.commit();} catch (Exception e) {session.rollback();e.printStackTrace();} finally {session.close();}}
}

三、总结与实践

ORM 框架是 Java 开发中连接 Java 对象和数据库的强大工具,它们简化了数据库操作,让我们可以更专注于业务逻辑。Hibernate 提供了强大的对象映射和丰富的特性,适合那些更喜欢对象导向的开发者;而 MyBatis 提供了更灵活的 SQL 与代码结合的方式,适合需要精细控制 SQL 的场景。

你可以根据自己的需求选择适合的 ORM 框架,开始在自己的项目中应用它们,比如开发一个简单的用户管理系统或订单管理系统。在实践中,你会更好地理解这些框架的优缺点和使用技巧。如果你在使用 ORM 框架时遇到任何问题,欢迎在评论区留言,让我们一起探索如何使用 ORM 框架让我们的数据库操作更加轻松、高效,提升我们的开发效率和代码质量。

相关文章:

14、Java 对象关系映射(ORM)框架:简化数据库操作的利器

嘿&#xff0c;Java 开发者们&#xff01;在我们的编程旅程中&#xff0c;经常会遇到一个重要的任务&#xff0c;那就是将 Java 对象和数据库表进行交互。传统的 JDBC 编程虽然强大&#xff0c;但代码往往会变得繁琐且容易出错。这时候&#xff0c;对象关系映射&#xff08;ORM…...

鲁滨逊漂流记读后感

前言:学校要求出鲁滨逊漂流记的读后感啊&#xff0c;那么今天我就写着试试叭&#xff0c;好久都没更新了嘤&#xff0c;可能写的不好嗷。真的不是很建议参考&#xff0c;因为我的思想可能会与学校的要求不同&#xff0c;更多的是介入了自己的思考&#xff0c;从鲁滨逊好的地方和…...

【面试】【前端】前端网络面试题总结

一、前端网络面试题总结 网络相关知识是前端开发的核心内容之一&#xff0c;面试中通常会考察协议、网络模型、性能优化及常见网络问题的处理。以下是针对前端网络面试题的总结&#xff1a; &#xff08;一&#xff09;协议森林&#xff08;大话网络协议&#xff09; 网络协议…...

【MQ】如何保证消息队列的高性能?

零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件&#xff0c;基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…...

刀客doc:禁令影响下,TikTok广告业务正在被对手截胡

一、 现如今&#xff0c;TikTok在美国的命运迎来了暂时的反转&#xff0c;根据Adage的报道&#xff0c;广告主的投放在恢复。但短暂的关闭带来的影响依然有余震&#xff0c;一些广告主在重新评估TikTok在自己广告预算中的地位&#xff0c;这些是竞争对手截胡的机会。 长期以…...

中国电信AI大模型发布:评分超o1-preview,近屿智能带您探索AI技术新境界

近日&#xff0c;中国电信人工智能研究院宣布&#xff0c;其自主研发的复杂推理大模型TeleAI-t1-preview即将上线天翼AI开放平台。该模型采用强化学习训练方法&#xff0c;显著提升了逻辑推理和数学推导的准确性&#xff0c;展现了强大的复杂问题解决能力。 在权威评测中&#…...

服务定位器模式

服务定位器模式 引言 服务定位器模式&#xff08;Service Locator Pattern&#xff09;是一种设计模式&#xff0c;旨在解决应用程序中服务管理的问题。它通过提供一个中央服务注册中心&#xff0c;将服务提供者与服务消费者解耦&#xff0c;从而简化了服务的查找和依赖管理。…...

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统&#xff08;UnionFS&#xff09;、命名空间&#xff08;namespace&#xff09;、权限管理&#xff08;cgroup&#xff09;&#xff0c;虚拟出一…...

AI代理框架:突破LLMs极限的未来之路

标题&#xff1a;“AI代理框架&#xff1a;突破LLMs极限的未来之路” 文章信息摘要&#xff1a; 大型语言模型&#xff08;LLMs&#xff09;已接近通过预训练和数据扩展所能达到的极限&#xff0c;未来的AI进步将依赖于强化学习&#xff08;RL&#xff09;和代理框架。代理框架…...

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…...

人工智能在计算机视觉中的应用与创新发展研究

一、引言 1.1 研究背景与意义 1.1.1 研究背景 在当今数字化与智能化飞速发展的时代&#xff0c;人工智能已成为推动各领域变革的核心力量&#xff0c;而计算机视觉作为人工智能领域中极具活力与潜力的重要分支&#xff0c;正发挥着日益关键的作用。计算机视觉旨在赋予计算机…...

使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍

关于Qt的一点介绍 Qt是一个免费的开源部件工具包&#xff0c;用于创建跨平台GUI应用程序&#xff0c;允许应用程序从Windows瞄准多个平台&#xff0c;macOS&#xff0c; Linux和Android的单一代码库。但是Qt不仅仅是一个Widget工具箱和功能内置支持多媒体&#xff0c;数据库&am…...

4、PyTorch 第一个神经网络,手写神经网络的基本部分组成

假设有一个二维数据集&#xff0c;目标是根据点的位置将它们分类到两个类别中&#xff08;例如&#xff0c;红色和蓝色点&#xff09;。 以下实例展示了如何使用神经网络完成简单的二分类任务&#xff0c;为更复杂的任务奠定了基础&#xff0c;通过 PyTorch 的模块化接口&#…...

挂载mount

文章目录 1.挂载的概念(1)挂载命令&#xff1a;mount -t nfs(2)-t 选项&#xff1a;指定要挂载的文件系统类型(3)-o选项 2.挂载的目的和作用(1)跨操作系统访问&#xff1a;将Windows系统内容挂载到Linux系统下(2)访问外部存储设备(3)整合不同的存储设备 3.文件系统挂载要做的事…...

算法刷题Day30

题目链接 描述 解题思路 考点&#xff1a;动态规划 dp[i][j]表示当前坐标的最小路径和dp初始化状态转移&#xff1a; dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比较正上方和正左方的路径和哪个小。取小的那条路 代码 import copy class Solution:def minPathS…...

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…...

DeepSeek助攻!VS Code+Continue 解放双手编程!

简介 要想在vscode中采用AI&#xff0c;那么就需要添加AI插件&#xff0c;通过API来访问不同的模型。 Continue 插件 一款常用的AI代码助手&#xff0c;可以通过vscode和jetbrains来自动补全&#xff0c;推演代码。还有聊天功能。 https://marketplace.visualstudio.com/item…...

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…...

日志收集Day008

1.zk集群优化 修改zookeeper的堆内存大小&#xff0c;一般情况下&#xff0c;生产环境给到2G足以&#xff0c;如果规模较大可以适当调大到4G。 (1)配置ZK的堆内存 vim /app/softwares/zk/conf/java.env export JAVA_HOME/sortwares/jdk1.8.0_291 export JVMFLAGS"-Xms2…...

JVM栈溢出线上环境排查

#查看当前Linux系统进程ID、线程ID、CPU占用率&#xff08;-eo后面跟想要展示的列&#xff09; ps H -eo pid,tid,%cpups H -eo pid,tid,%cpu |grep tid #使用java jstack 查看进程id下所有线程id的情况 jstack pid 案例2 通过jstack 排查死锁问题 #启动java代码 jstack 进…...

golang命令大全5--依赖管理

今天介绍 Go 中的依赖管理命令&#xff0c;包括 go get、go list、go clean 1、go get 功能 go get命令用于获取远程依赖包&#xff0c;并将其安装到本地模块缓存中。它是 Go 模块管理的核心命令之一&#xff0c;可以帮助开发者快速添加第三方依赖。 使用方法 go get [选项…...

Sprintboot原理

配置优先级 Springboot中支持的三种配置文件&#xff1a; application.propertiesapplication.ymlapplication.yaml java系统属性&#xff1a;-Dxxxxxx 命令行参数&#xff1a;-xxxxxx 优先级&#xff1a;命令行参数>java系统属性>application.properties>applicat…...

架构技能(四):需求分析

需求分析&#xff0c;即分析需求&#xff0c;分析软件用户需要解决的问题。 需求分析的下一环节是软件的整体架构设计&#xff0c;需求是输入&#xff0c;架构是输出&#xff0c;需求决定了架构。 决定架构的是软件的所有需求吗&#xff1f;肯定不是&#xff0c;真正决定架构…...

动态规划<九>两个数组的dp

目录 引例 LeetCode经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门LeetCode<1143>最长公共子序列 画图分析&#xff1a; 使用动态规划解决 1.状态表示 ------经验题目要求 经验为选取第一个字符串的[0,i]区间以及第二个字…...

浅析百度AOI数据与高德AOI数据的差异性

目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的精准性和丰富性对于城市规划…...

白平衡与色温:摄影中的色彩密码

目录 一、色温&#xff1a;光线的色彩温度 &#xff08;一&#xff09;色温的定义与原理 &#xff08;二&#xff09;常见光源的色温 &#xff08;三&#xff09;相机色温与环境色温 二、白平衡&#xff1a;还原真实色彩的关键 &#xff08;一&#xff09;白平衡的定义与…...

【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例

目录 说明举例 说明 简单来说&#xff0c;android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要&#xff0c;而是多个控件的属性值之比发挥作用&#xff0c;例如有2个控件&#xff0c;各自的android:layout_weight的值设为0.5和0.5&#xff0…...

深度学习|表示学习|卷积神经网络|参数共享是什么?|07

如是我闻&#xff1a; Parameter Sharing&#xff08;参数共享&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的一个重要特性&#xff0c;帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说&#xff0c;在卷积层中&#xff0c;卷积核的参数&…...

【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?

人大毕竟是老牌985&#xff0c;复试难度不会太低&#xff01;建议同学认真复习&#xff01;没有机试还是轻松一些的&#xff01; 一、复试内容 由公告可见&#xff0c;复试包含笔试及面试&#xff0c;没有机试&#xff01; 二、参考书目 官方无给出参考书目&#xff0c;可参照…...

国内优秀的FPGA设计公司主要分布在哪些城市?

近年来&#xff0c;国内FPGA行业发展迅速&#xff0c;随着5G通信、人工智能、大数据等新兴技术的崛起&#xff0c;FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此&#xff0c;国内优秀的FPGA设计公司主要分布在哪些城市&a…...