ssh注解和缓存

155 阅读3分钟

Hibernate查询操作

HQL查询

Hibernate Query Language,面向对象查询语言。

SQL Strctor Query Language 结构化查询语言。

HQL和SQL语法结构是一致的,支持

select...
from...
where...
group by...
having...
order by...

HQL和SQL语法的不同

  • HQL使用类和属性名字、SQL使用表和字段名字
  • HQL中类和属性名是区分大小写的、SQL表和字段名不区分
  • HQL支持max、min、avg、count、sum分组函数,但不支持数据库日期、字符串等函数、也不支持sysdate、now()等关键字
  • HQL不支持select * 写法、支持select count(*),如果需要取所有记录可以省略select子句
  • HQL不支持join...on...写法中的on子句,需要使用关联映射

SQL: select * from NOTE
HQL: from Note

SQL: select context,publish_time from NOTE where ID=?
HQL: select context,publishTime from Note where id=?

Query query = session.createQuery(hql);

Criteria查询

条件查询,基于方法指定查询数据源、条件、排序等等。

Criteria ct = session.createCriteria(Note.class);

NativeSQL查询

原生SQL查询

SQLQuery sqlQuery = session.createSQLQuery(sql);

Hibernate注解应用

  1. 注解标记

    @Entity
    @Table
    @Id
    @GeneratedValue
    @Column

  2. 加载映射描述信息

    hibernate.cfg.xml中

    < mapping class="cn.xdl.entity.Note"/>

Hibernate特性

  1. 延迟加载

    数据在执行一些查询时,有些API方法具有延迟特性,执行完方法后并没有立刻发送SQL加载数据,而是在使用对象数据时才会发送SQL加载数据。

    session.load()//延迟机制=session.get()//立刻加载

    query.iterator()//延迟机制=query.list()//立刻加载

    关联映射查询操作//延迟机制

    延迟加载方法应用,经常会遇到下面问题。

    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    

    产生原因是:session关闭过早,导致发送SQL实例化失败

    请求-->Filter-->Action-->DAO(不关session)-->Result-->JSP(EL)-->关闭session

    方案:可以用Filter过滤器、拦截器、AOP技术实现控制session关闭。(OpenSessionInView方案) Spring框架提供了一个OpenSessionInViewFilter组件,可以回收session资源,支持延迟加载操作。(在web.xml配置即可)

    public void doFilter(){ chain.doFilter();//调用servlet/jsp //sessoin.close(); }

  2. 持久化

    在Hibernate框架中,实体对象会有三种存在状态。

    • 临时状态(Transient) new Xxx();

    • 持久状态 (Persistent) 跟session发生关联,load/get/save/update

      特点:垃圾回收器不能回收、对象属性信息可以更新数据库

      同步时机:session.flush(),tx.commit()内部会自动调用flush().

    • 游离状态 (Detached) 本来是持久状态,但是却调用了clear/evict/close方法

  3. 缓存(性能优化)

    • 一级缓存(自动启用)

      每个Session都有一个缓存区,被称为一级缓存区。生成周期跟着Session一致。缓存区是Session对象独享。

      优点:查询同一个对象多次,第一次查数据库,后续查缓存

      缓存和持久化关系:缓存中的对象具有持久化状态的。将对象从缓存移除,对象就变为游离。

      手动管理缓存的方法:evict()\clear()\close

    • 二级缓存

    • 查询缓存

Spring+Hibernate整合

HibernateTemplate

  1. 引入spring和hibernate开发包和配置文件

    参考示例中的
    pom.xml//jar包导入
    applicationContext.xml//spring配置文件
    hibernate.cfg.xml//hibernate配置文件

  2. 编写实体类和映射描述信息

    参考示例中Note.java

  3. 在Spring中配置HibernateTemplate组件

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
  4. 在Spring中配置SessionFactory组件

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <!-- 指定连接池 -->
    <property name="dataSource" ref="c3p0">
    </property>
    <!-- 指定hibernate.cfg.xml,删除数据库链接参数 -->
    <property name="configLocations" value="classpath:hibernate.cfg.xml">
    </property>
    
  5. 配置DataSource组件

    <bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="1234"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/studyonline?useUnicode=true&amp;characterEncoding=utf8"></property>
    </bean>
    
  6. 使用HibernateTemplate对象操作

    • find(hql,params)//执行hql
    • save
    • delete
    • update
    • load/get

    可以去编写NoteDao接口和实现类,将HibernateTemplate注入完成数据库操作

AOP事务管理

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 支持@Transactional -->
<tx:annotation-driven transaction-manager="txManager" 
    proxy-target-class="true"/>

在ListAction或DeleteAction追加@Transactional标记就可以了