Hibernate
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate相关的知识,希望对你有一定的参考价值。
1.什么是hibernate
Hibernate是轻量级javaee应用的持久层框架,它用于实现dao,它是一个关系型数据库(行和列组成的)orm(对象关系映射)框架
2.什么是orm
通过将java对象映射到数据库表(二维关系表),通过操作java对象,就可以完成对数据表的操作
3.使用Hibernate的好处
能够让程序员通过操作对象的方式来操作数据库表
4Hiberante5 jar包下载地址
http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download
5.Hiberante的日志环境
hibernate使用日志输出系统slf4j输出日志,SLF4J提供了同意的记录日志的接口,使用Log4j作为记录日志的实现
6.hiberante环境的搭建
6.1.根据数据库表编写javabean
-
2.编写javabean映射文件,通常一个表对应一个映射文件,并且和javabean在同一个目录下,xxx.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 package="javabean所在的包"> <class name="javabean的名称" table="数据库表名"> <id name="javabean对应数据库主键" column="数据库主键"> <generator class="主键生成策略"></generator> </id> <property name="javabean对应数据库字段" column="数据库字段"></property> </class> </hibernate-mapping>
6.3编写住配置文件,名称hibernate.cfg.xml为主配置文件,配置了hibernate运行的参数信息,在classpath下定义
<?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>
第一部分:数据库基本配置
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/crm_hibernate_test
</property>
<property name="hibernate.connection.username">数据库用户名</property>
<property name="hibernate.connection.password">数据库密码</property>
配置数据库方言
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
第二部分:hibernate基本配置
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
自动生成DDL
根据映射产生表结构的类型:
create-drop:没有表结构创建,下次启动时删除重新创建。适合学习阶段
create:只做创建
update:探测表结构够的变化,对于数据库没有的,进行更新操作。适合学习阶段
validate:对比与数据库的结构
none:什么都不会做
数据库必须自己手动创建,hibernate不会创建
<property name="hibernate.hbm2ddl.auto">none</property>
第三部分:映射配置
<mapping resource="com/itheima/domain/xxx.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6.4.java代码
@Test
public void test1(){
实体类 实体类 = new 实体类();
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
session.save(实体类);
tx.commit();
session.close();
factory.close();
}
7Hibernate相关api-Configuration
作用:加载配置文件,它默认只会加载类的根路径下的配置文件
默认构造函数:
它默认只会加载类的根路径下的hibernate.properties配置文件。不会加载xml文件。
configure:
该方法会加载类的根路径下的hibernate.cfg.xml配置文件
8.Hibernate相关api-SessionFactory
作用:用于生产session对象,是由Configuration对象来创建的
说明:
1、该对象维护着应用中所有的映射文件信息。
2、它还维护类一些预定义的SQL语句。
(只包含每个实体都通用的:全字段插入,全字段更新,根据ID查询,查询所有)
3、维护着连接数据库的信息,hibernate的基本配置
4、还维护着hibernate的二级缓存
5、所有由该工厂生产的Session,共享工厂中的数据。
结论:SessionFactory是线程安全的。
SessionFactory的使用原则:
SessionFactorty是一个重量级对象,里面维护了很多信息。不应该随意的创建和销毁。
一个应用最好只有一个SessionFactory。
在web工程中,应该是随着应用的加载,而创建。随着应用的卸载而销毁
8.Hibernate相关api-Session
作用:对数据库进行增删改查操作,开启事物等等
说明:
1、Session是一个轻量级的对象。绝大多数信息都是由SessionFactory维护的。
2、它的创建和销毁不会消耗太多资源。
3、Session对象不是线程安全的。
4、Session维护着hibernate的一级缓存
Session的使用原则:
保证一个线程只有一个Session
常用方法:
save():保存一个对象
persist():JPA中提供方法.一般不使用.
update():更新一个对象
saveOrUpdate():保存或更新一个对象.看数据库中是否有对应的记录.
如果有对应的记录就执行更新的操作,如果没有就保存.
delete():删除对象
merge():合并两个对象
get()/load():根据主键查询
createQuery():HQL查询
createSQLQuery():数据库操作对象
createCriteria():条件查询
close():关闭连接
clear():清除一级缓存
evict(Object entity):清除一级缓存指定的实体
refresh(Object entity):使用数据库数据更新一级缓存中指定的实体
flush():清理一级缓存,使用缓存数据更新数据库的数据。
9.Hibernate相关api-Transaction
作用:针对事务的控制。
常用方法:
commit();提交事务
rollback();回滚事务;
Hibernate的事务默认是不自动提交的.
如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
10hibernate的执行流程
执行流程描述如下:
1、编写hibernate配置文件及pojo类,包括:hibernate.cfg.xml主配置文件、与数据库表对应的映射文件及pojo类。
2、应用程序调用hibernate的api加载hibernate配置文件、映射文件等。
3、通过configuration创建sessionFactory会话工厂
4、通过sessionFactory会话工厂创建session会话。
5、通过session操作数据库,session中定义了很多操作数据库的方法
6、对于增、删、改数据库操作需要transaction事务管理对象提交或回滚事务。
7、对于查询数据库操作通过query查询对象执行查询。
8、释放资源,一个操作结束后关闭session,应用程序结束后关闭sessionFactory
以上是关于Hibernate的主要内容,如果未能解决你的问题,请参考以下文章
使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)
Hibernate CriteriaQuery where - ManyToOne 字段
Hibernate + MySQL:如何为数据库和表设置编码 utf-8
hibernate在使用getCurrentSession时提示no session found for current thread