美文网首页
Hibernate之API

Hibernate之API

作者: 紫荆秋雪_文 | 来源:发表于2019-09-29 00:05 被阅读0次

一、Hibernate的API介绍

1、Configuration对象

Hibernate框架的配置对象,主要用于解析Hibernate配置文件和持久化映射文件中的信息,最重要的功能是用来创建SessionFactory对象(配置文件都要存放在classpath根路径)

  • 方式一:把所有的配置信息全部放在hibernate.cfg.xml文件中
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!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.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--数据库驱动类名-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        
        <!--数据库连接账户-->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernateDemo?useSSL=true&amp;serverTimezone=UTC</property>

        <!--数据库连接账户-->
        <property name="hibernate.connection.username">root</property>

        <!--数据库连接密码-->
        <property name="hibernate.connection.password">admin</property>

        <!--引用xml-->
        <mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>

    </session-factory>
</hibernate-configuration>
 //1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
  • 方法二:把基本配置信息全部放在hibernate.properties中,而在hibernate.cfg.xml文件中引入映射文件的配置
  • hibernate.properties
#数据库方言
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动类名
hibernate.connection.driver_class=com.mysql.jdbc.Driver
#数据库连接账户
hibernate.connection.url=jdbc:mysql:///hibernateDemo?useSSL=true&amp;serverTimezone=UTC
#数据库连接账户
hibernate.connection.username=root
#数据库连接密码
hibernate.connection.password=admin
  • hibernate.cfg.xml
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!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>
        <!--引用xml-->
        <mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>

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

2、SessionFactory对象

  • 1、负责创建Session对象
  • 2、数据库的连接信息是配置SessionFactory
  • 3、SessionFactory是线程安全的,Session是线程不安全的,SessionFactory的创建需要很大的系统开销,实际上在创建sessionFactory的时候才会去连接数据库,一般的,针对一个应用,一个数据库服务器,只需要一个SessionFactory实例就够了
  • 4、SessionFactory的创建session对象的重要方法:openSession和getCurrentSession
    • 4.1:openSession:这个方法代表开启一个全新的Session对象(测试环境使用)。
      • 4.1.1:全新的连接
      • 4.1.2:全新的事务
      • 4.1.3:全新的一级缓存。
    • 4.2:getCurrentSession:得到当前的上下文中的session,绑定当前线程(开发环境)。
      • 4.2.1:如果当前上下文中存在session,则使用该session
      • 4.2.2:如果当前上下文中不存在session,则使用openSession创建一个新的session
      • 4.2.3:要使用getCurrentSession,必须在hibernate.cfg.xml中配置
<property name="hibernate.current_session_context_class">thread</property>
  • 5、getCurrentSession得到的session是和事务绑定的(spring集成Hibernate的方式)
    • 5.1:无论是DML还是DQL,都必须开启事务
    • 5.2:当事务提交的时候,session就关闭了,此时就不需要人为的调用session.close()

3、Session对象

  • 1、包含了操作数据的很多方法:save/update/delete/get/currentQuery/beginTransaction/getTransaction
  • 2、session不是线程安全的,所以session的最大生命周期,一个线程在web应用当中,一个session的最大生命周期request
  • 3、Session中有一个缓存,称为一级缓存。存放当前工作单元加载的对象。在一个session的生命周期之内,连续拿到相同类型,相同ID的对象,只会发送一次SQL
  • 4、一级缓存能提高一定的性能,但是有限
  • 5、session加载出来的对象,都存放于一级缓存中进行管理
  • 6、清除一级缓存的方法
    • 6.1:clear():清空一级缓存所有对象
    • 6.2:evict(Object obj):从一级缓存中清除指定的对象

Session分析一级缓存

在一个session的生命周期之内,连续拿到相同类型,相同ID的对象,只会发送一次SQL

  • 设置显示SQL语句(hibernate.properties)
