当前位置:网站首页>hiberate架构介绍及环境搭建(非常详细)
hiberate架构介绍及环境搭建(非常详细)
2022-06-25 22:01:00 【_七里香】
目录
1 三层架构
1、web层:struts2框架
2、service层:spring框架
3、dao层:hiberate框架 (对数据库进行crud操作)
MVC思想:model-view-controller
2 hiberate概述
在javaEE三层架构中的dao层。
Hibernate底层就是JDBC,对JDBC进行了封装,好处就是不需要写复杂的JDBC代码和SQL语句实现了。
Hibernate是一个开源的、轻量级(可以直接用不需要依赖其他的东西、导入很少的jar包)的框架
Hibernate版本:Hibernate3.x、4.x、5.x;4.x是过度版本
3 ORM思想
Hibernate是一个开放源代码的对象关系映射(orm-Object Relational Mapping)框架。
Hibernate使用该思想对数据库进行crud操作。
Web阶段javaBean类,在框架阶段叫实体类。
让实体类和数据库表进行一对一对应关系。
类的属性--表中的字段对应
不需要直接操作数据库表,直接操作表对应实体类对象。
Jdbc代码:
Class.forName(“com.oracle.jdbc.driver”);
Connection = DriverManager.getConnection();
(url,username,password)
String sql=””;
ps = conn.prepareStatement(sql);
rs = ps.excuteQuery();
//遍历结果集
//释放资源实体类
Public class User{
Private int userid;
Private String username;
Private String password;
//set、get
}数据库表:
Create table t_user(
Userid number not NULL AUTO_INCREATEMENT,
username varchar2(100),
password varchar2(100)
);使用配置文件的方式完成一一对应
Hibernate封装的对象Session:
User user = new User();
User.setUserName(“”);
Session.save(user); //session中的方法4 Hiberate环境搭建与各种准备(非常详细)
基础准备
第一步:导入Hibernate的jar包
require文件夹与JPA文件夹中的jar必须导入。

因为使用Hibernate时有日志信息输出,Hibernate本身没有日志输出的jar包,需要导入其他的日志jar包支持这些输出。
2、创建实体类
Hibernate要求实体类中有一个属性(如id)是唯一的。(如表中的主键)
private int userid;
3、创建表(hibernate可自动创建)
4、配置实体类和数据库表的映射关系--配置文件实现
创建xml配置文件:配置文件名称和位置没有要求,但一般命名为:hbm.xml;位置创建在所在实体类所在包下。
先引入xml约束,目前在hibernate中大多数是dtd约束;在hibernate的约束文件(hibernate-mapping-3.0.dtd)中复制过来拷入创建的xml。
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >配置一对应关系

创建核心配置文件
位置和名称固定。位置--src下;名称--hibernate.cfg.xml

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>
<!--1.配置数据库信息 ,必须要有 -->
<!-- 配置数据库的方言,如:MySQL中分页为limit,oracle中是rownum;让hibernate识别不同数据库中的语句或关键字 -->
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
<property name="hibernate.connection.username">abc</property>
<property name="hibernate.connection.password">abc</property>
<!--2.配置hibernate信息,可有可无的 -->
<!-- 输出底层SQL -->
<property name="hibernate.show_sql">true </property>
<!-- 对底层SQL进行格式化,格式化即不在一行显示 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动生成或更新数据库表,写了的话,就会自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3.注册映射文件 -->
<mapping resource="com/wl/entity/User.hbm.xml" /> <!-- 以src为相对路径,如果在src下,直接就是User.hbm.xml -->
<!-- 注:hibernate.hbm2ddl.auto的值为create表示每次运行都会新建表;
值为create-drop是在关闭SessionFactory时删除仙剑表;
值为update(常用值)时表示如果第一运行时数据库没有对应表,那么会新建表,但是如果存在对应数据表,就不再创建对应的数据表 -->
</session-factory>
</hibernate-configuration>
复制进去dtd约束:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载。
以下三部基本只配置一次,之后很少修改。
第一部分:配置数据库信息
第二部分:配置hibernate信息
第三部分:把配置文件放到核心配置文件中
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>实现添加操作步骤
第一步:加载hibernate核心配置文件
第二步:创建Sessionfactory工厂对象
第三步:使用Sessionfactory创建session对象
第四步:开启事务,建议手动创建
第五步:curd操作
第六步:提交事务
第七步:关闭资源
变化的只是第五步,其他通用固定。
测试全代码
package com.wl.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.wl.entity.User;
import com.wl.utils.HibernateUtils;
/*
* 添加:save()
* 修改:update()
* 删除:delete()
* 根据id查询:get()
*/
public class InsertDemo {
/*
* 修改
*/
@Test
public void updateDemo(){
// Configuration cfg = new Configuration();
// cfg.configure();
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUserid(4);
user.setUsername("rrr");
user.setPassword("rrr");
user.setAddress("AAAAA");
session.update(user);
transaction.commit();
session.close();
sessionFactory.close();
}
/*
* 插入
*/
@Test
public void insertDemo1(){
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUsername("wl9");
user.setPassword("000002");
user.setAddress("XXXXX");
session.save(user);
transaction.commit();
session.close();
sessionFactory.close();
}
/*
* 插入
*/
@Test
public void insertDemo(){
// 第一步:加载hibernate核心配置文件,会在src下找hibernate.cfg.xml
Configuration cfg = new Configuration();
cfg.configure();
// 第二步:读取核心配置文件的内容,来创建Sessionfactory工厂对象;在该过程中,会根据映射关系,在配置数据库中创建表。
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 第三步:使用Sessionfactory创建session对象,类似于连接connection
Session session = sessionFactory.openSession();
// 第四步:开启事务,建议手动创建
Transaction transaction = session.beginTransaction();
// 第五步:curd操作,如添加操作
User user = new User();
user.setUsername("123");
user.setPassword("000002");
user.setAddress("XX");
//调用session里面的方法实现添加
session.save(user);
// 第六步:提交事务
transaction.commit();
// 第七步:关闭资源
session.close();
sessionFactory.close();
}
}
效果验证
1是否创建了表;
2是否增加了记录。
控制台:
共五条语句:
Hibernate:
update
t_user
set
username=?,
password=?,
address=?
where
userid=?
Hibernate:
select
hibernate_sequence.nextval
from
dual
Hibernate:
insert
into
t_user
(username, password, address, userid)
values
(?, ?, ?, ?)
Hibernate:
select
hibernate_sequence.nextval
from
dual
Hibernate:
insert
into
t_user
(username, password, address, userid)
values
(?, ?, ?, ?)数据库中:

