1. 程式人生 > >MyBatis+Mysql生成序列號

MyBatis+Mysql生成序列號

一、建立序列表
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>