MyBatis+Mysql生成序列号

本文介绍了一个基于数据库的序列生成方案,包括创建序列表、存储过程、Java实体与DAO层实现,以及MyBatis配置文件。该方案可用于生成唯一递增序列号。
一、创建序列表

CREATE TABLE `t_bas_sequence` (
  `seq_name` varchar(64) NOT NULL DEFAULT '' COMMENT '序列名',
  `current_val` bigint(20) DEFAULT '0' COMMENT '序列值',
  `increment_val` int(11) DEFAULT '1' COMMENT '步增值',
  PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

二、创建存储过程(函数)

CREATE DEFINER=`root`@`localhost` FUNCTION `nextval`(`v_seq_name` varchar(64),`count` int) RETURNS bigint(20)
BEGIN
  DECLARE val BIGINT;
  DECLARE increment int;
  set val = currval(v_seq_name),increment = 0;
  SELECT increment_val into increment from t_bas_sequence
  where seq_name = v_seq_name;
  UPDATE t_bas_sequence
  set current_val = current_val + increment_val*count
  where seq_name = v_seq_name;
	RETURN val+increment;
END

CREATE DEFINER=`root`@`localhost` FUNCTION `nextval`(`v_seq_name` varchar(64),`count` int) RETURNS bigint(20)
BEGIN
  DECLARE val BIGINT;
  DECLARE increment int;
  set val = currval(v_seq_name),increment = 0;
  SELECT increment_val into increment from t_bas_sequence
  where seq_name = v_seq_name;
  UPDATE t_bas_sequence
  set current_val = current_val + increment_val*count
  where seq_name = v_seq_name;
	RETURN val+increment;
END

三、Java实体代码

/**
 * 模块名称:系统序列实体类
 * 模块作者:WANGTAO
 * 开发时间:2016年10月9日 下午6:08:28
 * 模块路径:com.paireach.tts.module.basedata.common.dao.SequenceEntity
 * 更新记录:
 */
public class SequenceEntity {
	
	private String seqName ; // 序列名
	
	private String currentVal; // 序列值
	
	private String incrementVal; // 步增值

	public String getSeqName() {
		return seqName;
	}

	public void setSeqName(String seqName) {
		this.seqName = seqName;
	}

	public String getCurrentVal() {
		return currentVal;
	}

	public void setCurrentVal(String currentVal) {
		this.currentVal = currentVal;
	}

	public String getIncrementVal() {
		return incrementVal;
	}

	public void setIncrementVal(String incrementVal) {
		this.incrementVal = incrementVal;
	}
	
}

四、JavaDAO代码

import java.util.List;

import com.didong.server.dubbo.api.bean.common.SequenceEntity;


/**
 * 模块名称:ServiceBaseDao
 * 功能列表:
 * 模块作者:WANGTAO
 * 开发时间:2016年7月15日 上午11:31:35
 * 模块路径:com.paireach.tts.module.basedata.common.dao.ServiceBaseDao
 * 更新记录:
 */
public interface IServiceBaseDao {	
	 /**
	  * 功能描述:判断序列是否存在
	  * 开发时间:2016年7月15日 上午11:33:59
	  * 更新记录:
	  * 返回数据:boolean
	  */
     public  boolean isExistSequence(String seqName);
     
     /**
      * 功能描述:如果count=1,那么返回序列的下一个步长的值
      * 开发时间:2016年7月15日 上午11:34:18
      * 更新记录:
      * 返回数据:long
      */
     public  long getNextValue(String seqName,int count);
     
     /**
      * 功能描述:根据序列名称及步长值,新增序列
      * 开发时间:2016年7月15日 上午11:34:34
      * 更新记录:
      * 返回数据:boolean
      */
     public boolean addNewSequence(String seqName,int step);
 	
 	/**
 	 * 功能描述:查询序列
 	 * 开发时间:2016年10月10日 上午9:56:42
 	 * 更新记录:
 	 * 返回数据:List<SequenceEntity>
 	 */
 	List<SequenceEntity> query(SequenceEntity sequence, int start, int limit);
 	
 	/**
 	 * 功能描述:查询序列记录数
 	 * 开发时间:2016年10月10日 上午9:58:16
 	 * 更新记录:
 	 * 返回数据:Long
 	 */
 	Long count(SequenceEntity sequence);
 	
 	/**
	 * 功能描述:根据序列名查询序列实体
	 * 开发时间:2016年10月10日 下午3:35:41
	 * 更新记录:
	 * 返回数据:SequenceEntity
	 */
 	SequenceEntity queryEntityBySeqName(String seqName);
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

import com.didong.manager.frame.core.stringRedis.RedisDataStringTemplate;
import com.didong.server.dubbo.api.bean.common.SequenceEntity;
import com.paireach.tts.module.basedata.common.dao.IServiceBaseDao;

@Repository("serviceBaseDao")
public class ServiceBaseDaoImpl extends SqlSessionDaoSupport implements IServiceBaseDao 
{
private final String REDIS_SEQ = "t_bas_sequence".toUpperCase();
	
	@Resource
	RedisDataStringTemplate redisDataCacheTemplate;
	
	
	@Override
	public boolean isExistSequence(String seqName)
	{
        int count = (int) this.getSqlSession().selectOne("service.selectSequenceByName", seqName);
		return count > 0;
	}

	@Override
	public long getNextValue(String seqName, int count)
	{
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("seqName", seqName);
		map.put("idCount", count);		
		return (long) this.getSqlSession().selectOne("service.selectNextIdBySeqName", map);
	}

	@Override
	public boolean addNewSequence(String seqName, int step)
	{
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("seqName", seqName);
		map.put("step", step);
        int rs = this.getSqlSession().insert("service.addNewSequence", map);
		return rs > 0;
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public List<SequenceEntity> query(SequenceEntity sequence, int start,
			int limit) {
		if(0 < limit) {
			RowBounds rowBounds = new RowBounds(start, limit);
			return (List<SequenceEntity>) getSqlSession().selectList("service.query", sequence, rowBounds);
		} else {
			return (List<SequenceEntity>) getSqlSession().selectList("service.query");
		}
	}

	@Override
	public Long count(SequenceEntity sequence) {
		return (Long) getSqlSession().selectOne("service.count", sequence);
	}

	@Override
	public SequenceEntity queryEntityBySeqName(String seqName) {
		return (SequenceEntity) getSqlSession().selectOne("service.queryEntityBySeqName", seqName);
	}
}

五、最后贴上MyBatis文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="service">
	
	<resultMap id="sequenceResultMap" type = "com.didong.server.dubbo.api.bean.common.SequenceEntity">
		<result property="seqName" column="seq_name"/>
        <result property="currentVal" column="current_val"/>
        <result property="incrementVal" column="increment_val"/>
	</resultMap>
	
	<sql id="select_param">
        MASTER.seq_name AS seq_name,
        MASTER.current_val AS current_val,
        MASTER.increment_val AS increment_val
	</sql>
	
	<sql id="queryWhere">
		<where>
            <if test="seqName != null and seqName != ''"> AND MASTER.seqName = #{seqName}</if>
            <if test="currentVal != null and currentVal != ''"> AND MASTER.currentVal = #{currentVal}</if>
            <if test="incrementVal != null and incrementVal != ''"> AND MASTER.incrementVal = #{incrementVal}</if>
		</where>
	</sql>
					   
	<select id="query" resultMap="sequenceResultMap" parameterType="com.didong.server.dubbo.api.bean.common.SequenceEntity" >
		SELECT <include refid="select_param"></include>
			FROM t_bas_sequence MASTER 
		<include refid="queryWhere"></include> 
	</select>
	
	<select id="count" parameterType="com.didong.server.dubbo.api.bean.common.SequenceEntity" resultType='Long'>
		SELECT COUNT(MASTER.seq_name) FROM t_bas_sequence MASTER 
		<include refid="queryWhere"/>
	</select>
	
	<select id="queryEntityBySeqName" resultMap="sequenceResultMap" parameterType="com.didong.server.dubbo.api.bean.common.SequenceEntity">
		SELECT <include refid="select_param"></include>
			FROM t_bas_sequence MASTER where seq_name = #{seqName}
	</select>
	
	<update id="update">
		update t_bas_sequence 
		<set> 
			<if test="currentVal !=null and currentVal !=''">current_val = #{currentVal,jdbcType=VARCHAR},</if>
			<if test="incrementVal !=null and incrementVal !=''">increment_val = #{incrementVal,jdbcType=VARCHAR},</if>
		</set>
		where seq_name = #{seqName}
	</update>
	
    <!-- 查询指定序列名是否存在 -->
    <select id="selectSequenceByName" parameterType="String" resultType="int">
		<![CDATA[    
			select count(*) from t_bas_sequence where seq_name=#{seqName}
		]]>
    </select>
    
    <!-- 新增序列 -->
    <insert id="addNewSequence" parameterType="java.util.Map">
		<![CDATA[    
			insert into t_bas_sequence(
				seq_name,
				increment_val)
				values(
					#{seqName},
				#{step}
			)
		]]>                   
    </insert>
    
    <!-- 根据序列名称获取序列的下一个值 -->
    <select id="selectNextIdBySeqName" parameterType="java.util.Map" resultType="long">
		<![CDATA[ 
			select nextval(#{seqName},#{idCount}) from dual 
		]]>
    </select>
	
</mapper>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值