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.mzph.cn/news/615478.shtml

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

相关文章

与听力学相关的职业都有哪些?怎么选择?

随着年龄的增长&#xff0c;每个人都可能面临听觉障碍的困惑。听力学领域专注于患者的耳朵问题&#xff0c;包括听力损失和平衡障碍。听力学职业是为患者提供听觉健康管理服务的职业&#xff0c;专注于他们耳朵的听力和平衡甚至言语相关需求。为患者进行听功能检查、测试、诊疗…

代码随想录算法训练营Day17|110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和

文章目录 一、110.平衡二叉树1.递归法 二、257. 二叉树的所有路径1. 递归法 三、 404.左叶子之和1.迭代法 一、110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二…

C++ Primer 6.2参数传递 知识点+练习题

C Primer 6.2参数传递 知识点练习题 指针形参使用引用拷贝Const 形参实参尽量使用常量引用数组形参数组引用形参传递多维数组向main函数传参数含有可变形参的函数练习题待更新 指针形参 void reset(int *p) {*p0;//p指向的整型对象变为0p0;//只是对形参改变p&#xff0c;使其为…

【Git】查看凭据管理器的账号信息,并删除账号,解决首次认证登录失败后无法重新登录的问题

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《代码管理工具》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

Windows 项目从0到1的部署

目录 一. 安装jdk 1.1 安装jdk 1.2 配置jdk的环境配置jdk 1.3 配置成功 二. 配置tomcat 2.1 启动tomcat 2.2 防火墙设置 三. 安装MySQL 3.1 安装步骤 3.2 内部连接 3.3 外部连接 四. 部署项目 4.1 项目部署 4.2 修改mysql的用户密码 一. 安装jdk 这里给大家准备好了jdk和…

2024.1.8 Day04_SparkCore_homeWork

目录 1. 简述Spark持久化中缓存和checkpoint检查点的区别 2 . 如何使用缓存和检查点? 3 . 代码题 浏览器Nginx案例 先进行数据清洗,做后续需求用 1、需求一&#xff1a;点击最多的前10个网站域名 2、需求二&#xff1a;用户最喜欢点击的页面排序TOP10 3、需求三&#x…

一卡通水控电控开发踩过的坑

最近在做一个项目&#xff0c;是对接一卡通设备的。我一开始只拿到设备和3个文档开局。不知道从哪下手。一步一步踩坑过来。踩了很多没有必要的坑&#xff0c;写出来给有用的人吧。 读卡器怎么用&#xff1f; 有个读卡器&#xff0c;一开始什么软件也不提供。我都不知道是干嘛…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook&#xff0c;并且也安装用了一段时间&#xff0c;后来不知道什么原因没有用了。估计是那时候写代码的时候多一些&#xff0c;因为它可以直接写代码并运行结果&#xff0c;现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

《YOLO算法:基础+进阶+改进》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLO算法&#xff1a;基础进阶改进》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇…

SpringBoot集成Camunda

一&#xff1a;SpringBoot集成 1.1&#xff1a;pom.xml 因camunda集成SpringBoot对SpringBoot的版本和JDK的版本都有一定的要求&#xff0c;所以这里贴个完整的依赖。可以去官网找每个SpringBoot的版本对应的camunda版本。 <?xml version"1.0" encoding"…

前端入门教程:学完即可单独完成前端项目

目录 目录 1.HTML: 1.1概念 1.2结构 1.3常见的标签使用分类&#xff1a; 2.CSS: 2.1概念 2.2样式实践&#xff1a; 以下的举例都来自于博客&#xff1a; 2.3css选择器&#xff1a; 什么是css选择器&#xff1a; 举例如下&#xff1a; 2.4Demo 3.JavaScript&#…

算法34:贴纸拼词(力扣691题)

题目&#xff1a; 我们有 n 种不同的贴纸。每个贴纸上都有一个小写的英文单词。 您想要拼写出给定的字符串 target &#xff0c;方法是从收集的贴纸中切割单个字母并重新排列它们。如果你愿意&#xff0c;你可以多次使用每个贴纸&#xff0c;每个贴纸的数量是无限的。 返回你…

vivado IP Revision Control

2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html

每日一题:LeetCode-LCR 007. 三数之和

每日一题系列&#xff08;day 18&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

linux高级篇基础理论十一(GlusterFS)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

VS中动态库的创建和调用

VS中动态库的创建和调用 库 ​ 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。 ​ 库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。所谓静态…

一键操作完整的部署项目流程

目录 一、常见的搭配 二、完整的部署项目流程具体步骤 2.1、安装jdk 安装jdk &#xff1a; 配置环境&#xff1a; 检查是否成功&#xff1a; 2.2、配置tomcat外部访问 下载解压软件 安装tomcat 测试tomcat安装是否成功 2.3、安装MySQL 安装vcc环境 命令输入步骤 安…

应用在热能表领域中的数字温度传感芯片

热能表&#xff0c;是适用于测量在热交换环路中&#xff0c;被称作载热液体的液体所吸收或转换热能的仪器&#xff0c;它由流量传感器、温度传感器和热能积算仪三部分组成。热量表&#xff08;热表&#xff09;又称热能表、热能积算仪&#xff0c;既能测量供热系统的供热量又能…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息&#xff0c;与bridge相比&#xff0c;融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…