select dbms_metadata.get_ddl('TABLE', ‘T_USER’) from dual;
![]()
或desc查看:

5 实体类的编写规则
- 属性私有,提供get/set方法。
- 要有一个属性作为唯一值,如使用id区分唯一值。
- 实体类的数据类型建议使用基本数据类型的包装类型,如Integer,Character,其他都是首字母大写
如果使用int表示score,int score=0;分数为0时,此时若要表示学生没有参加考试就无法实现,因为int score=null;是错误的。这时就要用Integer score = null;
6 主键增长策略
主键:在Hibernate中持久化类都会有一个标识属性,用于标识实例的唯一,该属性映射到数据库表的主键。
主键生成器:<generator class="生成方式"/>
生成方式的值有:
increment:表示获取数据库中表最大主键值,并+1后作为新的主键。
identity:自动增长,主要使用在mysql,db2。
Sequence:Hibernate根据底层数据库序列生成标识符,条件是数据库要支持序列。适用于代理主键。
native:(开发中一般选择此方式)自动增长,Hibernate会根据数据库从identity,sequence(序列),hilo(高低算法)中选择一种合适的方式生成主键,在mysql中时使用identity,在Oracle中时选择sequence(序列)。
uuid:使用UUID算法生成字符串类型主键(主要用于分布式部署)。
使用uuid时,将实体类的主键修改为String类型,将配置文件中修改为uuid。
运行封装好的工具类,查看效果:

运行测试数据:
![]()
也就是说,当使用uuid策略作为主键生成策略时,需要把主键设为String类型。
边栏推荐
- 记录一下Qt将少量图片输出为MP4的思路及注意事项
- Live800 online customer service system: do business across time and space, starting from each interaction
- 24class static member
- How to solve the problem of SQL?
- Oracle -- table operation
- 【opencv450 samples】创建图像列表yaml
- OBS-Studio-27.2.4-Full-Installer-x64.exe 下载
- LM small programmable controller software (based on CoDeSys) note XVII: PTO pulse function block
- 论文笔记: 多标签学习 MSWL
- 元宇宙标准论坛成立
猜你喜欢

为什么OpenCV计算的帧率是错误的?

Qt 中文和英文分别使用不同的字体

Actual combat: how to quickly change font color in typera (blog sharing - perfect) -2022.6.25 (solved)

论文笔记: 多标签学习 MSWL
2. What is the geometric meaning of a vector multiplying its transpose?

How to add cartoon characters to the blog park?

Leaky API interface practical development series (13): gooseneck cloud service php-api two-dimensional array parameter transfer solution

As a programmer, how can we learn, grow and progress happily? (personal perception has nothing to do with technology)

Xinchida nd04 nd04c nrf52832 (52810) ble module (low power Bluetooth communication module) at command test

转载: QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
随机推荐
Paper notes: multi tag learning MSWl
The first public available pytorch version alphafold2 is reproduced, and Columbia University is open source openfold, with more than 1000 stars
Svn icon disappearing solution
[untitled] open an item connection. If it cannot be displayed normally, Ping the IP address
Beacon realizes asset management and indoor positioning based on 5.2 ultra-low power Bluetooth module efr32 (bg22ax)
No absurd tea applet - rule change
论文笔记: 多标签学习 MSWL
【2023校招刷题】番外篇1:度量科技FPGA岗(大致解析版)
信息学奥赛一本通 1353:表达式括号匹配(stack) | 洛谷 P1739 表达式括号匹配
LM小型可编程控制器软件(基于CoDeSys)笔记十七:pto脉冲功能块
Meta universe standard forum established
首个大众可用PyTorch版AlphaFold2复现,哥大开源OpenFold,star量破千
[opencv450 samples] inpaint restores the selected region in the image using the region neighborhood
Qt Utf8 与 Unicode 编码的互相转换, Unicode编码输出为格式为 &#xXXXX
干货丨产品的可行性分析要从哪几个方面入手?
User interaction scanner usage Advanced Edition example
. SQL database import error: / *! 40101 SET @OLD_ COLLATION_ [email protected]@COLLATION_ CONNECTION */
go中全类型等值判断解析&综合汇总
New network security competition of the secondary vocational group in 2022
Leaky API interface practical development series (13): gooseneck cloud service php-api two-dimensional array parameter transfer solution