hibernate入门项目(一)

news/2024/5/11 0:20:59

本节我们将演示如何搭建一个 Hibernate 工程。

搭建 Hibernate 工程需要以下 7 步:

下载 Hibernate 开发包
新建工程
创建数据库表
创建实体类
创建映射文件
创建 Hibernate 核心配置文件
测试

1. 下载 Hibernate 开发包

浏览器访问 Hibernate 官网 下载 Hibernate(以 hibernate-release-5.5.3.Final 为例)开发包。

目录介绍

下载完成后,解压 hibernate-release-5.5.3.Final.zip,可得到以下目录结构。
Hibernate 文件夹中,包含以下 3 个目录:
documentation:Hibernate 的开发文档;
lib:Hibernate 相关的依赖;
project:Hibernate 官方给出的示例工程。

在 lib 目录下有一个 required 文件夹,其中包含了 Hibernate 5 必须依赖的 jar 包,如下图。
在这里插入图片描述

2. 新建工程

1. 以 IntelliJ IDEA 为例,新建一个名为 hibernate-demo 的 Java 工程

在这里插入图片描述

在这里插入图片描述
换成自己本机maven
在这里插入图片描述

2 分别在main和test中创建ressources包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2 依赖文件pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hibernate</groupId><artifactId>hibernate-demo2</artifactId><version>1.0-SNAPSHOT</version><name>hibernate-demo2</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--hibernate依赖--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.3.7.Final</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency></dependencies><build><!--读取配置文件--><resources><resource><directory>src/main/resources</directory></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>
</project>

3. 创建数据库表

执行以下 SQL 语句,在 bianchengbang_jdbc 数据库中创建 user 表,并向该表中添加测试数据。

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`user_name` varchar(255) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT INTO `user` VALUES ('1', '001', 'admin', 'admin', '12345678@qq.com');
INSERT INTO `user` VALUES ('2', '002', 'user', '123456', '98765432@qq.com');

4. 创建实体类

在 hibernate-demo 工程的 net.biancheng.www.po 包下,创建一个与 user 表对应的实体类 User,代码如下。

package net.biancheng.www.po;public class User {private int id;private String userId;private String userName;private String password;private String email;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "net.biancheng.www.po.User{" +"id=" + id +", userId='" + userId + '\'' +", userName='" + userName + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}

5. 创建映射文件

单单一个实体类 User 是不具备持久化操作的能力的,为了使该类具备这种能力,就需要将 User 实体类映射到数据库的某一张表中,并将实体类中的属性与数据表的字段相对应,这些都需要在映射文件中配置。

Hibernate 的映射文件的命名规则如下:

[实体类名].hbm.xml
例如,实体类 User 的映射文件就可以命名为 User.hbm.xml。

在 net.biancheng.www.mapping 包下,创建 User 的映射文件 User.hbm.xml,配置如下。

<?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><!-- name:类的全路径:--><!-- table:表的名称:(可以省略的.使用类的名称作为表名.)--><class name="net.biancheng.www.po.User" table="user" schema="bianchengbang_jdbc"><!-- 主键--><id name="id" column="id"><!--主键生成策略--><generator class="native"></generator></id><!--type:三种写法--><!--Java类型 :java.lang.String--><!--Hibernate类型:string--><!--SQL类型 :不能直接使用type属性,需要子标签<column>--><!--<column name="name" sql-type="varchar(20)"/>--><property name="userId" column="user_id" type="java.lang.String"/><property name="userName" column="user_name"/><property name="password" column="password"/><property name="email" column="email"/></class>
</hibernate-mapping>

6. 创建 Hibernate 核心配置文件

Hibernate 框架是对 JDBC 的封装,也需要对 JDBC 连接数据库所需的 url、driver、username 和 password 等 4 个基本参数进行配置,Hibernate 一般是通过配置文件 hibernate.cfg.xml 来指定的,该文件被称为 Hibernate 的核心配置文件。

在 Hibernate 工程的 src 目录下,新建一个 hibernate.cfg.xml 文件,配置如下。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><!--使用 Hibernate 自带的连接池配置--><property name="connection.url">jdbc:mysql://localhost:3306/bianchengbang_jdbc</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!--hibernate 方言--><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!--打印sql语句--><property name="hibernate.show_sql">true</property><!--格式化sql--><property name="hibernate.format_sql">true</property><!-- 加载映射文件 --><mapping resource="net/biancheng/www/mapping/User.hbm.xml"/></session-factory>
</hibernate-configuration>

7. 测试

在 net.biancheng.www.test 包下,创建一个名为 AppTest 的测试类,并在该测试类中创建一个测试方法 testQuery(),使用 Hibernate 实现对数据库的查询,代码如下。

