hibernate框架

hibernate简介

         是一个开放源代码的对象关系映射框架,它对jdbc进行了封装,提供了强大、高性能的对象关系型数据库的持久化服务。

         hibernate是能够实现ORM的框架,是一个优秀的java持久化解决方案,是当今主流的对象-关系映射ORM工具。

        理解持久化

                  瞬时状态:在程序运行的时候,有些程序数据被保存在内存中,当程序退出的时候,这些数据就不复存在了,这些数据的状态称为瞬时状态

                  持久状态:在使用一些软件的时候,有些数据在程序退出后,以文件或其他形式保存在了硬盘中,这些数据的状态称为持久状态。

                  持久化:就是将程序中数据的瞬时状态与持久化状态之间转换的机制。如将数据保存在文件或者数据库中以及从数据库中读取出来。

        ORM对象-关系映射

                  能在对象和关系型数据库之间进行数据转换的机制。如将关系型数据库中的表转换为面向对象编程的对象。

        在eclipse中配置hibernate

                 1下载和导入jar包加载hibernate类库和依赖库

                

               2 配置hibernate配置文件hibernate.cfg.xml:指定数据库连接信息和及其映射文件路径。

                

<hibernate-configuration>
<session-factory>
     <!-- 数据库方言 -->
    <property name="dialect">
        org.hibernate.dialect.Oracle9Dialect
    </property>
    <!-- 数据库URL -->
    <property name="connection.url">
        jdbc:oracle:thin:@localhost:1521:MYORCL
    </property>
    <!-- 数据库用户名 -->
    <property name="connection.username">accp</property>
    <!-- 数据库密码 -->
    <property name="connection.password">accp</property>
    <!-- 数据库JDBC驱动 -->
    <property name="connection.driver_class">
        oracle.jdbc.driver.OracleDriver
    </property>
    <property name="myeclipse.connection.profile">hjj</property>
    <!-- 表示是否 将运行期生成的sql输出到日志以供调试-->
    <property name="show_sql">true</property>
    <!-- 格式化输出sql -->
    <property name="format_sql">true</property>
    <!-- 与之对应的实体类配置文件 -->
    <mapping resource="entity/NewsUser.hbm.xml" />
</session-factory>
</hibernate-configuration>

                3。创建持久化类和映射文件。

                    

<hibernate-mapping>
    <class name="entity.NewsUser" table="NEWS_USER" schema="ACCP">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="10" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" length="20" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="20" not-null="true" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" length="100" />
        </property>
        <property name="USERTYPE" type="java.lang.Integer">
            <column name="USERTYPE" precision="5" scale="0" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

                4。创建hibernate连接工具类:hibernate主要接口和类。

        在hibernate中执行持久化操作步骤(增删改)

                1、读取并解析配置文件

                     Configuration  config=new Configuration().configure();

                2、读取并解析映射信息,创建SessionFactory:

                     SessionFactory factory=config.buildSessionFcatory();

                3、打开session:

                     this.session=factory.openSession();

                4、开始一个事务(增删改必须开启事务): 

                     tran=session.beginTransaction();

                5、持久化操作:

                     保存一个对象到数据库

                    this.session.save(对象);

                    修改数据库中的表的记录

                    this.session.update(对象);

                     删除数据库中的表的记录

                    this.session.delete(对象);

                6、提交事务

                    tran.commit;

                7、关闭session:

                   this.session.close();

       通过hibernate修改、删除数据库信息


NewsUser user=new NewsUser();
user.setUsername("admin");
user.setId(4);
user.setPassword("123");
user.setUsertype(1);
//通过session工厂创建session对象
Session session=HibernateSessionFactory.getSession();
//开启一个事务
Transaction transaction=session.beginTransaction();
//调用SESSION的save()方法增加
try{
session.save(user);
//调用session.update()方法修改
session.update(user);
//调用session.delete()方法删除
session.delete(user);
//提交事务
transaction.commit();
System.out.println("修改成功");
}catch(HibernateException e){
transaction.rollback();
}finally{

//关闭session
session.close();
}

 

        通过hibernate查询数据库

//通过session.creatgeQuery()方法查询数据库
        NewsUser user=new NewsUser();
        //编写HQL语句,并用?占位符
        String hqlString="from  NewsUser where username=?";
        Session session=HibernateSessionFactory.getSession();
        //调用session.creatgeQuery()方法
        Query query=session.createQuery(hqlString);
        //填充占位符,下标从0开始
        query.setString(0, "admin");
        //通过 query.list().iterator()方法获得结果集的迭代器
        Iterator iterator=query.list().iterator();
        //循环遍历结果集
        while(iterator.hasNext()){
            user=(NewsUser) iterator.next();
        }
        System.out.println(user.getUsername());
        session.close();

            模糊查询

     hibernate实体映射  

           1、在hibernate中的关系-对象映射就是把实体类与数据库中的表相对应,实现实体类中的属性与数据库中的表的字段一一对应。

           2、映射是按照持久化类的定义来创建的,而非表的定义。

     hibernate基础语义也就是核心接口

           1、configuration类负责管理配置文件信息,创建sessionFactory实例

              Configuration con=new configuration.configure();搜寻默认的配置文件

                                      =new configuration.configure(new file("url"));搜寻指定的配置文件

              sessionFactory sf =con.buildSessionFactory()

           2、sessionFactory类负责创建session实例

                 sessionFactory实例一旦创建,就被赋予配置信息。

                Session session=sf.openSession();

           3、session类 是持久层操作的基础,完成其save、update等方法完成持久层操作。

                 session.flush()清空缓存,在事务中不需要,提交事务和关闭session的时候自动清空

   hibernate事务管理

           1、hibernate是jdbc轻量级封装,本身不具备事务管理能力,将事务管理委托给最底层的jdbc或者jta

               在配置文件中指定委托jdbc事务管理

           <property name="hibernate.transaction.factory_class">

                   net.sf.hibernate.transaction.JDBC.........

          </property >

          基于jdbc的事物管理,由jdbc的connection实现,事务周期限于Connection生命周期

             Transaction tr=session.beginTransaction()

             tr.commit()提交事务

             tr.rollback()回滚事务。

          基于JTA(事务管理构架)的事务管理

             1、跨session生命周期

         事务管理的锁机制

             1、业务逻辑的实现过程中,往往需要保证数据访问的排他性,给我们选定的目标上所,保证其不会被其他程序修改

             2、分悲观锁和乐观锁

                悲观锁:指的是对数据被外界修改保持保守状态,在整个数据处理过程中,将数据处于锁定状态。

                hibernate的加锁模式

                       内部实现的锁1、LockMode.NONE 无锁机制  2、、LockMode.WRITE 在inser和update记录的时候自动获取 3、LockMode.READ 读取数据的时候自动获取 

                       外部使用      3、 LockMode.UPGRADE  利用数据库的for update子句上锁

                                        4。 LockMode.UPGRADE_NOWAIT  Oracle的特定实现,利用ORACLE的for update_NOWAIT子句实现上锁

                      加锁模式Query.setLockMode  Criteria.setLockMode Session.lock

                     例 Query query=session.createQuery(HQL);//上锁

                      query.setLockMode(user, LockMode.UPGRADE);

                      //必须在获取数据之前上锁

                      query.list()//执行、获取

                

    

 

                  

                 

                   

                       

                 

           

原文地址:https://www.cnblogs.com/hjiongjiong/p/4483504.html