Hibernate(1) 初识Hibernate

Hibernate(1) 初识Hibernate

Part 1 简单介绍

     之前已经学习了Java Web开发中的三层架构,现在开始学习Hibernate框架来帮助提升在Dao层开发的效率,Hibernate框架的介绍之类的就不再赘述,百科说的很详细,仅抽取几个比较有特点的概念来简述一下。这些因为是初次接触,还是记下来,以便后续再看的时候能有个头绪。
     首先来讲,Hibernate是一个轻量级(不需要依赖太多Jar)的持久层(可以永久长时间的进行存储)ORM(Object Relational Mapping)框架。对ORM多说两句,ORM是JPA(Java Persistence API Java持久API)中其一的一个规范,指的是对象关系映射,它的作用就是使得数据库的表可以与Java中的实体类联系起来,使其二者之间形成一种映射关系。然后开发过程中就可以来操作这个实体类对象,达到操作据库信息的目的,而之前通过JDBC以及相关的JDBCUtils工具等的都是直接连接到数据库,对数据库的字段进行更新的。
     而至于ORM的好处,现在还暂时不了解,随着学习的深入,我想我会有自己的答案。还有问题就是ORM是属于JPA规范的一种,那么JPA又是什么呢?百度,Google都有介绍。还是在这里简述下,他是一组规范,用于建立对象与关系表之间的映射关系,而且可以将对象持久化到数据库中去,而建立映射关系的形式可以使用XML以及注解的形式。而ORM使其一种规范,而Hibernate又是ORM规范,所以算是JPA的一种实现,JPA内部维护了一个持久化上下文对象,该对象可以通过注解或xml注释来与数据库建立映射关系。并且可以对映射的实体对象进行CRUD,以及查询操作。所以Hibernate对其进行实现。而我们使用Hibernate的时候,就可以建立映射关系,并对实体类进行操作。

Part 2 使用Hibernate做一次简单的数据插入操作

1,导入Hibernate以及其依赖包, 建立测试用的数据库等操作…
2.建立上面所提到的ORM映射关系:

Hibernate中对于ORM关系的映射是使用xml配置文件的形式进行的,建立的过程大致有如下几个方面:

  1. 命名问题以配置文件位置问题,配置文件的命名以:【实体类名称.hbm.xml】的形式存在,位置放在实体类的所在目录下,这二者不是必须要按照这样的说法做,因为他们更像是一种约定。
  2. xml文件需要使用Hibernate的dtd头,这些头可以到Hibernate中的Hibernate-core-xxx.jar中的org.hibernate下找到,包括后面说的核心配置文件dtd头也在这个目录下。当然为了以后方便使用,在这里也给出下:
映射文件dtd:
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
核心文件dtd:
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

下面继续说映射实体类与表的过程,下面给出了大致的流程:

说明:本例使用了一个名为Person的实体类,包括id,name,gender,age,birthday属性,后续的代码中将不再做出说明

<?xml version="1.0" encoding="utf-8" ?>

<!--映射配置文件的dtd-->
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!--建立映射关系的根标签,代码在这里面写-->
<hibernate-mapping>
    <!--为Person实体类建立映射关系, 将其与数据库的tb_person建立映射关系-->
    <class name="com.bestbigkk.domain.Person" table="tb_person">

        <!--指示该实体类中哪一属性与表的主键对应,每建立一个映射关系都必须指定!-->
        <id name="id" column="id">

            <!--主键生成策略-->
            <generator class="native"></generator>
        </id>

        <!--
            使用property标签将实体类的属性与建立映射关系的表中的字段联系起来
            1、常规来讲在property标签设置实体类的属性名name以及数据库字段名colume就可以将二者建立关系

            2、针对第三个name属性,在未指定column的属性的时候,Hibernate会缺省地使用实体类的属性名作为字段名

            3、针对第4个birthday属性,peoperty还可以使用属性type来指定Hibernate的[映射类型], 不是指定Java的类型,也不是Sql的类型,他们存在的作用是把Java数据类型转换为Sql数据类型,
               在未设置的情况下,Hibernate会尝试自己进行转换,但是这种自动转换机制(反射)在对某些类型进行转换的时候会出错,比如Date类型,在我们不指定的时候,
               Hibernate更无法确认这个是转换为 SQL date,或timestamp,还是time 字段,所以这种情况下需要我们来告诉Hibernate他要怎么做!
        -->
        <property name="age" column="age"></property>
        <property name="gender" column="gender"></property>
        <property name="name"></property>
        <property name="birthday" type="timestamp" column="birthday"></property>
    </class>
</hibernate-mapping>

到这里,实体类Person就与数据库的表tb_Person建立起了映射关系


3.配置Hibernate:

在建立完实体类与表的映射关系之后,接下来就是要配置Hibernate的核心配置文件了。Hibernate加载的就是这一个配置文件,而我们前写的映射文件也会在这里被引入,好啦,大致说下配置的流程吧!

