导航
JavaEE 三层结构
- web层 ---- 视图层:Strust2
- service层 ---- 业务逻辑层:Spring
- dao层 ---- 持久层:Hibernate
MVC思想
- 是一种思想,是一种分层的思想,不仅仅用在Java中,是共享的
- model ---- 模型层
- view ---- 视图层
- controller ---- 控制器
Hibernate概述
- 框架:写程序的过程中,当我们在使用框架后,框架能帮我们实现一部分功能,通过框架,我们可以少些一部分代码以实现相同的功能。
- Hibernate 是一种框架,应用在 JavaEE 三层结构的持久层中
- 使用 Hibernate 可以实现数据库的增删改查四大操作
- Hibernate 的底层代码其实就是 JDBC ,Hibernate 是对 JDBC 的封装,使用时*不需要写 sql 语句**就能实现数据库的四大操作
- Hibernate 是一个开源的轻量级框架,意味着是免费使用的,可以直接使用且导入的 jar 包较少
- 学习时采用 5.X 版本
ORM思想
- 全名为:
object released mapping
对象关系映射 - Hibernate 使用该思想对数据库进行增删改查的操作
- web 学习的
JavaBean
应该叫做实体类 - ORM 思想就是让实体类与数据库表通过配置文件的方式实现一一对应的关系,即实体类对应数据库表,类属性对应表字段
搭建环境
- 导入 jar 包(本身的 jar 包+日志输出的 jar 包+数据库连接的 jar 包)
因为 Hibernate 本身没有日志输出的 jar 包,因此需要导入
- 创建实体类( Hibernate 要求实体类中要有一个属性是唯一的,类似于数据库表的主键)
- 创建数据库(一般可通过 Hibernate 自动创建,无需手动创建)
- 配置对应关系(映射文件)
- 使用
xml
文件配置,一般在实体类所在的包内创建,名为类名.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
- 引入
xml约束
,Hibernate 中引入的为dtd约束<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- 填写配置信息
<hibernate-mapping> <!-- 1 配置类和表对应 class标签 name属性:实体类全路径 table属性:数据库表名称 --> <class name="cn.itcast.entity.User" table="t_user"> <!-- 2 配置实体类id和表id对应 hibernate要求实体类有一个属性唯一值 hibernate要求表有字段作为唯一值 --> <!-- id标签 name属性:实体类里面id属性名称 column属性:生成的表字段名称 --> <id name="uid" column="uid"> <!-- 设置数据库表id增长策略 native:生成表id值就是主键自动增长 --> <generator class="uuid"></generator> </id> <!-- 配置其他属性和表字段对应 name属性:实体类属性名称 column属性:生成表字段名称 --> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
- 使用
- 创建 Hibernate 核心配置文件
- 使用
xml
配置文件的格式,文件名称和位置固定,文件命名为hibernate.cfg.xml
,位置在src下面
<?xml version="1.0" encoding="UTF-8"?>
- 引入dtd约束
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- 配置数据库信息
- 配置 Hibernate 信息
- 配置映射文件
<hibernate-configuration> <session-factory> <!-- 第一部分: 配置数据库信息 必须的 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 第二部分: 配置hibernate信息 可选的--> <!-- 输出底层sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 输出底层sql语句格式 --> <property name="hibernate.format_sql">true</property> <!-- hibernate帮创建表,需要配置之后 update: 如果已经有表,更新,如果没有,创建 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库方言 让hibernate框架识别不同数据库的自己特有的语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 第三部分: 把映射文件放到核心配置文件中 必须的--> <mapping resource="cn/itcast/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
- 使用
创建文件时只需将三个代码部分依次复制粘贴,再补充内容即可
实现添加操作
- 加载 Hibernate 核心配置文件
- 创建 SessionFactory 对象
- 使用 SessionFactory 创建 session
- 开启事务
- 写具体逻辑CRUD操作
- 提交事务
- 关闭资源
//测试类
Hibernate 核心配置api
Configuration
- 到 src 下面找到名称为
hibernate.cfg.xml
配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件,也有手动指定的方式,不过通常不用)
SessionFactory(重点)
- 使用
configuration
对象创建SessionFactory
对象 - 创建过程中进行一些操作:根据核心配置文件,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
- 创建sessionFactory过程中,这个过程特别耗资源的,因此在Hibernate操作中,建议一个项目一般创建一个sessionFactory对象
- 具体实现,通过创建一个工具类,写静态代码实现,因为静态代码块在类加载时候执行且只执行一次
public class HibernateUtils { static Configuration cfg = null; static SessionFactory sessionFactory = null; //静态代码块实现 static { //加载核心配置文件 cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } //提供方法返回sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } }
Session(重点)
session
类似JDBC里的connection
- 调用 session 里面不同的方法实现CRUD操作(
save
添加、delete
删除、update
更新、get
查询) - session 对象单线程对象(只能自己用,不能与别人共用)
Transaction
- 事务对象
//创建对象
- 事务提交和回滚方法:
commit
/rollback
- 事务的四个特性:
原子性(操作不可分割,一个失败全部失败);
一致性(操作前后数据总量不会变);
隔离性(多个事务同时操作一个记录不会互相影响);
持久性(提交后数据库生效持久化保存);
一般问题解决
- 配置配置文件没有提示
- 不要手写,很容易出错
- 可以上网解决,约束的地址是一个网络的地址,要联网才能使用
- 不可以上网的话可以把下载了的约束文件引入 IDE 中