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

Hibernate实战之操作MySQL数据库(2024-1-8)

Hibernate实战之操作MySQL数据库 2024.1.8

  • 前提环境(Java+MySQL+Navicat+VS Code)
  • 1、Hibernate简介
    • 1.1 了解HQL
  • 2、MySQL数据库建表
    • 2.1 编写SQL脚本
    • 2.2 MySQL执行脚本
  • 3、Java操作MySQL实例(Hibernate)
    • 3.1 准备依赖的第三方jar包
    • 3.2 了解MySQL数据库连接配置信息并配置XML文件
      • 3.2.1 新建 hibernate.cfg.xml 文件
      • 3.2.2 新建 Row.hbm.xml 文件
    • 3.3 编写Java类实现数据库操作(Row+App)
      • 3.3.1 Row.java
      • 3.3.2 App.java(含main函数)
    • 3.4 测试执行并利用Navicat查看数据库结果
      • 3.4.1 新增
      • 3.4.2 修改
      • 3.4.3 查询
      • 3.4.4 删除
  • 4、小结

前提环境(Java+MySQL+Navicat+VS Code)

Java 1.8
Visual Studio Code
Navicat Premium
MySQL 8.0.20(Company Edition)

1、Hibernate简介

        Hibernate是一个以LGPL(Lesser GNU Public License)许可证形式发布的开源项目,它可以直接提供相关支持,底层驱动可以随意切换数据库,快速简洁。使业务层与具体数据库分开,只针对Hibernate 进行开发,完成数据和对象的持久化。如果大家感兴趣想要深入了解,建议参考其官方文档和引导示例学习,如QuickStart和中文文档。

Hibernate英文官网
Hibernate-Github官网
Hibernate-中文网
Hibernate-W3CSchool

1.1 了解HQL

        HQLHibernate Query Language的缩写,它可以提供更加丰富灵活、更为强大的查询能力,HQL更接近SQL语句查询语法,对动态查询参数绑定提供了丰富的支持,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。尤其在实体查询、更新、删除方面,一些常见的用法示例如下:

from User user where user age=20;from User user where user age between 20 and 30;from User user where user age in(20,30);from User user where user name is null;from User user where user name like '%zx%';from User user where (user age%2)=1;from User user where user age=20 and user name like '%zx%';

        此外,具体的语法学习可参考社区文档。

2、MySQL数据库建表

        为了便于后续使用Java代码操作MySQL数据库,首先需要设计数据表结构,对表中的字段数量、类型、长度、别名、英文名均进行设置,编写好SQL脚本并在数据库中执行,之后在NavicatMySQL Workbench中进行查看。

2.1 编写SQL脚本

字段名字段类型字段别名
id文本唯一标识
name文本名称
date日期日期
income小数收入
test数据表字段设计

        针对上述表格中的create_Test.sql脚本文件内容如下:

