美文网首页
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

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