您的位置:首页 > 其它

Hibernate基础

2016-06-07 10:12 453 查看

HIBERNATE

1、HIBERNATE 概述

JDBC主要解决的是数据持久化问题,也即数据的永久保存问题。
HIBERNATE也是解决持久化问题的,如果按分层开发来实现的话,HIBERNATE解决的是DAO层相关问题。
也即HIBERNATE 是对JDBC的封装
持久化相关技术:JDBC、DBUTILS框架、HIBERNATE框架、MYBATIS框架。
这些技术中  HIBERNATE框架相对更好,功能最强大,封装程度最高。
但是HIBERNATE效率相对较慢,如果数据量超过500万条,请选择其他技术。
HIBERNATE存在的必要性:
1、java程序员操作的是对象,而当今主流的数据库都是关系型数据库,
所以java程序员都是拿着对象,而底层操作的是关系数据库。操作数据库SQL语句实际相当于面向过程的、
2、对象关系映射,因此需要解决对象与关系的映射问题。
ORM(OBJCET RALATIONSHIP MAPPING)  对象关系映射是HIBERNATE精华
一个类映射到一张表
类中的属性映射为表中的字段
一个对象映射为表中的一条记录
在HIBERNATE中为体现这种映射就需要专门的配置文件(实体类名.hbm.xml)
HIBERNATE优点:
1、程序员不需要关注SQL语句
2、程序员不需要关注数据封装


2、HIBERNATE 下载

下载hibernate:
hibernate官方网站:http://hibernate.org/orm/
下载hibernate5: http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download


3、介绍包结构

4、准备工作

1、准备hibernate 开发时所必须的jar包

2、准备hibernate 所需要的配置文件
默认配置文件名 hibernate.cfg.xml.
a.找到dtd约束文件
b.打开对应的dtd文件,得到响应的引入信息,复制到hibernate.config.xml文件
c.找到hibernate.properties 文件,根据里面所需要的信息,配置hibernate.config.xm文件
d.<hibernate-configuration>
<!--会话工厂元素   -->
<session-factory>
<!--配置数据库连接字符串   -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_26</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置hibernate 方言 -->
<!--方言是指hibernate  底层SQL语句使用的什么样的SQL语句  -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--配置显示sql语句  -->
<property name="hibernate.show_sql">true</property>
<!--格式化显示sql,使SQL语句更美观  -->
<property name="hibernate.format_sql">true</property>
<!--指定加载映射文件    配置文件路径默认为类路径
总结下,配置路径的写法详细
-->
<mapping resource="Customer.hbm.xml" />
<!-- 自动建表属性-->
#hibernate.hbm2ddl.auto create-drop  先删除再创建  (测试程序是否可用)
#hibernate.hbm2ddl.auto create      (测试人员)
#hibernate.hbm2ddl.auto update      (开发人员)
更新表结构   ,只加列,不删除列
#hibernate.hbm2ddl.auto validate   (校验映射文件是否正确)
none不更新表结构
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
--插入配置文件信息图
3、准备hibernate 相关的映射文件
a.先准备实体类(域模型)
b.准备配置文件类名.hbm.xml
c.配置相关信息
d.在配置文件中加载映射文件
4、HIBERNATTE 主键生成策略  记住
<!-- 主键的生成增长策略
identity:mysql的自增效果
sequence:Oracle 序列
native:根据本地数据库来决定,使用自增还是序列
assigned:程序员自己指定主键id
uuid:根据uuid来自动生成随机主键
increment:在原有主键取值的基础上+1
-->


5、HIBERNATE开发步骤

//1 加载并解析hibernate  配置文件,默认加载的是hibernate.cfg.xml文件
//hibernate配置文件名称可以任意定义,只需要在new Configuration().configure("配置文件路径")
Configuration config  = new Configuration().configure();
//2 得到SesssionFactory对象 类似于连接池
sessionFactory = config.buildSessionFactory();
//3 得到Session 对象,类似于获取一个连接
session = sessionFactory.openSession();
//4 开启事务
transaction = session.beginTransaction();
//5 执行 curd操作
Customer customer =  new Customer();
//5.1 封装数据
customer.setCustName("刘玄德");
session.save(customer);
//6 提交或回滚事务
transaction.commit();
//7 关闭session ,sessionFactory 释放资源
session.close();
sessionFactory.close();


6、API详解

6.1 log4j.jar

1、在项目中加入log4j.jar,用于记录日志的。同时加入log4j.properties配置文件
加入它们的主要目的就是为了日志信息的记录。
2、hibernate使用的连接池为自定义连接池,可以替换为c3p0连接池
导入c3p0的jar包
更改hibernate.cffg.xml配置文件<property name="hibernate.connection.provider_class">
org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
这样就可以使用c3p0连接池了


6.2 session接口

1、openSession()
永远都是从连接池取出一个连接
2、getCurrentSession()
从本地线程中取出连接
使用getCurrentSession()获取的连接,提交事务时,自动关闭连接 ,不需要手动关闭连接


6.3 Transaction API分析

代表事务,操作的方法,commit()代表提交,rollback()代表回滚
事务的隔离性,如果没有考虑,可能产生一些情况:
脏读
不可重复读
虚读
就可以设置一些隔离级别,
READ UNCOMMITED  可以产生脏读  1
READ COMMITED  可以防止脏读  (Oracle)    2
REPEATABLE READ  可以防止脏读,不可重复读,虚读依然可以产生 (Mysql)  4
SERIALIZABLE  什么都防  8
配置文件中进行配置
<property name="hibernate.connection.islation">4</property>
丢失更新问题:解决方案如下:
锁机制(增删改本身带锁)
查询命令带锁:select * from customer for update;(悲观锁)
Hibernate要解决这个问题,也可以使用乐观锁
在映射文件中,加入一个version版本字段,hibernate就会自动维护
同时在配置文件中进行配置
<version name="version"></version>


7 hibernate 数据检索的五种方式

五种查询数据的方式


7.1 get/load

只能通过主键查询,效率相对较高
get与load的区别


7.2 QBC查询 query by criteria

1、获取Obc查询对象
Criteria criteria = session.createCriteria(实体类.class)
//添加条件进行查询  gt 大于 ge大于等于  le小于等于  lt小于  In and or like
criteria.add(Restrictions.gt(列名,条件值));
//分页查询
pegeSize 每页个数  pageNumber  页码
criteria.setMaxResults(pageSize);
criteria.setFirastResults(pageSize*(pageNumber-1));
//查询所有
List<实体类> list = criteria.list();


7.3 HQL查询(Hibernate Query Language)

相比于SQL查询,不需要关注表,只需要关注类和属性即可。
[Select 属性名] from 类名  where条件(属性=值1)
//1获取HQL对象

Query query = session.createQuery(HQL语句);
List<>  list = query.list();


7.4 SQL查询(Hibernate Query Language)

//1 h获取SQL对象,同时将获取到的列绑定到对应的类的属性上
SQLquery sql = session.createSQLQuery(sql).addEntity(类名.class);


7.5 对象导航

需要用到多表关联操作,暂且不做。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: