【java】Hibernate访问数据库

news2024/11/16 8:53:37

一、Hibernate访问数据库案例

Hibernate 是一个在 Java 社区广泛使用的对象关系映射(ORM)工具。它简化了 Java 应用程序中数据库操作的复杂性,并提供了一个框架,用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使用 Hibernate 访问数据库的示例案例。

首先,需要添加 Hibernate 和数据库驱动的依赖到项目。假如正在使用 Maven,需要添加如下依赖到 pom.xml 文件:

<!-- Hibernate core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.9.Final</version>
</dependency>

<!-- JDBC Driver for your database (e.g., MySQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

接下来,需要配置 Hibernate。这通常通过一个名为 hibernate.cfg.xml 的 XML 文件完成,该文件放置在应用的 classpath 下。示例如下:

<!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>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="connection.username">your_username</property>
        <property name="connection.password">your_password</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <!-- Mapped model classes -->
        <mapping class="com.example.YourEntity"/>
    </session-factory>
</hibernate-configuration>

在 Java 代码中,需要一个模型类(例如 YourEntity.java),它被映射到数据库表中:

import javax.persistence.*;

@Entity
@Table(name = "your_entity")
public class YourEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "some_field")
    private String someField;

    // Getters and setters omitted for brevity
}

然后,可以使用 Hibernate 的 SessionFactory 来创建会话,执行数据库操作。这里是一个基本的使用例子:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateExample {
    public static void main(String[] args) {
        // Configuring Hibernate
        Configuration configuration = new Configuration().configure();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties()).build();
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        // Opening a session
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            // Creating a new entity
            YourEntity yourEntity = new YourEntity();
            yourEntity.setSomeField("Hello, Hibernate!");
            // Persisting the entity to the database
            // 持久化实体到数据库
            session.save(yourEntity);

            // 提交事务以确保数据被保存到数据库中
            transaction.commit();

        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback(); // 如果出现异常则回滚事务
            }
            e.printStackTrace();  // 打印异常栈信息
        } finally {
            if (session != null) {
                session.close();  // 在最后确保会话被关闭
            }
        }

        // 关闭SessionFactory(在应用结束时执行)
        sessionFactory.close();
    }
}

这个例子首先配置了 Hibernate 连接信息,然后创建了 SessionFactory,它是创建会话(`Session`)的工厂。每一个 Session 表示和数据库的一次对话,在一个 Session 中你可以执行数据库操作。我们创建实体对象 yourEntity,设置了其属性,并通过 session.save(yourEntity) 保存它到数据库。

事务 Transaction 被用来确保操作的原子性,如果在事务中发生了错误,我们可以回滚事务以避免脏数据写入数据库。任何对数据库的修改操作,如保存(save)、更新(update)或删除(delete),都应该在事务中进行。

最后,示例代码包括了异常处理,以及确保在操作结束后关闭会话和 SessionFactory。`SessionFactory` 是一个重量级的对象,最好在应用程序生命周期结束时关闭它。一个典型的做法是创建一个全局或静态的 SessionFactory 实例,并在需要时打开和关闭会话。

这个例子假设有相应的数据库和表已经创建好,并且实体类 YourEntity 已经正确映射了数据库表结构。这个简单的例子没有展示 Hibernate 查询语言(HQL)的强大性能和其他高级特性,但它为入门Hibernate提供了一个基本框架。在实际应用中,可能需要考虑更高级的配置和性能优化措施。 

二、Hibernate将对象模型数据映射到传统的关系型数据库

Hibernate是一个对象关系映射(ORM)框架,它允许开发人员通过面向对象的方式操作数据库。Hibernate将JAVA类映射到数据库表,并将Java数据类型映射到SQL数据类型,从而实现了Java应用程序中的对象模型数据与传统关系型数据库的映射。这种映射机制通常被称为O/R映射(Object/Relational mapping)。

使用Hibernate时,可以通过编写Java对象(被称为“实体”)并使用注解或XML文件来定义这些对象和数据库表之间的映射关系。Hibernate会负责在对象状态变化和数据库操作之间进行协调,提供以下优点:

1. 抽象数据访问层:Hibernate提供了一个数据访问的抽象层,不需要编写特定数据库的SQL语句,可以专注于业务逻辑。

2. 数据库无关性:由于Hibernate提供了SQL层的抽象,因此Hibernate应用程序可以轻松切换底层的数据库,而不需要对代码进行大量的修改。