package com.hibernate;import com.hibernate.entity.User;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.Test;/*** Unit test for simple App.*/
public class AppTest {@Testpublic void testInit() {StandardServiceRegistry registry = null;SessionFactory sessionFactory = null;Session session = null;Transaction transaction = null;try {//初始化注册服务对象registry = new StandardServiceRegistryBuilder().configure()//默认加载hibernate.cfg.xml,如果配置文件名称被修改:configure("被修改的名字").build();//获取Session工厂sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();//从工厂创建Session连接session = sessionFactory.openSession();//开启事务transaction = session.beginTransaction();//创建事例User user = new User();user.setUserName("zhang");user.setPassword("123");session.save(user);//提交事务transaction.commit();} catch (HibernateException e) {e.printStackTrace();//回滚事务transaction.rollback();} finally {if(session!=null && session.isOpen())//关闭sessionsession.close();}}
}

8 Hibernate连接封装成工具类

package com.hibernate.util;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;/*** @author ZCL* @Description* @date 2023/5/18 18:12*/public class HibernateUtil {//使用ThreadLocal模式初始化Sessionprivate static ThreadLocal<Session> threadLocal = new ThreadLocal<>();private static StandardServiceRegistry registry;private static SessionFactory sessionFactory;//静态模块初始化Session工厂static{//初始化注册服务对象registry = new StandardServiceRegistryBuilder().configure()//默认加载hibernate.cfg.xml,如果配置文件名称被修改:configure("被修改的名字").build();//获取Session工厂sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();}//获取Session的方式public static Session getSession(){//从线程中获取sessionSession session= threadLocal.get();//判断session是否存在if(null==session || !session.isOpen()){//不存在从工厂中获取session//判断工厂是否存在,不存在重新加载if(null==sessionFactory)buildSessionFactory();//从工厂获取sessionsession=(null!=sessionFactory)? sessionFactory.openSession() : null;//放入线程threadLocal.set(session);}return session;}//加载session工厂private  static void  buildSessionFactory(){//初始化注册服务对象registry = new StandardServiceRegistryBuilder().configure()//默认加载hibernate.cfg.xml,如果配置文件名称被修改:configure("被修改的名字").build();//获取Session工厂sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();}//关闭sessionpublic static void closeSession(Session session){if(null != session && session.isOpen())session.close();}
}

http://wed.xjx100/news/198277.html

相关文章

面试官:前端如果 100 个请求,你怎么用 Promise 去控制并发?

摘要&#xff1a; 时隔两年半&#xff0c;我&#xff0c;一个卑微的前端菜鸡&#xff0c;又来写面经了&#xff01;以为钱是程序员年轻奋斗的动力&#xff01;作为一个程序员&#xff0c;在一个地方慢慢成长后会产生一个能力小提升的一种傲娇&#xff01;希望你们一跳涨好几丈。…

HTB靶机013-Poison-WP

013-Poison 靶机IP&#xff1a; 10.10.10.84 Scan Nmap 快速扫描&#xff1a; ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.84 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-30 16:41 CST Nmap scan report for 10.10.10.84 Host is up (0.27s…

数据库中的几项区别

mysql中in和exists区别 mysql中的in语句是把外表和内表作hash 连接&#xff0c;而exists语句是对外表作loop 循环&#xff0c;每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高&#xff0c;这种说法其实是不 准确的。这个是要区分环境的。 1. 如…

Netty核心组件模块(一)

1.Bootstrap和ServerBootstrap 1>.Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类; 2>.常见的方法有: ①.public ServerBootstr…

动态规划——带权活动选择

带权活动选择Time Limit: 3000 MSMemory Limit: 1000 KB Description 给定n个活动&#xff0c;活动ai表示为一个三元组(si,fi,vi)&#xff0c;其中si表示活动开始时间&#xff0c;fi表示活动的结束时间&#xff0c;vi表示活动的权重, si<fi。带权活动选择问题是选择一些活…

有意思的各类算法,思维题目分享

1.统计子矩阵 思路&#xff1a;二维前缀和超时&#xff0c;下面是前缀和加双指针&#xff0c;对列前缀和&#xff0c;两个玄幻控制行号&#xff0c;双指针控制列的移动 考查&#xff1a;前缀和双指针 import os import sys# 请在此输入您的代码 # 矩阵大小 N M n,m,kmap(int,…

用 CSS 自定义滚动条

简介 首先需要介绍一下滚动条的组成部分。滚动条包含 track 和 thumb&#xff0c;如下图所示&#xff1a; track是滚动条的基础&#xff0c;其中的 thumb是用户拖动支页面或章节内的滚动。 案例&#xff1a; 案例代码&#xff1a; <!DOCTYPE html> <html><he…

【C++】-模板初阶(函数和类模板)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、为什么要模板&…