CREATE database if NOT EXISTS `my_db` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `my_db`;
SET NAMES utf8mb4;CREATE TABLE if NOT EXISTS `test` (`id` CHAR(50) NOT NULL,`name` VARCHAR(50),`date` timestamp(6),`income`  float4,PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.2 MySQL执行脚本

        第一步,打开MySQL WorkbenchNavicat,新建MySQL数据库连接,输入正确的用户名密码后测试连接,连接成功后可以看到其中的数据库;
        第二步,点击菜单中的新建查询,然后在编辑框中复制SQL语句,当然也可以打开现有的SQL文件,之后点击执行按钮即可查看到数据库和数据表已成功创建。

MySQL Workbench创建数据库和数据表
MySQL Workbench中查看数据表
Navicat Premium中查看数据表

3、Java操作MySQL实例(Hibernate)

        下面具体以一个完整的Java项目为例,来介绍如何利用HibernateMySQL进行增删改查等操作。整个过程可能有些繁琐,但都较为基本,按部就班操作即可,具体分为:(1)准备三方依赖jar包;(2)了解MySQL数据库连接配置信息;(3)配置XML文件设置jdbc数据库连接MySQL;(4)编写Java类实现数据库操作;(5)测试执行查看效果。

3.1 准备依赖的第三方jar包

        Java项目代码所依赖的三方jar包名称如下,具体可以从Maven官方仓库下载。(注:如果使用Maven,也可在pom文件中引入)

antlr-2.7.7.jar
byte-buddy-1.11.22.jar
classmate-1.5.1.jar
dom4j-2.1.1.jar
hibernate-commons-annotations-5.0.4.Final.jar
hibernate-core-5.3.14.Final.jar
javax.persistence-api-2.2.jar
jboss-logging-3.3.3.Final.jar
jta-1.1.jar
mysql-connector-java-8.0.18.jar
Maven仓库官网(可下载jar包)
Java工程利用Hibernate操作MySQL所依赖的三方jar包

3.2 了解MySQL数据库连接配置信息并配置XML文件

数据库名称ip地址端口用户名密码
my_dblocalhost3306root123456
MySQL数据库连接配置信息

3.2.1 新建 hibernate.cfg.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!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="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 链接数据库url --><property name="connection.url">jdbc:mysql://localhost:3306/my_db?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8</property><!-- 连接数据库的用户名 --><property name="connection.username">root</property><!-- 数据库的密码 --><property name="connection.password">123456</property><!-- 数据库驱动 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 显示sql语句 --><property name="show_sql">true</property><!-- 格式化sql语句 --><property name="format_sql">true</property><!-- 映射文件配置 --><mapping resource="com/Row.hbm.xml" /></session-factory>
</hibernate-configuration>

3.2.2 新建 Row.hbm.xml 文件

        项目src下的Row.hbm.xml文件是对hibernate对数据库my_dbtest表做的映射配置,同时应注意与对应的数据表类放在同一目录package包)下,因此在编写HQL字符串语句时,需要从Row中查询而非test,实际执行时会从Row映射到test数据表哦!!!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.Row" table="test"><id name="id" column="id"><!-- <generator class="org.hibernate.id.UUIDGenerator"/> --><generator class="uuid"/></id><property name="name" column="name"/><property name="date" column="date"/><property name="income" column="income"/></class>
</hibernate-mapping>

3.3 编写Java类实现数据库操作(Row+App)

        编写Row.java类作为对test数据表中每行记录的抽象,编写App类调用main函数连接数据库执行相应的操作实例。

3.3.1 Row.java

package com;import java.util.Date;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;@Entity
@Table
public class Row {//设置主键@Id //配置uuid,原本jpa是不支持uuid的,但借用hibernate的方法能够实现。@GeneratedValue(generator = "idGenerator")@GenericGenerator(name = "idGenerator", strategy = "org.hibernate.id.UUIDGenerator") // uuid@Column(name = "id", unique = true, nullable = false, length = 32)private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}private Date date;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}private Float income;public Float getIncome() {return income;}public void setIncome(Float income) {this.income = income;}}

3.3.2 App.java(含main函数)

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
// import org.hibernate.id.UUIDHexGenerator;
import java.util.List;
import java.util.Date;import com.Row;public class App {// 一、插入数据(新增)public static void insertData(String name, int count){Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactorySession session = sessionFactory.openSession();// 从sessionFactory 获取 SessionTransaction transaction = session.beginTransaction();// 事务开启for(int i=0;i<count;i++){Row row = new Row(); //uuid已经自动生成,无须手动添加row.setName(name);Date date = new Date();row.setDate(date);Float income = new Float((i+1) * count + 0.5);row.setIncome(income);Object res = session.save(row); // 将对象(Row)保存到表test中System.out.println("id:" + res);}transaction.commit(); // 事务提交session.close(); // 关闭session & sessionFactorysessionFactory.close();}// 二、根据条件删除数据库(删除)public static void deleteData(String condition){Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactorySession session = sessionFactory.openSession();// 从sessionFactory 获取 Sessiontry{Transaction transaction = session.beginTransaction();String hql = "delete from Row where " + condition;int rowsAffected = session.createQuery(hql).executeUpdate();			System.out.println(rowsAffected + " rows affected.");transaction.commit();}catch(Exception e){System.out.println("出错: " + e.getMessage());e.printStackTrace();}finally{if (session != null)session.close(); // 关闭session & sessionFactoryif (sessionFactory != null)sessionFactory.close(); }}// 三、根据条件更新数据库(修改)public static void updateData(String condition){Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactorySession session = sessionFactory.openSession();// 从sessionFactory 获取 Sessiontry{Transaction transaction = session.beginTransaction();String hql = "update Row " + condition;int rowsAffected = session.createQuery(hql).executeUpdate();System.out.print(rowsAffected + " rows affected.");transaction.commit();}catch(Exception e){System.out.println("出错: " + e.getMessage());e.printStackTrace();}finally{if (session != null)session.close(); // 关闭session & sessionFactoryif (sessionFactory != null)sessionFactory.close(); }}// 四、根据条件查询数据库(查询)public static void queryAllData(String condition){Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactorySession session = sessionFactory.openSession();// 从sessionFactory 获取 Sessiontry{String hql = "from Row where " + condition;List<Row> results = session.createQuery(hql).list();if(results.size() == 0){System.out.println("找不到记录!");}else{for(Row row: results){System.out.println("编号:" + row.getId() + ", 名称:" + row.getName() + ", 日期:" + row.getDate() + ", 收入:" + row.getIncome());}}}catch(Exception e){System.out.println("出错: " + e.getMessage());e.printStackTrace();}finally{if (session != null)session.close(); // 关闭session & sessionFactoryif (sessionFactory != null)sessionFactory.close(); }}public static void main(String[] args) throws Exception {insertData("张三", 10);// queryAllData("1=1"); // "1=1" "id = '4028896c8cdd6d55018cdd6d56420002'"// updateData("set name = '12233330000' WHERE 1=1");// deleteData("1=1"); //  name = 'jing_zhong'}
}
整个Java项目文件结构

3.4 测试执行并利用Navicat查看数据库结果