3. 面向对象的优点:使用Hibernate后,可以享受面向对象编程的诸多优点,例如继承、多态和封装,这些通常在传统的关系数据库中不容易实现。

4. 简化复杂关联:处理数据库中的关联关系(如一对多、多对多)在传统的SQL编程中可能会相对复杂,Hibernate为这些关系提供了映射和查询的便利。

5. 数据缓存:Hibernate提供了一级和二级缓存机制,可以减少对数据库的访问次数,提高应用程序的性能。

6. 懒加载:Hibernate允许配置懒加载,即在实际需要数据之前不提前加载数据,从而提高系统的性能。

总而言之,Hibernate框架的设计使得Java开发人员可以通过面向对象的方法来处理持久化数据,而不必深入研究SQL语句以及数据库特定的细节,这简化了数据访问层的开发,同时允许我们更容易地进行数据持久化操作。

三、Maven

Maven 是一个项目管理和构建自动化工具,主要用于 Java 项目,但也可以被用于构建和管理其他语言编写的项目,比如 C#, Ruby 等。Maven 提供了一种标准化的构建过程,并通过其项目对象模型(Project Object Model, POM)和插件机制来管理构建的生命周期。

以下是 Maven 的一些主要功能:

1. 项目构建: Maven 能自动完成项目构建过程,包括编译、测试、打包和部署等步骤。

2. 依赖管理: Maven 使用中央仓库来管理依赖项,能自动下载所需的库文件,解决项目依赖关系。

3. 项目信息管理: Maven 可以管理项目的文档、网站、报告等资料。

4. 构建标准化: Maven 提供了一种标准化的构建生命周期和一套默认的目录结构,增加了项目之间的一致性。

5. 易于使用: Maven 设计了简单的项目配置文件(pom.xml),定义了项目的构建配置、依赖关系等信息。

6. 扩展性: Maven 可以通过插件扩展功能,社区提供了大量可复用的插件,用户也可以根据需要开发自己的插件。

总的来说,Maven 旨在简化构建过程,并提供了一种便捷的方式来管理项目的构建,依赖以及其他方面的需求。  

Maven 使用了一种中央化的方式来管理项目生命周期、构建、文档生成、报告、依赖、SCM等项目管理相关的任务。

如果想要使用 Maven,可以按照以下基本步骤操作:

1. 安装 Java: 确保开发环境已经安装了 Java 开发工具包 (JDK)。Maven 需要 JDK 才能运行。

2. 安装 Maven: 从官方网站下载 Maven,然后解压到本地计算机。确保将 Maven 的 bin 目录添加到系统环境变量 PATH 中,这样就可以在任何位置通过命令行工具使用 Maven 命令了。

3. 配置 Maven: 通常来说,Maven 的默认配置已经足够使用。但是,可以修改 conf/settings.xml 文件来定制 Maven 的配置,比如配置代理服务器、服务器认证信息等。

4. 创建项目: 使用 Maven 的命令 mvn archetype:generate 来创建一个新的项目,或者也可以将已有的项目转换为 Maven 项目。

5. 理解项目结构: Maven 项目有一个标准的目录结构。主要的 Java 代码位于 src/main/java 下,资源文件位于 src/main/resources,测试代码位于 src/test/java,测试资源位于 src/test/resources

6. 编辑 POM 文件: POM 文件 pom.xml 是 Maven 项目的核心,它包含了项目的配置信息,包括项目依赖、构建配置、插件等。

7. 构建项目: 可以使用 mvn package 来编译项目并打包成 jar 或 war 文件,或者使用 mvn install 将打包的项目安装到本地仓库中,供其他项目依赖使用。

8. 管理依赖: Maven 允许你在 pom.xml 文件中声明项目依赖,Maven 会自动下载和管理这些依赖。

9. 运行测试: 使用 mvn test 命令可以运行项目的单元测试。

10. 清理项目: 使用 mvn clean 命令可以清除项目的 target 目录,该目录用于存放 Maven 编译和打包时产生的所有文件。

11. 其他 Maven 生命周期命令: Maven 有其生命周期的阶段,可以执行不同的生命周期阶段,如 mvn compilemvn verifymvn deploy 等。

这些是使用 Maven 的基本步骤,从安装和配置到项目构建和依赖管理。根据项目需求,可以进一步学习和探索 Maven 提供的高级功能和最佳实践。

其他工具和构建系统