因为是开始接触Hibernate,在核心配置文件进行的配置都是比较基本的,但不意味着核心配置文件的属性就这么多,相反,可以使用的东西还是挺多的,但是因为是处于初级学习阶段,先进行横向扩展,了解Hibernate的大体使用。在以后具体熟练之后,再进行有针对性的纵向扩展。

  • 核心配置文件的不同于映射文件,他的名称与位置必须按要求的来,文件名为:【hibernate.cfg.xml】全小写的,并且要放在src目录下,这点与之前所了解的C3P0连接池的配置文件是相似的!

核心文件的配置大致流程如下:

<?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信息-->
<hibernate-configuration>
    <session-factory>
        <!--配置要连接数据库 除标准语句之外的SQL语句,通俗的所也就是方言啦, 比如MySql的limit语句,属于其特有的,所以可以通过其导入,成为一个地地道道的家乡人!-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!--驱动-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <!--地址,使用:///代表使用默认端口连接到本地-->
        <property name="connection.url">jdbc:mysql:///hibernate_test</property>

        <!--帐号-->
        <property name="connection.username">root</property>

        <!--密码-->
        <property name="password">我爱你们</property>

        <!--
            name的值其实是可以省略hibernate前缀的,比如针对上面的数据库属性【password】的配置
            name的值可以为“hibernate.connection.password”,也可以将hibernate省略的写
            当然啦,再想偷懒缩短,就是行不通的啦!
        -->


        <!--对Hibernate的选项配置,再次说明,这不是全部!具体的可以参照API-->

        <!--是否显示sql语句-->
        <property name="show_sql">true</property>

        <!--格式化Sql语句显示-->
        <property name="hibernate.format_sql">true</property>

        <!--
            ddl策略,标识Hibernate对表的处理方式
                create:清除表,然后在进行创建
                create-drop:先创建表,再进行删除,测试程序是否正确
                update:表存在则使用存在的表,否则创建
                validate:检查表与映射的实体类类型是否一致,不一致则报错
                常用:update,validata
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!--事务自动提交-->
        <property name="connection.autocommit">true</property>

        <!--
            将我们编写的实体类的映射关系导入,上面说过,hibernate只会加载这一个核心配置文件,所以在这里我们要手动引入!
        resource的开始路径为/src
        -->
        <mapping resource="com/bestbigkk/domain/Person.hbm.xml"></mapping>

    </session-factory>
</hibernate-configuration>

4.进行单元测试查看效果

到了这一步就真的开始接触期待已久的代码啦,配置文件的工作就已经是完成了,下面还是使用代码演示,个人更习惯对代码一句句的添加必要注释,而不喜欢放一大段代码然后在甩出一大段说明,会迷!也不利于步步说明。当然,个人喜好啦!OK!上代码:

package com.bestbigkk.Main;

import com.bestbigkk.domain.Person;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;


public class Main {
    @Test
    public void test() throws ParseException {
//        加载Hibernate核心配置文件,而非映射文件
        Configuration configuration = new Configuration().configure();


//        创建工厂,但是buildSessionFactory()方法已经被标记为过时的,新的获取形式如下
//        SessionFactory sessionFactory = configuration.buildSessionFactory();

//        新的获取工厂形式如下,先构建一个Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制.
        ServiceRegistry serviceRegistry  = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

//        创建一个会话
        Session session = sessionFactory.openSession();

//        开启一个事务处理数据
        Transaction transaction = session.beginTransaction();

//        操作
        Person person = new Person();
        person.setName("KK");
        person.setAge(20);
        person.setGender("男");
//        生日为date类型
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        person.setBirthday(sdf.parse("2020-05-20"));

//        使用持久化对象将其保存到映射的表,底层Hibernate会向数据库发送一个insert语句将该对象插入
        session.save(person);

//        操作完成,提交事务
        transaction.commit();

//        关闭持久化对象
        session.close();

//        销毁会话工厂
        sessionFactory.close();

    }
}

上面的代码就是对Hibernate的一个初步认识了,在编写的时候,需要注意的是导包的问题,需要到的是Hibernate下的包,需要注意下!另外针对上述buildSessionFactory()方法过时后所提供新的推荐对象 ServiceRegistry详细的可以参照[这里]来了解

5.代码执行结果

1.在配置文件中设置了输出SQL语句,所以在进行插入的时候,可以在控制台看到插入语句:
输出的SQL语句
2.并且进入数据库,我们可以看到刚才所插入的数据
这里写图片描述

6.过程中遇到的问题,在这里也罗列下,以便参考:

- 报错:Database returned no natively generated
解决方法:主键自增策略设为native,但是数据库没有指定自动增长。需要去数据库设置自动增长!
-报错:java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
Hibernate 需要 JPA.jar 支持。可能未导入
-报错:java.lang.NoClassDefFoundError: javax transaction SystemException
Hibernate需要JTA.jar包

以上的缺失的包其实都位于Hibernate的lib下的provided目录。之前在导入的时候只看到required,以为这里面的才是必须的,其他的以为是非必须包,就没导入!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值