        分别对常用的四种增删改查操作来进行测试执行,VSCode控制台和Navicat数据库结果分别如下图所示。

3.4.1 新增

3.4.2 修改

3.4.3 查询

3.4.4 删除

4、小结

        MySQL数据库作为极其受欢迎的一种关系型数据库,一直以来以其简单快速的优点受到广大开发者/工程师的一致好评,尽管市面上流行着各种各样的数据库,无论是开源或是商用型数据库,从设计理念查询执行速度和效率上或多或少会有不同,当然软件、数据库、连接驱动版本也都在随之更新、迭代和升级

        在平常的学习和工作中,熟练地运用数据库,学会利用SQLHQL等脚本语言友好地与数据库交互,不仅是一种乐趣,而且也是除文件资源管理存储外的不二选择,对前端、后端工程师都会受益匪浅,提高效率,欢迎大家共同交流和探讨新技术或者遇到的问题,千千万万的开发者通力合作,一同解决技术问题,答疑解惑助力技术升级,共同营造良好生态,拥抱绿色未来最后希望小伙伴们都能够学有所成学以致用哦!

相关文章:

Hibernate实战之操作MySQL数据库(2024-1-8)

Hibernate实战之操作MySQL数据库 2024.1.8 前提环境&#xff08;JavaMySQLNavicatVS Code&#xff09;1、Hibernate简介1.1 了解HQL 2、MySQL数据库建表2.1 编写SQL脚本2.2 MySQL执行脚本 3、Java操作MySQL实例&#xff08;Hibernate&#xff09;3.1 准备依赖的第三方jar包3.2 …...

【Spring Boot 3】【数据源】自定义JDBC多数据源

【Spring Boot 3】【数据源】自定义JDBC多数据源 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术…...

番茄工作法

番茄工作法是一种时间管理方法&#xff0c;主要适用于专注工作。它的基本步骤包括&#xff1a; 设定一个25分钟的闹钟。默念三二一&#xff08;321法则&#xff09;&#xff0c;开始全身心投入工作。用专注的状态高效工作25分钟&#xff0c;不允许走神。如果做到了步骤3&#…...

【uniapp】调用阿里云OCR图片识别文字:

文章目录 一、效果&#xff1a;二、实现&#xff1a; 一、效果&#xff1a; 二、实现&#xff1a; 【阿里官方】高精版OCR文字识别【最新版】-云市场-阿里云 <template><view class"container"><!-- 选择图片 --><button click"imageO…...

软考高级选择考哪个好?

&#x1f4d2;软考高级总共5个科目&#xff0c;同样是高级证书&#xff0c;认可度也有区别! 大家一般在「信息系统项目管理师」✔️和「系统架构设计师」✔️二选一 1️⃣信息系统项目管理师 ❤️信息系统项目管理师也叫「高项」&#xff0c;考试内容主要是「项目管理」相关&am…...

在云服务器ECS上用Python写一个搜索引擎

在云服务器ECS上用Python写一个搜索引擎 一、场景介绍二、搜索引擎的组成2.1 网页的爬取及排序2.2 用户使用搜索引擎进行搜索 三、操作步骤3.1 环境准备3.2 安装Anaconda3.3 安装Streamlit3.4 下载搜索引擎代码3.5 运行搜索引擎 四、常见问题4.1 运行setup.py时可能的问题4.2 如…...

Python在智能手机芯片研发

Python在智能手机芯片研发中扮演着重要的角色。以下是几个方面的重要性&#xff1a; 快速原型设计&#xff1a;Python具有简洁易读的语法和丰富的第三方库&#xff0c;使工程师能够快速构建原型和进行快速迭代。这对于芯片研发来说&#xff0c;可以加快开发速度&#xff0c;减少…...

K8S学习指南(70)-K8S中的informa机制

引言 在 Kubernetes 集群中&#xff0c;Informer 是一种重要的机制&#xff0c;用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的&#xff0c;允许开发者注册对某类资源对象的关注&#xff0c;并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Info…...

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展&#xff0c;即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问&#xff1a; 大家好&#xff0c;请问有没有SD卡芯片&#xff0c;可以…...

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…...

Java10:内部类

7 内部类&#xff08;了解&#xff09;7.1 成员内部类7.2 静态内部类7.3 局部内部类7.4 匿名内部类 2.3. 静态内部类2.4. Lambda表达式&#xff0c; 7 内部类&#xff08;了解&#xff09; 内部类&#xff1a;就是在一个类的内部再定义一个类。 分类&#xff1a; 成员内部类 静…...

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型&#xff0c;以下是 PostgreSQL 13 版本中支持的所有字段类型&#xff1a; 数值类型&#xff1a; smallint&#xff1a;小整数类型。integer&#xff1a;整数类型。bigint&#xff1a;大整数类型。decimal&#xff1a;精确小数类型。numeric&#x…...

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高&#xff0c;与现在的项目不符合 这是降低node版本的命令&#xff0c;然后重新运行 npm install npm8.1.2 -g...

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…...

python插入排序

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常使用in-place排序&#xff0…...

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格&#xff1f; 1、方便管理&#xff1a;将营业执照转为excel格式&#xff0c;可以方便地进行管理和整理&#xff0c;快速查找需要的信息。 2、数据处理&#xff1a;Excel可以提供丰富的计算和数据分析功能&#xff0c;转化为excel后方便数据…...

关于java数组Arrays类

关于java数组Arrays类 前面的文章中&#xff0c;我们了解了数组创建方法等&#xff0c;我们本篇文章来了解一下数组的方法类Arrays&#xff0c;有了这个类&#xff0c;我们在日常写代码的时候就不不用自己去手动创建方法了&#x1f600;。 Arrays类 数组的工具类java.util.A…...

LeetCode-58/709

1.最后一个单词的长度&#xff08;58&#xff09; 题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…...

linux 流量监控

linux 流量监控 Linux 网络流量监控利器 iftop命令详解及实战 https://blog.csdn.net/qq_50247813/article/details/134164093 iftop命令详解 https://www.cnblogs.com/gaoyuechen/p/17300017.html 1 ubuntu如何查看流量监控 Ubuntu是一种非常流行的Linux发行版&#xff0c…...

AUTOSAR从入门到精通-漫谈autosar软件架构(八)

目录 前言 原理 AUTOSAR的方法论 AUTOSAR架构的优点 AUTOSAR 软件架构 1.应用层...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...