还有其他一些工具和构建系统也被广泛使用,如 Gradle 和 Ant。

Gradle 是另一个流行的 Java 构建工具,它提供了与 Maven 类似的功能,但具有一些额外的优势,如更好的性能、更灵活的构建脚本和更好的多项目支持。Gradle 在近年来也获得了越来越多的关注和使用。

Ant 是一个较老的构建工具,虽然它不如 Maven 和 Gradle 那么流行,但在某些特定的项目和场景中,它仍然是一个可行的选择。

Maven、Gradle和Ant都是中央化的构建工具,因为它们都使用中央化的配置文件(如Maven的pom.xml或Gradle的build.gradle)来定义项目的结构和依赖关系,并通过单一的构建命令来自动化项目的构建过程。这些工具的设计目标都是简化项目的构建、依赖管理和部署。

有一些工具和平台提供了更为分布式或去中心化的构建和部署机制。例如,Jenkins、CircleCI和Travis CI等持续集成/持续部署(CI/CD)工具允许在多个节点或服务器上并行执行构建和测试任务,从而实现分布式构建。这些工具通常与版本控制系统(如Git)集成,可以自动触发构建过程,并在多个环境(如开发、测试和生产环境)中部署应用程序。

另外,一些微服务架构和容器化技术(如Docker和Kubernetes)也提供了更为分布式的部署和管理机制。这些技术允许将应用程序拆分为多个独立的微服务,并在不同的容器中运行这些服务。这种分布式架构可以提高系统的可扩展性、可用性和灵活性。

虽然这些分布式构建和部署机制与传统的中央化构建工具在设计和用法上有所不同,但它们都是为了解决项目管理和构建过程中的不同问题而存在的。选择哪种工具或机制取决于项目的具体需求、团队的偏好以及技术栈的要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1444058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷p4391 无限传输

考察字符串周期的题 题目链接 结论 要求字串 s s s的最短循环字串长就是&#xff1a; a n s n − p m t [ n ] ansn-pmt[n] ansn−pmt[n] 证明如下&#xff1a; 这是最大的前缀和后缀 现在我们做如下操作&#xff1a; 补全字段 a a a和字段 b b b&#xff0c;按子段 a a a的…

阿里(淘天)一面笔试算法原题

阿里撤资 "车来了" 近日&#xff0c;国内实时公交产品"车来了"关联公司武汉元光科技有限公司发生工商变更&#xff0c;阿里巴巴&#xff08;中国&#xff09;网络技术有限公司退出股东行列。 这很好理解&#xff0c;符合近期阿里收缩战线的行为一致性。 毕…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;一个Vue实例从 创建…

【新书推荐】7.4节 寄存器间接和相对寻址方式

本节内容&#xff1a;当指令操作数为内存操作数&#xff0c;且内存操作数的地址使用指针寄存器表示时&#xff0c;称为寄存器间接寻址方式。 ■寄存器间接寻址方式&#xff1a;在地址表达式中&#xff0c;只能使用BX、SI、DI、BP四个指针寄存器用来寻址。 7.4.1 寄存器间接寻…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息维护模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果&#xff0c;视频制作者可能会采用动态水印的方式&#xff0c;让其他人难以盗取视频使用。动态水印的添加&#xff0c;需要应用到运动路径功能。接下来&#xff0c;本文会教大家动态水印怎么加&#xff0c;怎么去除动态水印的相关内容。感兴趣的小…

力扣 第 383 场周赛 解题报告 | KMP

力扣 第 383 场周赛 解题报告 | KMP 链接 前言 一个人能走的多远不在于他在顺境时能走的多快&#xff0c;而在于他在逆境时多久能找到曾经的自己。 T1 修改矩阵 思路&#xff1a;模拟 时间复杂度&#xff1a; O ( m n ) O(mn) O(mn) class Solution:def modifiedMatrix(se…

一招搞定!Windows 右键秒建 Markdown 文件

创建Markdown文件&#xff08;拓展名为.md&#xff09;在Windows 10操作系统中并非内置功能。以下是一篇博客教程&#xff0c;指导用户如何实现在Windows 10中通过右键菜单新建Markdown文件的过程。 如何在Windows 10中通过右键菜单新建Markdown文件 Markdown是一种轻量级标记…

C#,欧拉常数(Euler Constant)的算法与源代码

