MyBatis+Mysql生成序列號
阿新 • • 發佈:2019-01-27
一、建立序列表
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>