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();// 获取SessionFactory
        Session session = sessionFactory.openSession();// 从sessionFactory 获取 Session
        Transaction 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 & sessionFactory
        sessionFactory.close();
    }

    // 二、根据条件删除数据库(删除)
    public static void deleteData(String condition)
    {
		Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件
        SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactory
        Session session = sessionFactory.openSession();// 从sessionFactory 获取 Session
		try
        {
			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 & sessionFactory
            if (sessionFactory != null)
                sessionFactory.close(); 
		}
	}

    // 三、根据条件更新数据库(修改)
    public static void updateData(String condition)
    {
        Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件
        SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactory
        Session session = sessionFactory.openSession();// 从sessionFactory 获取 Session
		try
        {
			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 & sessionFactory
            if (sessionFactory != null)
                sessionFactory.close(); 
		}
	}

    // 四、根据条件查询数据库(查询)
    public static void queryAllData(String condition){
		
        Configuration config = new Configuration().configure();// 创建Configuration对象并加载hibernate.cfg.xml配置文件
        SessionFactory sessionFactory = config.buildSessionFactory();// 获取SessionFactory
        Session session = sessionFactory.openSession();// 从sessionFactory 获取 Session
		try
        {
			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 & sessionFactory
            if (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等脚本语言友好地与数据库交互,不仅是一种乐趣,而且也是除文件资源管理存储外的不二选择,对前端、后端工程师都会受益匪浅,提高效率,欢迎大家共同交流和探讨新技术或者遇到的问题,千千万万的开发者通力合作,一同解决技术问题,答疑解惑助力技术升级,共同营造良好生态,拥抱绿色未来最后希望小伙伴们都能够学有所成学以致用哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学:一文读懂非对称加密算法 DH、RSA

文章目录 前言非对称加密算法的由来非对称加密算法的家谱1.基于因子分解难题2.基于离散对数难题 密钥交换算法-DH密钥交换算法-DH的通信模型初始化DH算法密钥对甲方构建DH算法本地密钥乙方构建DH算法本地密钥DH算法加密消息传递 典型非对称加密算法-RSARSA的通信模型RSA特有的的…

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

用css给宽高不固定的矩形画对角线

.kong{width: 200rpx;height: 76rpx;background: linear-gradient(to bottom right, #E5E5E5 0%, rgba(0, 0, 0, 0.1) calc(50% - 1px),#175CFF 50%, rgba(0, 0, 0, 0.1) calc(50% 1px),rgba(0, 0, 0, 0.1) 100%);}参考&#xff1a; https://blog.csdn.net/weixin_38779534/a…

1.1map

unordered_map和map的使用几乎是一致的&#xff0c;只是头文件和定义不同 #include<iostream> #include<map>//使用map需要的头文件 #include<unordered_map>//使用unordered_map需要的头文件 #include<set>//使用set需要的头文件 #include<uno…

web前端(html)练习

第一题 1. 用户名为文本框&#xff0c;名称为 UserName&#xff0c;长度为 15&#xff0c;最大字符数为 20。 2. 密码为密码框&#xff0c;名称为 UserPass&#xff0c;长度为 15&#xff0c;最大字符数为 20。 3. 性别为两个单选按钮&#xff0c;名称为 sex&#xff0c;值分…

【linux】tcpdump 使用

tcpdump 是一个强大的网络分析工具&#xff0c;可以在 UNIX 和类 UNIX 系统上使用&#xff0c;用于捕获和分析网络流量。它允许用户截取和显示发送或接收过网络的 TCP/IP 和其他数据包。 一、安装 tcpdump 通常是默认安装在大多数 Linux 发行版中的。如果未安装&#xff0c;可…

使用lwip的perf进行测速TCP会有较多的duplicate ack的原因分析

在使用lwIP的perf工具进行TCP测速时&#xff0c;出现较多的重复确认&#xff08;duplicate ACK&#xff09;可能是由于以下原因导致的&#xff1a; 丢包或乱序&#xff1a;重复确认通常是由于网络中的数据包丢失或乱序到达引起的。当接收方收到一个乱序的数据包时&#xff0c;它…

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…

系列十三、查询数据库中某个库、表、索引等所占空间的大小

一、information_schema数据库 1.1、概述 information_schema数据库是MySQL出厂默认带的一个数据库&#xff0c;不管我们是在Linux中安装MySQL还是在Windows中安装MySQL&#xff0c;安装好后都会有一个数据库information_schema&#xff0c;这个库中存放了其他库的所有信息。 …

【UE Niagara学习笔记】02 - 制作燃烧的火焰

目录 效果 步骤 一、添加资产 二、制作材质 三、制作粒子 3.1 循环播放 3.2 粒子生成的数量 3.3 粒子的生命周期和初始大小 3.4 火焰高度 3.5 火焰范围 3.6 火焰颜色 效果 步骤 一、添加资产 1. 在虚幻商城中搜索“M5 VFX Vol2. Fire and Flames(Niagara)”…

网络协议与攻击模拟_01winshark工具简介

一、TCP/IP协议簇 网络接口层&#xff08;没有特定的协议&#xff09; 物理层&#xff1a;PPPOE宽带拨号&#xff08;应用场景&#xff1a;宽带拨号&#xff0c;运营商切网过来没有固定IP就需要拨号&#xff0c;家庭带宽一般都采用的是拨号方式&#xff09;数据链路层网络层…

kettle的基本介绍和使用

1、 kettle概述 1.1 什么是kettle Kettle是一款开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。 1.2 Kettle核心知识点 1.2.1 Kettle工程存储方式 以XML形式存储以资源库方式存储…

【React源码 - Fiber架构之Reconciler】

前言 React16架构可以分为三层也是最核心的三个功能分别是&#xff1a; Scheduler&#xff08;调度器&#xff09;—调度任务的优先级&#xff0c;高优任务优先进入Reconciler(16新增)Reconciler&#xff08;协调器&#xff09;—负责找出变化的组件Renderer&#xff08;渲染…

Android readelf 工具查找函数符号

ELF&#xff08;Executable and Linkable Format&#xff09;是一种执行文件和可链接文件的格式。它是一种通用的二进制文件格式&#xff0c;用于在各种操作系统中存储可执行程序、共享库和内核模块。 Android 开发当中的 so 库本质上就是一种特殊类型的 ELF 文件&#xff0c;…

crash分析ramdump

我们需要在PC机上运行crash,从源码来编译, 可以从Redhat社区下载源码。 解压后&#xff0c;进入目录后使用一下命令&#xff1a; make targetarm64 make install这样就安装好了crash了。 crash介绍 crash主要是用来离线分析linux内核内存转存文件&#xff0c;它整合了gdb…

计算机基础面试题 |17.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

e2studio开发三轴加速度计LIS2DW12.1--轮询获取加速度数据 概述视频教学样品申请源码下载通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpRequest模块 解析http请求协议

一、HTTP响应报文格式 HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0xf3c9743300024ee4 Cache-Control: private Connection: keep-alive Content-Encoding: gzip Content-Type: text/html;charsetutf-8 Date: Fri, 26 Feb 2021 08:44:35 GMT Expires: Fri, 26 Feb 2021 08:44:35 GM…

系列三十五、获取Excel中的总记录数

一、获取Excel中的总记录数 1.1、概述 使用EasyExcel开发进行文件上传时&#xff0c;通常会碰到一个问题&#xff0c;那就是Excel中的记录数太多&#xff0c;使用传统的方案进行文件上传&#xff0c;很容易就超时了&#xff0c;这时可以通过对用户上传的Excel中的数量进行限制…