公司项目有一张表的数据量特别大、而且时间越长累积的数据量就越大、
后来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;
- }
- }
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();
- }
- }
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"/>
<bean id="MyInterceptor" class="cn.test.MyInterceptor"/>
然后拦截器从spring拿就可以了、在setter进去目标表名和替换表名、
我们项目是web.xml加载了一个实现ApplicationContextAware类的一个类
static 的 ApplicationContext applicationContext 从里面getBean 就能拿到了
这样就ok啦、
相关推荐
ShardingJDBC与Mybatis-Plus的结合使用,可以通过Mybatis-Plus的API进行数据的增删改查操作。在Mybatis-Plus的实体类和Mapper接口中,无需关心分片规则,ShardingJDBC会在底层自动处理。 五、总结 通过本示例,...
4. **强大的SQL解析能力**:除了基本的增删改查外,还支持复杂的SQL操作,例如聚合、分组、排序、limit、or等,并且支持BindingTable以及笛卡尔积表查询。 5. **高性能**:经过严格的性能测试,Sharding-JDBC在单...
增删改查操作(CRUD)均通过Session执行,如`save()`, `update()`, `delete()` 和 `get()`。 4. 查询:使用Criteria API或者HQL进行查询。Criteria API是类型安全的,而HQL更接近SQL,允许进行复杂的查询操作。 三...
在数据操作方面,课程会涵盖Session和Transaction的使用,包括增删改查(CRUD)操作,以及HQL(Hibernate Query Language)和Criteria API,这是两种在Hibernate中进行查询的方式。HQL是面向对象的查询语言,而...
增删改查,读写分离,分库分表 *.通用缓存,方法级别缓存,数据级缓存(内部自动解决缓存穿透,击穿,雪崩问题) *.配置热更新 *.分布式锁,乐观锁 *.数据源监控,运行状态查询,错误日志查询 源码地址:github....
3. 题库管理模块:存储和管理各类试题,支持不同题型(如选择题、填空题、简答题等),并具备试题的增删改查功能。 4. 考试执行模块:考生在指定时间内完成在线考试,系统实时计算得分,并确保考试过程的公正性,...
项目中通常应用于数据操作,如数据库的增删改查,确保数据一致性。 6. Oracle分页查询可使用ROWNUM配合子查询或游标实现,例如SELECT * FROM (SELECT T.*, ROWNUM RN FROM (SELECT ...) T WHERE ROWNUM ) WHERE RN ...
在“extjs-java-mysql通用后台”这个项目中,开发者通常会定义一系列RESTful API接口,这些接口由Java Spring处理,EXTJS前端通过AJAX调用这些接口,实现数据的增删改查和页面的动态更新。同时,为了保证系统的安全...
此功能涉及数据的增删改查操作以及事务处理,确保操作的原子性和一致性。 5. **用户系统**:论坛系统通常包含用户注册、登录、个人信息管理等功能。用户身份验证可能通过密码加密、验证码、OAuth等方式实现,个人...
JDBC则是Java访问数据库的标准接口,负责数据的增删改查操作。Spring框架提供了依赖注入、AOP(面向切面编程)等功能,提高了代码的可维护性和解耦性。Hibernate和MyBatis作为ORM(对象关系映射)工具,简化了数据库...
通过SQL语句,开发者可以进行数据的增删改查操作。 6. **框架集成**:为了提高开发效率和代码质量,通常会采用Spring、Struts或Hibernate等框架。Spring提供依赖注入和AOP(面向切面编程),Struts处理请求和视图的...
- SQL语言基础:增删改查操作,索引优化,事务处理。 - JPA/Hibernate:对象关系映射,实体管理,查询语句的编写。 - 分库分表、读写分离、缓存策略:如何在项目中实现高性能数据访问。 9. **网络编程** - TCP/...
- **数据库访问**:学会使用JDBC或ORM框架(如Hibernate、MyBatis)来实现对数据库的操作,如增删改查等基本操作。 - **前端技术**:掌握HTML、CSS、JavaScript等前端技术,了解如何使用这些技术构建交互式的Web应用...
- SQL语句:DML(增删改查)、DDL(表的创建与修改)、索引、事务操作。 - JPA或Hibernate:ORM(对象关系映射)理解,实体类与数据库表的映射。 - 分布式数据库:主从复制、读写分离、分库分表策略。 7. **网络...
3. **Hibernate**:作为持久层框架,简化了数据库操作,通过ORM(对象关系映射)将Java对象与数据库表对应,实现数据的增删改查。 ### 数据库设计 网上订餐系统需要一个数据库来存储菜品信息、用户信息、订单状态等...
1. 新闻管理模块:这是系统的核心,负责新闻的增删改查操作。管理员可以通过此模块发布新的旅游新闻,更新现有新闻,或者删除过期或不再需要的新闻。 2. 用户界面模块:提供用户友好的交互界面,使用户可以轻松浏览...
在线考试系统需要存储大量的试题、用户信息、考试记录等,通过JDBC可以连接到MySQL、Oracle等数据库,执行SQL语句进行数据的增删改查。 4. **框架应用**: 在实际开发中,通常会使用Spring Boot或Struts等Web框架来...
1. **员工管理**:包括员工基本信息录入、修改、查询,以及员工档案管理等功能,涉及到数据的增删查改操作,可通过Hibernate进行数据库交互。 2. **招聘管理**:记录招聘职位、应聘者信息,支持发布招聘信息,跟踪...
开发者可以通过SQL语句进行数据的增、删、改、查操作。此外,Oracle还提供了事务处理、并发控制、备份恢复等一系列高级功能,确保数据的一致性和完整性。 三、Java与Oracle的协同工作 在手机管理系统中,Java与...