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

  1. 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的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的HQL多表查询

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

Hibernate CriteriaQuery where - ManyToOne 字段

Hibernate + MySQL:如何为数据库和表设置编码 utf-8

hibernate在使用getCurrentSession时提示no session found for current thread

Java类型相互转换byte[]类型,blob类型