hibernate实现分表

来源:互联网 发布:mac可以加硬盘吗 编辑:程序博客网 时间:2024/06/02 00:32

Hibernate实现分表处理,分表原理基于SQLInterceptor方式实现


import java.util.Date;import org.hibernate.Session;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.stereotype.Component;@Componentpublic class TestDAO {@Autowired@Qualifier("XXXXTemplate")private HibernateTemplate template;private SQLInterceptor interceptor = new SQLInterceptor("tableName");public void save(POJO entity){Session session = template.getSessionFactory().openSession(interceptor);/*分表策略:按月份对数据进行分割*/Integer yearMonth = Integer.parseInt(DateUtils.format(new Date(), "yyyyMM"));interceptor.setNewTable("tableName_"+yearMonth);session.save(entity);session.close();System.out.println("返回主键ID:" + entity.getId());}}
#HibernateSQL拦截器

import org.hibernate.EmptyInterceptor;public class SQLInterceptor extends EmptyInterceptor {private static final long serialVersionUID = 1637672155224242981L;public SQLInterceptor(String table) {this.table = table;}public String table;private String newTable;public void setNewTable(String newTable) {this.newTable = newTable;}@Overridepublic String onPrepareStatement(String sql) {if (StringUtils.isNotEmpty(table, newTable)) {sql = sql.replaceAll(table, newTable);}return super.onPrepareStatement(sql);}}

使用JDBC方式获取数据库表生成自增ID

private Integer insert(POJO entity, String table) throws SQLException {String insertSQL = "INSERT INTO " + table + " (XXXX)VALUES(?,?)";DataSource dataSource = SessionFactoryUtils.getDataSource(getHibernateTemplate().getSessionFactory());Connection connection = null;PreparedStatement pStatement = null;ResultSet resultSet = null;try {connection = dataSource.getConnection();pStatement = connection.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);//返回数据库生成自增IDpStatement.setInt(1, entity.getSId());pStatement.setInt(2, entity.getNum());pStatement.executeUpdate();resultSet = pStatement.getGeneratedKeys();if (resultSet.next()) {//获取数据库生成IDreturn resultSet.getInt(1);}} finally {//close()}return -1;}




1 0
原创粉丝点击