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

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

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

相关文章

UI自动化测试工具对企业具有重要意义

随着软件行业的不断发展&#xff0c;企业对高质量、高效率的软件交付有着越来越高的要求。在这个背景下&#xff0c;UI自动化测试工具成为了企业不可或缺的一部分。以下是UI自动化测试工具对企业的重要作用&#xff1a; 1. 提高软件质量 UI自动化测试工具能够模拟用户的操作&am…

FlinkAPI开发之自定义函数UDF

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数&#xff08;user-defined function&#xff0c;UDF&#xff09;&#xff0c;即用户可以根据…

【PaperReading】4. TAP

Category Content 论文题目 Tokenize Anything via Prompting 作者 Ting Pan, Lulu Tang, Xinlong Wang, Shiguang Shan (Beijing Academy of Artificial Intelligence) 发表年份 2023 摘要 提出了一个统一的可提示模型&#xff0c;能够同时对任何事物进行分割、识别和…

【野火i.MX6ULL开发板】利用microUSB线烧入Debian镜像

0、前言 烧入Debian镜像有两种方式&#xff1a;SD卡、USB SD卡&#xff1a;需要SD卡&#xff08;不是所有型号都可以&#xff0c;建议去了解了解&#xff09;、SD卡读卡器 USB&#xff1a;需要microUSB线 由于SD卡的网上资料很多了&#xff0c;又因为所需硬件&#xff08;SD卡…

【提示学习论文六】MaPLe: Multi-modal Prompt Learning论文原理

文章目录 MaPLe: Multi-modal Prompt Learning 多模式提示学习文章介绍动机MaPLe:Multi-modal Prompt Learning 模型结构1、Deep Language Prompting 深度语言提示2、Deep Vision Prompting 深度视觉提示3、Vision Language Prompt Coupling 视觉语言提示耦合提示耦合过程 实验…

Proteus仿真stm32f103r6输出PWM/正弦波

资料下载地址&#xff1a;Proteus仿真stm32f103r6输出PWM/正弦波 一、仿真图 Proteus仿真stm32f103r6输出PWM/正弦波 二、程序 #include "pbdata.h"u16 fre; void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration();void Dela…

SQL-分组查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

12、JVM高频面试题

1、JVM的主要组成部分有哪些 JVM主要分为下面几部分 类加载器&#xff1a;负责将字节码文件加载到内存中 运行时数据区&#xff1a;用于保存java程序运行过程中需要用到的数据和相关信息 执行引擎&#xff1a;字节码文件并不能直接交给底层操作系统去执行&#xff0c;因此需要…

基于JavaWeb+BS架构+SpringBoot+Vue基于hive旅游数据的分析与应用系统的设计和实现

基于JavaWebBS架构SpringBootVue基于hive旅游数据的分析与应用系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 概 述 5 1.1 研究背景 5 1.2 研究意义 5 1.3 研究内容…

计算机毕业设计 基于SpringBoot的物资综合管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Vue3项目引入canvaskit-wasm库(skia库的wasm版)

1 安装canvaskit-wasm npm install canvaskit-wasm 或者 yarn add canvaskit-wasm 2 将文件node_modules/canvaskit-wasm/bin/canvaskit.wasm复制到public目录 3 引入到组件中 <template><img :src"imgData"/> </template><script setup>…

MongoDB索引详解

概述 索引是一种用来快速查询数据的数据结构。BTree 就是一种常用的数据库索引数据结构&#xff0c;MongoDB 采用 BTree 做索引&#xff0c;索引创建 colletions 上。MongoDB 不使用索引的查询&#xff0c;先扫描所有的文档&#xff0c;再匹配符合条件的文档。使用索引的查询&…

【漏洞复现】天融信TOPSEC static_convert 远程命令执行

漏洞描述 天融信TOPSEC Static_Convert存在严重的远程命令执行漏洞。攻击者通过发送精心构造的恶意请求,利用了该漏洞,成功实现在目标系统上执行任意系统命令的攻击。成功利用漏洞的攻击者可在目标系统上执行恶意操作,可能导致数据泄露、系统瘫痪或远程控制。强烈建议立即更…

单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

目录 工作原理 在电机控制中的应用 脉宽调制&#xff08;PWM&#xff09;是一种在单片机中常用的控制技术&#xff0c;它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号&#xff0c;用于控制电机速度、亮度、电压等。 工作原理 …

3D模型UV展开原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

力扣日记1.11-【二叉树篇】450. 删除二叉搜索树中的节点

力扣日记&#xff1a;【二叉树篇】450. 删除二叉搜索树中的节点 日期&#xff1a;2024.1.11 参考&#xff1a;代码随想录、力扣 450. 删除二叉搜索树中的节点 题目描述 难度&#xff1a;中等 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key…

多测师肖sir___ui自动化测试po框架讲解版

po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写 &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一个配置class&#xff0c; 配置class就用来维护页面元素或操作方法 &#xff08;3&am…

XTuner 大模型单卡低成本微调实战

XTuner 大模型单卡低成本微调实战 Finetune简介增量预训练微调指令跟随微调LoRA XTuner介绍功能亮点 8GB显存玩转LLMFlash AttentionDeepSpeed ZeRO 上手操作平台激活环境微调 参考教程&#xff1a;XTuner Finetune简介 LLM的下游应用任务中&#xff0c;增量预训练和指令跟随…

【python】python新年烟花代码【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 新年的钟声即将敲响&#xff0c;为了庆祝这个喜庆的时刻&#xff0c;我们可以用 Python 编写一个炫彩夺目的烟花盛典。本文将详细介绍如何使用 Pygame 库创建一个令人惊叹的烟花效果。 一、效果图&#xff1a; 二…

互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…