使用hibernate 分表做增删改查
公司项目有一张表的数据量特别大、而且时间越长累积的数据量就越大、
后来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类
- <bean id="MyInterceptor" class="cn.test.MyInterceptor"/>
然后拦截器从spring拿就可以了、在setter进去目标表名和替换表名、
我们项目是web.xml加载了一个实现ApplicationContextAware类的一个类
static 的 ApplicationContext applicationContext 从里面getBean 就能拿到了
这样就ok啦、
使用hibernate 分表做增删改查的更多相关文章
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- django模型层 关于单表的增删改查
关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- Mysql数据表的增删改查
---恢复内容开始--- Mysql数据表的增删改查 1.创建表 语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...
- MySQL数据库之表的增删改查
目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...
- MyBatis-单表的增删改查(CRUD)操作
在学习MyBatis的单表的增删改查操作之前,还是再次熟悉下MyBatis这个框架,只有对其熟悉的情况下,才能很好的使用,灵活的开发. MyBatis优点: ...
- day 57 data 插件 表的增删改查
一 data的含义 在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值. 1 .data(key, value): 描述:在匹配 ...
- Hibernate5笔记2--单表的增删改查操作
单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...
- MVC学习-用EF做增删改查
在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
随机推荐
- 【grunt整合版】 30分钟学会使用grunt打包前端代码
grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...
- text-overflow: ellipsis;省略号颜色设置
参考stackoverfolow 想要给元素添加text-overflow: ellipsis;样式,必须保证改其父元素是块级元素,如果其是行级元素,可以通过设置display:block;或者dis ...
- VB2012读取xml
上回谢了生成写xml的,现在把读取的补上 文件如下 <?xml version="1.0" encoding="UTF-8" standalone=&qu ...
- IC卡
本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card).智慧卡(Intelligent ...
- java代码收藏:获取HttpServletRequest中某一前缀的参数
public static Map getParametersStartingWith(ServletRequest request, String prefix) { Enumeration par ...
- Unix/Linux环境C编程入门教程(20) 搭建基于Mac的 Xcode 与 QT 开发环境
1.启动 Vmware,如果没有 VMware 的同学,请看前面我们搭建 VMware 的视频 2.打开虚拟机以后,出现虚拟机界面 3 新建一个虚拟机 4 选择自定义,单击下一步 5 选择默认的 VM ...
- javascript第八课匿名函数的使用
window.onload=function(){ //当窗体载入完成之后执行方法里的内容 document.getElementById("html标签id").onclick= ...
- 使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库
本文转自CSDN博客,http://blog.csdn.net/helifengwell/archive/2010/08/18/5820434.aspx 1,先到Oracle站点下载Instant C ...
- protobuf使用错误总结
1>HelloWorldScene.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall LoginReqMessage ...
- 20160121--Spring
package com.hanqi; public class HelloWorld { public HelloWorld() { } public HelloWorld(String name) ...