1 欧拉常数 欧拉常数最先由瑞士数学家莱昂哈德 欧拉 (Leonhard Euler) 在1735年发表的文章《De Progressionibus harmonicus observationes》中定义。欧拉曾经使用γ作为它的符号&#xff0c;并计算出了它的前6位&#xff0c;1761年他又将该值计算到了16位 。 欧拉常数最先由瑞…

Open CASCADE学习|环形弹簧建模

目录 Draw Test Harness&#xff1a; C&#xff1a; 环形弹簧&#xff0c;也称为弓簧&#xff0c;是由拉伸弹簧和连接弹簧构成的。在结构上&#xff0c;环形弹簧通常包括端环、外环和内环&#xff0c;其主要参数包括弹簧的内径、外径和自由高度。环形弹簧的一个显著特点是&am…

MySQL篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、NULL 是什么意思二、主键、外键和索引的区别?三、你可以用什么来确保表格里的字段只接受特定范围里的值?四、说说对 SQL 语句优化有哪些方法?(选择几条)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

ECMAScript Modules规范的示例详解

ECMAScript Modules&#xff08;ESM&#xff09;是JavaScript中用于模块化开发的规范&#xff0c;它允许开发者将代码分割成多个独立的文件&#xff0c;以提高代码的可维护性和可重用性。下面是一个ECMAScript Modules规范的示例详解&#xff1a; 创建模块 1.1 导出变量 在一个…

低代码开发的数字化革新:实业界的成功秘诀与实践之路

在信息时代&#xff0c;实业界正迎来一场变革的风暴&#xff0c;传统的管理系统逐渐不再满足越来越复杂的生产流程和不断增长的市场需求&#xff0c;而低代码开发正如一颗璀璨的明星&#xff0c;将为企业带来前所未有的灵活性和创新力&#xff0c;这并非一场技术的简单变迁&…

React - 分页插件默认是英文怎么办

英文组件的通用解决方案 这里以分页插件为例&#xff1a; 大家可以看到&#xff0c;最后的这个页面跳转提示文字为Go to&#xff0c;不是中文&#xff0c;而官网里面的案例则是&#xff1a; 解决方案&#xff1a; import { ConfigProvider } from antd; import zhCN from an…

Java图形化界面编程——弹球游戏 笔记

Java也可用于开发一些动画。所谓动画&#xff0c;就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像&#xff0c;两次绘制的图像之间差异较小&#xff0c;肉眼看起来就成了所谓的动画 。 ​ 为了实现间隔一定的时间就重新调用组件的 repaint()方法&#xff0c;可以借助于…

Centos7之忘记Root用户密码的处理方式

Centos7之忘记Root用户密码的处理方式 文章目录 Centos7之忘记Root用户密码的处理方式1.场景描述2. 重置密码1. 重启系统进入编辑界面2. 按方向键下键↓&#xff0c;找到设置语言的地方3. 进入bash界面后&#xff0c;可以输入passwd命令重新设置root密码 1.场景描述 长时间未使…

vue中没有hooks

文章目录 一、前言二、啥是 hooks&#xff1f;三、React hooks 是什么&#xff1f;四、vue composition API 与 react hooks 的对比五、总结六、最后 一、前言 经常在网上看到有很多同学说&#xff1a;“在 Vue 中创建 hooks&#xff1f;提升 什么什么什么” 我每次看到这样的…

电商小程序07显示用户个人信息

目录 1 全局变量2 控制登录按钮显示3 设置布局4 搭建我的页面5 修改个人信息总结 在登录章节我们已经实现了用户名和密码登录首页的功能&#xff0c;在登录之后&#xff0c;可以切换到我的页面&#xff0c;显示用户的头像和名称&#xff0c;可以修改个人信息。本篇我们介绍一下…

机器学习系列——(十八)K-means聚类

引言 在众多机器学习技术中&#xff0c;K-means聚类以其简洁高效著称&#xff0c;成为了数据分析师和算法工程师手中的利器。无论是在市场细分、社交网络分析&#xff0c;还是图像处理等领域&#xff0c;K-means都扮演着至关重要的角色。本文旨在深入解析K-means聚类的原理、实…

【计算机网络】Web HTTP

Web和HTTP HTTP 超文本传输协议 HyperText Transfer Protocol HTTP使用TCP作为支撑传输协议 由一个客户程序和一个服务器程序实现一些常见名词。。。无状态协议 stateless protocol 不保存关于客户的任何信息非持续/持续链接 non-persistent con…