`
liuguxing
  • 浏览: 94869 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate拦截SQL,动态改变表名

    博客分类:
  • JAVA
阅读更多
转:http://www.iteye.com/topic/866142
我参与的某项目出现了一个这样的需求。用户的每个月的数据库很大 >1000W。用户需要针对每个月做查询。为了加快用户的查询速度,这里打算按月分表存数据。怎么用hibernate实现这个功能呢。

比如,分出12个表,每个保存一个月的。每个表的字段是一模一样的。区别只是当用户查询时,要选择不同的表。如果配出12个持久化类来,这样的设计太死了。于是想到hibernate能不能自动根据时间先择要操作的表。

研究了一下还真行。
刚开始也看到别人说类似的需求,用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。

因为NamingStrategy只在Hibernate SessionFactory生成时调用一次,以后就不调用了。因此根本不可以在调用时通过它改变持久化类和表名的关系。

后来经过终于找到了:Interceptor
它是hibernate的拦截器。当用户操作数据库时,会把生成的sql先给Interceptor处理一下,然后再去执行。这正给了我修改sql的机会。

这样,只要做一个持久化类,和这12个表中的一个映射。然后做如下的拦截器:

具体实现如下:
Java代码
public class QueryResInterceptor extends EmptyInterceptor { 
          ... 
          
         public QueryResInterceptor(Date startTime, Date endTime){ 
          ... 
         }  
    public String onPrepareStatement(String sql) { 
        //根据用户的时间替换sql中的表名 
        return sql; 
    } 


这个拦截器,接收用户的查询时间做为构造参数。然后做为替换sql中表名的依据。

当我执行一个查询的hql时,hql是按映射的持久化类写的。用如下代码获得Session
Java代码
QueryResInterceptor  i=new QueryResInterceptor(...); 
Session sessoin=sessionFactory.openSession(i); 


这样再通过这个session执行hql时,表名就自动换成需要的实际表名了。
分享到:
评论

相关推荐

    spring hibernate实现动态替换表名(分表)的方法

    Spring Hibernate 实现动态替换表名(分表)的方法 ...通过使用 Hibernate 拦截器,我们可以轻松地实现动态替换表名,而无需修改已有的代码。这种方法简单、安全、可维护,非常适合大型项目中的数据库操作。

    hibernate实现动态表查询的多种解决方案

    通过实现`org.hibernate.event.spi.Interceptor`接口,可以自定义拦截器逻辑,比如修改SQL语句中的表名等。 3. **Session的开放性**:Hibernate的`Session`对象是高度可定制的,可以通过`SessionFactory`的配置参数...

    Hibernate 中文参考文档

    Hibernate是一个开放源代码的ORM框架,它允许Java开发人员将对象模型转换为关系数据库模型,从而避免了通常在使用JDBC时的手动SQL编写。通过提供数据持久化的解决方案,Hibernate提高了开发效率,降低了数据库访问的...

    hibernate-分表插件实现思路

    Hibernate的事件监听器或拦截器可以用来在执行SQL之前对其进行修改。 4. **事务管理**:在分表环境下,跨表的操作可能涉及到分布式事务。Spring的事务管理可以帮助我们在这种复杂环境中保持事务的一致性。 5. **...

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 ...在未来的学习中,还可以深入探索 Hibernate 的更多高级特性,如缓存机制、拦截器、事件监听等,以进一步提升应用程序的性能和扩展性。

    ORM hibernate。jar包

    9. **事件监听器和拦截器**:Hibernate允许自定义事件监听器或拦截器,对特定操作(如插入、更新、删除)进行扩展,实现个性化的业务逻辑。 10. **JPA集成**:Hibernate是Java Persistence API(JPA)的提供商之一...

    Hibernate3.2_帮助文档

    4. **注解驱动的映射**:Hibernate 3.2支持使用Java注解来声明实体类的属性与数据库字段的关系,如`@Entity`表示一个类是实体,`@Table`定义对应的表名,`@Id`标识主键,`@GeneratedValue`指定主键生成策略等。...

    hibernate-orm-3.2.zip

    Hibernate允许自定义事件监听器,对持久化操作(如保存、更新、删除、加载)进行拦截,实现一些自定义行为。 十、性能优化 包括批处理(Batch Processing)、预加载(Preloading)、连接池管理等,以提高整体系统...

    Hibernate-4.4.0版本核心jar包

    10. **事件和监听器**:Hibernate允许注册事件监听器,对持久化操作进行拦截,如在对象保存前进行某些预处理,或者在对象删除后执行清理任务。 综上所述,"Hibernate-4.4.0版本核心jar包"包含的库文件提供了完整的...

    hibernate4.1.2

    Hibernate是一个对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作,将Java类与数据库表进行映射,从而避免了繁琐的SQL代码编写。在Hibernate 4.1.2中,这一核心理念得到了强化。 1. **配置...

    BeetlSQL 2.10中文文档

    BeetSql是一个全面而强大的DAO工具,它融合了Hibernate与Mybatis的优点,特别适合那些认为SQL语言处于核心地位,同时也希望利用工具自动生成大量常用SQL的应用程序。 - **开发效率**: 使用BeetSql时,开发者无需...

    hibernate以及连接池

    3. Druid:阿里巴巴开源的数据库连接池,性能优秀且功能丰富,提供了监控、SQL解析、拦截器等功能。 4. HikariCP:目前被认为是最快的Java连接池,以其轻量级、高性能和低资源消耗著称,被许多大型项目所采用。 三...

    springmvc整合hibernate4

    接下来,Hibernate4 是一个强大的ORM工具,它允许开发者使用Java对象来操作数据库记录,而无需编写SQL。整合Hibernate4到SpringMVC项目中,我们需要: 1. 添加依赖:在`pom.xml`文件中添加SpringMVC和Hibernate4的...

    Hibernate中文参考文档 V3.2(HTML).zip

    10. **事件和监听器**: Hibernate允许自定义事件监听器,对对象的生命周期事件(如加载、保存、更新、删除)进行拦截处理。 11. **查询结果集转换**: Hibernate的`Transformer`类允许将查询结果转换为自定义的集合...

    hibernate-release-5.0.12.Final.rar

    通过Hibernate,开发者可以使用面向对象的方式来处理数据,而无需直接编写SQL语句,大大简化了数据库操作。 2. **版本5.0.12.Final亮点** Hibernate 5.0.12.Final是该系列的一个稳定版本,修复了一些已知问题,并...

    Hibernate3.0 api 帮助文档

    9. **事件监听器和拦截器**:Hibernate允许开发者通过实现特定接口或使用注解定义事件监听器和拦截器,以便在特定操作(如保存、加载、更新等)前后执行自定义逻辑。 10. **延迟加载(Lazy Loading)**:Hibernate...

    hibernate所使用的jar包

    6. **Criteria API**:除了HQL,Hibernate还提供了Criteria API,一种更动态的查询方式,可以避免硬编码SQL,提高代码的可读性和可维护性。 7. **Caching(缓存)**:为了提高性能,Hibernate支持二级缓存,可以...

    Struts_Hibernate API 文档 chm

    3. **Criteria API**: 提供了一种基于对象的查询方式,比SQL更面向对象,比如`org.hibernate.criterion.Criterion` 和 `org.hibernate.criterion.Restrictions`。 4. **HQL (Hibernate Query Language)**: 是...

    hibernate-release-5.2.11.Final.zip

    14. **拦截器(Interceptor)**:可以通过实现`org.hibernate.Interceptor`接口,自定义在对象生命周期中的行为。 在实际开发中,理解并熟练运用这些知识点,可以极大地提高Java应用程序的开发效率和数据库操作的...

    hibernate中文参考文档

    此外,Hibernate还提供了Criteria API和Criteria Builder,以更加面向对象的方式进行动态查询。 七、缓存机制 为了提高性能,Hibernate提供了缓存功能。一级缓存是Session级别的,自动管理对象的状态;二级缓存则是...

Global site tag (gtag.js) - Google Analytics