Hibernate应用基础知识

ORM框架:

ORM是什么?

ORM(Object/Relation Mapping,对象、关系数据库映射),用于实现Java应用中的对象与关系数据库中的数据的映射,从而可以通过持久化对象(PO)以面向对象的方式来操作数据库。

为什么使用ORM框架?

面向对象语言和数据库之间存在模型不匹配(阻抗不匹配)问题。面向对象语言:对象模型,主要概念是类、对象、继承、多态、关联等。关系型数据库:关系模型,主要概念是表、记录、主键、外键等。

怎么使用ORM框架?

主流的ORM框架有hibernate、TopLink等,其中hibernate应用最广泛

Hibernate是什么?

Hibernate是轻量级的Java EE应用的持久层解决方案。它对JDBC进行了轻量级的封装,不仅能管理Java类到数据库表的映射,还能提供数据查询和获取数据的方法。
使用Hibernate可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间

在这里插入图片描述

怎么使用Hibernate?

创建Hibernate应用的步骤:
搭建Hibernate运行环境。
创建Hibernate配置文件。
创建持久化类。
创建对象-关系映射文件。
通过Hibernate API编写访问数据库的代码。

搭建Hibernate运行环境,我这里使用的是idea,用的是maven管理

<dependencies>
        <!-- https://mvnrepository.com/artifact/antlr/antlr -->
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
        <dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy</artifactId>
            <version>1.10.10</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
        <dependency>
            <groupId>com.fasterxml</groupId>
            <artifactId>classmate</artifactId>
            <version>1.5.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.xml.fastinfoset/FastInfoset -->
        <dependency>
            <groupId>com.sun.xml.fastinfoset</groupId>
            <artifactId>FastInfoset</artifactId>
            <version>1.2.15</version>
        </dependency>


        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>5.1.0.Final</version>

        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.22.Final</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime -->
        <dependency>
            <groupId>com.sun.istack</groupId>
            <artifactId>istack-commons-runtime</artifactId>
            <version>3.0.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.24.0-GA</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>javax.activation-api</artifactId>
            <version>1.2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.3.2.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.transaction/jboss-transaction-api_1.2_spec -->
        <dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            <version>1.1.1.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jvnet.staxex/stax-ex -->
        <dependency>
            <groupId>org.jvnet.staxex</groupId>
            <artifactId>stax-ex</artifactId>
            <version>1.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/txw2 -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>txw2</artifactId>
            <version>2.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
        </dependency>




    </dependencies>

Hibernate配置文件:

作用:用于配置数据库连接设置、Hibernate属性设置及映射文件设置等内容。
怎么做:
两种形式:hibernate.cfg.xml文件或者hibernate.properties属性文件,两者取一

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>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_1</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!--连接池-->
<!--        <property name="connection.pool_size">2</property>-->
        <!--数据库方言定义-->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="Person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

持久化类:

作用:ORM的作用是把对PO的CRUD等操作转换成对数据库的相关操作。
持久化类编写规范:
必须具有无参构造方法
具有一个主键属性
非final类,否则无法使用懒加载以及代理
使用JavaBean的编写规范来编写属性的setter和getter方法

映射文件:

作用:用于设置持久化类与数据库表的映射关系,是hibernate的核心所在。一般以持久化类名+hbm.xml来命名,如Person.hbm.xml;并保存在与持久化类同目录下,不过一般为了文件分离开,路径用对即可,不一定非得要在同一持久化类的目录下

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.hibernate.org/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.sise.hibernate.lesson1.domain">
    <class name="Person" table="person">
        <id name="id">
            <generator class="native" />
        </id>
    <property name="name" type="java.lang.String" length="12" not-null="true" column="name"/>
        <property name="age" type="integer" />
    </class>
</hibernate-mapping>

常用的主键解释:
increment:由Hibernate自动以递增的方式生成主键,每次增量为1。
identity: 使用数据库提供的自增长主键机制,如Mysql
sequence: 使用数据库提供的sequence机制生成主键,如oracle
native:由hibernate根据数据库驱动定义,自动选择主键生成机制
hilo:由Hibernate根据hight/low算法来生成主键
foreign:用另一个关联的对象的标识符作为当前对象的标识符,主要用于一对一关联设置
assigned: 由应用程序生成

Hibernate核心API

在这里插入图片描述
Configuration类:
负责读取及解析Hibernate的配置信息
创建SessionFactory实例

SessionFactory接口:
是数据库编译后的内存镜向,其中缓存了解析
后的配置信息
在应用初始化时创建,对于使用一个数据库的
应用程序只有一个会话工厂
用于创建Session实例

Session接口:
Session封装了与数据库之间的一系列操作
所有持久化操作都需要使用该接口
所有持久化操作完成后,需要关闭会话

Session接口常用的几个方法
在这里插入图片描述
Transaction接口:
使用Hibernate进行持久化操作必须显式开启事务
使用Session实例开启事务
持久化操作在事务提交后生效

Hibernate中Java对象的状态

在hibernate中,Java对象在整个生命周期中存在以下三种状态:
瞬时状态:在内存中刚刚创建的对象,数据库中没有数据与之对应,与session也没有关联
持久化状态:数据库中有数据与之对应,且与session有关联; 持久对象状态发生改变时,事务提交时会自动更新数据库
游离(脱管)状态:数据库中有数据与之对应,但当前没有session与之关联;对象状态发生改变,hibernate不能检测到,必须调用更新数据库方法才能更新到数据库

基于持久层框架的DAO模式应用示例

上传资源后我会把链接放到这里

pom.xml导入的依赖:

<dependencies>
        <!-- https://mvnrepository.com/artifact/antlr/antlr -->
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
        <dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy</artifactId>
            <version>1.10.10</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
        <dependency>
            <groupId>com.fasterxml</groupId>
            <artifactId>classmate</artifactId>
            <version>1.5.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.xml.fastinfoset/FastInfoset -->
        <dependency>
            <groupId>com.sun.xml.fastinfoset</groupId>
            <artifactId>FastInfoset</artifactId>
            <version>1.2.15</version>
        </dependency>


        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>5.1.0.Final</version>

        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.22.Final</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime -->
        <dependency>
            <groupId>com.sun.istack</groupId>
            <artifactId>istack-commons-runtime</artifactId>
            <version>3.0.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.24.0-GA</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>javax.activation-api</artifactId>
            <version>1.2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.3.2.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.transaction/jboss-transaction-api_1.2_spec -->
        <dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            <version>1.1.1.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jvnet.staxex/stax-ex -->
        <dependency>
            <groupId>org.jvnet.staxex</groupId>
            <artifactId>stax-ex</artifactId>
            <version>1.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/txw2 -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>txw2</artifactId>
            <version>2.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
        </dependency>
    </dependencies>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一峰说

坚持价值输出

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值