hibernate实现分表后获取insert自增ID方法。

#第一种基于原生的JDBC的方式实现

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);
			pStatement.setInt(1, entity.getSId());
			pStatement.setInt(2, entity.getNum());
			pStatement.executeUpdate();
			resultSet = pStatement.getGeneratedKeys();
			if (resultSet.next()) {
				return resultSet.getInt(1);
			}
		} finally {
			if (resultSet != null) {
				resultSet.close();
				resultSet = null;
			}
			if (pStatement != null) {
				pStatement.close();
				pStatement = null;
			}
			if (connection != null) {
				connection.close();
				connection = null;
			}
		}
		return -1;
	}

#第二种 使用基于原生的Hibernate实现

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;

@Component
public 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;
	}

	@Override
	public String onPrepareStatement(String sql) {
		if (StringUtils.isNotEmpty(table, newTable)) {
			sql = sql.replaceAll(table, newTable);
		}
		return super.onPrepareStatement(sql);
	}

}

hibernate实现分表后获取insert自增ID方法。,布布扣,bubuko.com

时间: 2024-08-09 15:32:53

hibernate实现分表后获取insert自增ID方法。的相关文章

分库分表后如何部署上线?

引言 我们先来讲一个段子 面试官:"有并发的经验没?" 应聘者:"有一点." 面试官:"那你们为了处理并发,做了哪些优化?" 应聘者:"前后端分离啊,限流啊,分库分表啊.." 面试官:"谈谈分库分表吧?" 应聘者:"bala.bala.bala.." 面试官心理活动:这个仁兄讲的怎么这么像网上的博客抄的,容我再问问. 面试官:"你们分库分表后,如何部署上线的?" 应聘

mybatis如何成功插入后获取自增长的id

使用mybatis向数据库中插入一条记录,如何获取成功插入记录的自增长id呢? 需要向xml配置中加上一下两个配置: <insert id="add" useGeneratedKeys="true" keyProperty="id" parameterType="com.work.model.ScheduleInfoTable"> insert into scheduleInfo(title,content,tim

mysql清空表数据后如何让自增ID仍从1开始

mysql清空表数据后如何让自增ID仍从1开始?也就是说如何重排auto_increment 清空表时使用truncate命令,而不用delete命令 mysql> truncate test; 使用truncate命令的好处: 1).速度快 2).可以对自增ID进行重排,使自增ID仍从1开始计算   原文地址:https://www.cnblogs.com/superboblogs/p/9445318.html

Mysql获取最大自增ID(auto_increment)

在关系型数据库的表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都有一个唯一标识. 而实际应用中,获取到最近最大的ID值是必修课之一,针对于该问题,实践整理如下: 1.新建测试数据表get_max_id  mysql>CREATETABLE `get_max_id` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '业务主键', `content` char(25

[转]SQL三种获取自增长的ID方法

SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTITY 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域就是一个模块--存储过程.触发器.函数或批处理.因此,如果两个语句处于同一个存储过程.函数或批处理中,则它们位于相同的作用域中. IDENT_CURRENT  返回为任何会话和任何作用域中的指定表最后生成的标识值.这个函数需要一个以表名为值的变量,也就是说虽然不受会话和作用域的限制

mysql大数据分表后查询

当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度,举例说明: 1亿条数据,分100张表 1.首先创建100张表 $i=0;while($i<=99){echo "$newNumber \r\n";$sql="CREATE TABLE `code_".$i."` ( `full_code` char(10) NOT NULL, `create_time` int(10) unsigned NOT NULL, PRIMARY KEY 

根据MySQL表数据导出INSERT INTO语句的方法

因项目中有需要需根据MySQL表数据生成INSERT INTO语句,在网上找了些现成的代码,原作者是谁就不知道了,但是发现有BUG,不能适用,遂对他人代码进行了修改.修改后能较好的导出INSERT INTO语句.代码如下: package dwz.interaction; import java.io.*; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * Update by internetr

MYSQL如何获取系统自增id信息

1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变. 在多用户交替插入数据的情况下max(id)显然不能用.这时就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将

分表后 快速查询所有数据

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义. 假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份: [sql] view plain copy CREATE TABLE log_YY ( dt  DATETIME