公司项目有一张表的数据量特别大、而且时间越长累积的数据量就越大、

后来DBA决定分表来解决性能问题、

分表是指   一个母体表  一群子表(结构和字段与母体表完全一样) 我们程序对母表操作其实就是对子表操作、让其无法感知有分表这个动作、

而使用hibernate如何分表呢?

难道我要写N个子表类Domain吗?那累屎我算了、

呵呵、我们这里需要hibernate一个拦截器类  org.hibernate.EmptyInterceptor

这个拦截器做了什么呢?

hibernate最终会将我们写的HQL语句转换成SQL语句、而当转换SQL且没放如数据库执行的时候、被拦截器就拦住啦、我们就可以偷偷的"使坏"啦、

我们需要一个自己的类来继承org.hibernate.EmptyInterceptor

package cn.test;

import org.hibernate.EmptyInterceptor;

public class MyInterceptor extends EmptyInterceptor {

	private String targetTableName;// 目标母表名
private String tempTableName;// 操作子表名 public MyInterceptor() {}//为其在spring好好利用 我们生成公用无参构造方法 public java.lang.String onPrepareStatement(java.lang.String sql) {
sql = sql.replaceAll(targetTableName, tempTableName);
return sql; } public String getTargetTableName() {
return targetTableName;
} public void setTargetTableName(String targetTableName) {
this.targetTableName = targetTableName;
} public String getTempTableName() {
return tempTableName;
} public void setTempTableName(String tempTableName) {
this.tempTableName = tempTableName;
} }

  

hibernate的session会获取吧?本文就不多做介绍了、

比如我们有个Test 实体类  对应的数据库的母表名称 为 test   而我们要保存到子表的 test_01要怎么做呢?

 public void saveTest(Test test){

    	SessionFactory sf = super.getHibernateTemplate().getSessionFactory();//获取session工厂

    	MyInterceptor interceptor = new MyInterceptor();//我们的拦截器

    	interceptor.setTargetTableName("test");//要拦截的目标表名

    	interceptor.setTempTableName("test_01");  //要替换的子表名

    	Session session = sf.openSession(interceptor);//当前的session使用这个拦截器

        try{

	        Transaction tx =  session.beginTransaction();//获取事务
tx.begin();//开启事务
session.saveOrUpdate(test);//保存和更新
tx.commit();//提交 }catch(Exception e){
e.printStackTrace();
}finally{
session.close();
} }

  

这样就能把信息存到子表test_01里啦、而且根本没人察觉我们的"使坏"、hibernate还老老实实的本份的做自己的工作呢、

CURD动作就这样被我们"使坏"着、

那我们总是new 出来 我们的拦截器 多么费劲啊、如果我还需要其他的地方还需要分表的地方、难道我还要再次new出来给多个地方用?

这样我们就在spring里多加一个bean 指向我们的class类

  1. <bean id="MyInterceptor" class="cn.test.MyInterceptor"/>

然后拦截器从spring拿就可以了、在setter进去目标表名和替换表名、

我们项目是web.xml加载了一个实现ApplicationContextAware类的一个类

static 的 ApplicationContext applicationContext  从里面getBean 就能拿到了

这样就ok啦、

使用hibernate 分表做增删改查的更多相关文章

  1. hibernate对单表的增删改查

    ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...

  2. django模型层 关于单表的增删改查

    关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  3. Mysql数据表的增删改查

    ---恢复内容开始--- Mysql数据表的增删改查 1.创建表   语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...

  4. MySQL数据库之表的增删改查

    目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...

  5. MyBatis-单表的增删改查(CRUD)操作

          在学习MyBatis的单表的增删改查操作之前,还是再次熟悉下MyBatis这个框架,只有对其熟悉的情况下,才能很好的使用,灵活的开发.         MyBatis优点:         ...

  6. day 57 data 插件 表的增删改查

    一 data的含义 在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值.      1 .data(key, value):     描述:在匹配 ...

  7. Hibernate5笔记2--单表的增删改查操作

    单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...

  8. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  9. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

随机推荐

  1. C语言函数qsort的使用方法

    qsort函数stdlib.h文件中,函数原型为 void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,co ...

  2. 学习head first python一书用到的程序(安卓开发/GAE)

    学习head first python一书用到的程序资料等文件 包括源码.电子书.一些安卓开发.gae开发程序文件,一些程序比较老,都不好找了(找了很久才收集齐),所以发上来,留给需要的人吧. 包括: ...

  3. div 居中CSS实现

    .login-box { position: absolute; border: solid #E3EAE7 1px; top: 50%; left: 50%; margin: -100px 0 0 ...

  4. Sentinel-1雷达数据可以免费下载

    The Sentinel-1 Scientific Data Hub(https://scihub.esa.int )网站提供免费下载 Sentinel-1雷达数据Level-0 和 Level-1级 ...

  5. Android客户端与服务器交互中的token

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...

  6. 读懂系统负载(Load Avg)的含义 | Devops

    有过运维Linux服务器的选手,想必对于系统平均负载(load averages)参数不会陌生吧,我们可以通过top, htop, uptime这些命令找到它们(如下图),那么我们又改如何理解它们呢, ...

  7. 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX

    微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙

  8. Controller中获取输入参数注解使用总结

    1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...

  9. 飘逸的python - 赛程表算法

    最近德甲英超西甲各大联赛重燃战火,想起之前写过的一段生成赛程表的代码,用python来写这类东西太舒服了. 这个算法叫做蛇环算法. 即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其 ...

  10. bootstrap注意事项(一)

    1.移动设备优先 移动设备优先是 Bootstrap 3 的最显著的变化. 在之前的 Bootstrap 版本中(直到 2.x),您需要手动引用另一个 CSS,才能让整个项目友好的支持移动设备. 现在 ...