hibernate 分表进行操作-Java-IT技术博客

hibernate 分表进行操作

时间:2019-12-09 17:15:09 浏览: 字体: 放大 缩小


在项目开发中,经常碰到表的数据量比较大的时候,一般采用的技术有分库分表的方法。在Hibernate 中怎样实现分表后进行增删改查的操作呢,可以采用继承EmptyInterceptor类,在方法onPrepareStatement中实现要替换的表名。因为要实现替换多个表名,这里用了map来保存要替换的表名,key表示要被替换的表名,value来表示替换后的表名。


package online.spider.hibernate;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.EmptyInterceptor;

public class MyInterceptor extends EmptyInterceptor {
	private Map<String, String> target;

	public MyInterceptor() {
		//在默认构造函数里写死要替换的表名
		//target = new HashMap<String, String>();
		//target.put("userInfo", "userInfo_01");//用userInfo_01替换表名userInfo
		//target.put("student", "student_02");//用student_02替换表名student
	}// 为其在spring好好利用 我们生成公用无参构造方法

	public java.lang.String onPrepareStatement(java.lang.String sql) {
		System.out.println(sql);
		if (null != target && target.size() > 0) {
		        //替换表名
			for (Map.Entry<String, String> entry : target.entrySet()) {
				sql = sql.replaceAll(entry.getKey(), entry.getValue());
			}
		}
		System.out.println(sql);
		return sql;

	}

	public Map<String, String> getTarget() {
		return target;
	}

	public void setTarget(Map<String, String> target) {
		this.target = target;
	}

}

写好EmptyInterceptor的拦截器后,我们在要用到session之前,先new一个对象EmptyInterceptor出来 ,把这个作参数放到openSession中去。

		MyInterceptor interceptor = new MyInterceptor();
		Map<String, String> target = new HashMap<String, String>();
		target.put("userInfo", "userInfo_01");//用userInfo_01替换表名userInfo
		target.put("student", "student_02");//用student_02替换表名student
		interceptor.setTarget(target);
		
		Session session = HibernateUtil.getSessionFactory().openSession(interceptor);
		Transaction tx = session.beginTransaction();

那么HQL怎么写呢,以前你们怎样写就怎样写,如下面

select count(id) from userInfo

其实已经查询 的是select count(id) from userInfo_01

标签: hibernate分表