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

后来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. java学习之文件基本操作

    一.File类 文件的创建 package file; import java.io.File; import java.io.IOException; public class CreateFile ...

  2. STL 统计vector容器中指定对象元素出现的次数:count()与count_if()算法

    1 统计vector向量中指定元素出现的次数:count()算法 利用STL通用算法统计vector向量中某个元素出现的次数:count()算法统计等于某个值的对象的个数. #include &quo ...

  3. iOS开发之GCD使用总结

    GCD是iOS的一种底层多线程机制,今天总结一下GCD的常用API和概念,希望对大家的学习起到帮助作用. GCD队列的概念 在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQu ...

  4. 【找规律】CodeForce #258 Problem A——Game With Sticks

    来源:点击打开链接 非常easy.找规律. 每去掉一个点,点的总数量就减去n+m-1,然后看谁最先减到没有点可减.就能够了. #include <iostream> #include &l ...

  5. Gulp插件汇总

    HTML&CSS autoprefixer - parse CSS and add vendor prefixes to rules by Can I Use. gulp-browser-sy ...

  6. ABCpdf.NET中Rect,Bottom,Height的关系

    因为项目需要新功能,要在一个图片的上下加上固定高度的白边如下图.项目中一直使用ABCpdf.NET处理图片,但我一直没有做这方面的功能,所以找来API参考做. 这个简单需求做的过程中出现了一些曲折,主 ...

  7. Git操作流水账

    一.关于Git Git是一个分布式版本控制/软件配置管理软件,原是Linux内核开发者林纳斯·托瓦兹(Linus Torvalds)为更好地管理Linux内核开发而设计. 二.Git的环境配置 2.1 ...

  8. C++关键字(1)——const

    1. const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰 ...

  9. poj2459 Treasure Exploration (闭包+二分)

    这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分 #include< ...

  10. 创建、更新、删除文档。 --- Mongodb权威指南阅读。

    插入文档: db.foo.insert({ "key" : "value"}); 使用insert插入一个数据,文档中如果没有_id 会自动给文档增加_id. ...