#数据库方言
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动类名
hibernate.connection.driver_class=com.mysql.jdbc.Driver
#数据库连接账户
hibernate.connection.url=jdbc:mysql:///hibernateDemo?useSSL=true&serverTimezone=UTC
#数据库连接账户
hibernate.connection.username=root
#数据库连接密码
hibernate.connection.password=admin
#配置getCurrentSession
hibernate.current_session_context_class=thread
#显示SQL语句
hibernate.show_sql=true
#格式化显示SQL语句
hibernate.format_sql=true
  • 获取id=1时
    @Override
    public User get(Long id) {
        //4、获取Session
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        //5、具体的查询操作
        User user = (User) session.get(User.class, 1L);
        session.getTransaction().commit();
        return user;
    }
  • 打印SQL语句
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
  • 获取id=1L、id=3L时
    @Override
    public User get(Long id) {
        //4、获取Session
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        //5、具体的查询操作
        User user = (User) session.get(User.class, 1L);
        User user1 = (User) session.get(User.class, 3L);
        session.getTransaction().commit();
        return user;
    }
  • 打印SQL语句
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
  • 获取id=1L、id=1L时:
    @Override
    public User get(Long id) {
        //4、获取Session
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        //5、具体的查询操作
        User user = (User) session.get(User.class, 1L);
        User user1 = (User) session.get(User.class, 1L);
        session.getTransaction().commit();
        return user;
    }
  • 打印SQL语句
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
Session缓存.png
  • clear清除一级缓存中所有对象的缓存
    public User get(Long id) {
        //4、获取Session
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        //5、具体的查询操作
        User user = (User) session.get(User.class, 1L);

        //清除一级缓存中所有的缓存
        session.clear();

        User user1 = (User) session.get(User.class, 1L);
        session.getTransaction().commit();
        return user;
    }
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
  • evict:从一级缓存中清除指定对象的缓存
    public User get(Long id) {
        //4、获取Session
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        //5、具体的查询操作
        User user = (User) session.get(User.class, 1L);

        //清除一级缓存中所有的缓存
        session.evict(user);

        User user1 = (User) session.get(User.class, 1L);
        session.getTransaction().commit();
        return user;
    }
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?

4、Transaction对象:代表对象事务的封装

  • 1、session.beginTransaction() 设置当前事务为活动状态
  • 2、session.getTransaction() 得到当前sessin上面已经活动的事务状态。注意,在调用这个方法之前必须调用beginTransaction()方法;该方法得到的对象永远不会为空
  • 3、session.getTransaction().commit():提交事务
  • 4、session.getTransaction().rollback():回滚事务

5、Query查询

    @Override
    public void queryList(String hql) {
        Session session = HibernateUtil.getHibernateSession();
        Query query = session.createQuery(hql);
        query.setString(0, "%西夏%");
        query.setLong(1, 1L);
        query.setLong(2, 10L);
        List<User> list = query.list();

        for (User user : list) {
            System.out.println(user);
        }
    }

6、Criteria查询

    @Override
    public void criteriaList() {
        Session session = HibernateUtil.getHibernateSession();

        Criteria criteria = session.createCriteria(User.class);
        //设置约束条件
        criteria.add(Restrictions.like("name", "西夏", MatchMode.ANYWHERE));
        criteria.add(Restrictions.between("id", 1L, 10L));
        List<User> list = criteria.list();

        for (User user : list) {
            System.out.println(user);
        }
    }

相关文章

  • Hibernate之API

    一、Hibernate的API介绍 1、Configuration对象 Hibernate框架的配置对象,主要用于...

  • Hibernate从入门到应用

    Hibernate API简介 Hibernate API对 JDBC API 进行封装,提供面向对象的数据库访问...

  • Hibernate

    hibernate简介Hibernatehibernate简介hibernate快速入门session查询api实...

  • Hibernater学习笔记(二)

    hibernate核心api 1.Configuration 在src下面找名称为hibernate.cfg.xm...

  • spring——@Transactional为啥不生效

    Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Jav...

  • hibernate

    介绍 hibernate配置文件说明 基本使用代码一 基本使用代码二 API 持久化类的状态 Hibernate的...

  • Hibernate入门(二)之相关API

    Configuration 配置对象. Configuration主要用于Hibernate框架加载核心配置文件和...

  • Hibernate核心API

    一、session session可以理解为操作数据库的对象session的特点:线程不安全 1、把对象保存在关系...

  • hibernate查询API

    查询表里面的所有记录 1、通过Query对象查询 2、通过criteria对象查询 3、通过SQLQuery对象实现

  • hibernate中API

    Configuration 功能:配置加载类,用于加载主配置,orm元数据的加载 创建对象Configuratio...

网友评论

      本文标题:Hibernate之API

      本文链接:https://www.haomeiwen.com/subject/ifoluctx.html