当前位置:网站首页>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类型。
边栏推荐
- 指针强化与提高
- Leetcode(435)——无重叠区间
- Beacon realizes asset management and indoor positioning based on 5.2 ultra-low power Bluetooth module efr32 (bg22ax)
- Common MySQL database functions and queries
- Circuit module analysis exercise 5 (power supply)
- ES6 - numerical extension and object extension
- 头歌 第3关:使用线程锁(Lock)实现线程同步
- Why is BeanUtils not recommended?
- 小程序-视图与逻辑
- Repoptimizer: it's actually repvgg2
猜你喜欢
Beacon realizes asset management and indoor positioning based on 5.2 ultra-low power Bluetooth module efr32 (bg22ax)
Circuit module analysis exercise 5 (power supply)
Multithreaded learning 2- call control
Oracle - getting started
QComboBox下拉菜单中有分隔符Separator时的样式设置
STM32开发板+机智云AIoT+家庭监测控制系统
STM32 development board + smart cloud aiot+ home monitoring and control system
【AXI】解读AXI协议原子化访问
[email protected]@COLLATION_ CONNECTION */"/>
. SQL database import error: / *! 40101 SET @OLD_ COLLATION_ [email protected]@COLLATION_ CONNECTION */
What is Unified Extensible Firmware Interface (UEFI)?
随机推荐
[opencv450 samples] inpaint restores the selected region in the image using the region neighborhood
Pit resolution encountered using East OCR (compile LAMS)
ACM. HJ16 购物单 ●●
多台云服务器的 Kubernetes 集群搭建
电路模块分析练习5(电源)
Oracle - data query
Ble Low Power Bluetooth networking process and Bluetooth role introduction
统计字符串中不同回文子序列的个数
Konva series tutorial 2: drawing graphics
jdbc常见异常及错误解决办法汇总
Day3 data types and operators summary and job
Meta universe standard forum established
Why is BeanUtils not recommended?
元宇宙标准论坛成立
头歌 第3关:使用线程锁(Lock)实现线程同步
干货丨产品的可行性分析要从哪几个方面入手?
character string
Core points of assembly language
24class static member
OBS-Studio-27.2.4-Full-Installer-x64.exe 下载