1、首先创建一个存储过程,一个入参(String seqName),一个出参(Integer seqValue),其实这个就是获取下一个ID的值,因为在mysql中不支持sequence,于是写了个存储(函数)过程
- CREATE DEFINER=`root`@`localhost` FUNCTION `get_seq_nextval`(p_seqname varchar(50)) RETURNS int(11)
- begin
- /*
- 参数:
- seqname:序列名
- 返回值:
- 未知整数
- 功能
- 这个序列的当前序列值
- 创建人:蒋福龙
- 时间:2010-11-4
- */
- declare v_id integer;
- declare v_count integer;
- select count(id)into v_count from sys_seq where seq_name=p_seqname;
- if v_count =0 then
- insert into sys_seq(id,seq_name) values(1,p_seqname);
- set v_id=1;
- else
- update sys_seq set id=id+1 where seq_name=p_seqname;
- select id into v_id from sys_seq where seq_name=p_seqname;
- end if;
- return v_id;
- end;
2、在SqlMap中
- <!-- 获取下一个sequence -->
- <parameterMap id="get_seq_nextval_map" class="java.util.Map">
- <parameter property="seqValue" javaType="int" jdbcType="INTEGER"
- mode="OUT" />
- <parameter property="seqName" javaType="string" jdbcType="VARCHAR"
- mode="IN" />
- </parameterMap>
- <procedure id="get_seq_nextval" parameterMap="get_seq_nextval_map">
- { ? = call get_seq_nextval(?) }
- </procedure>
注意上班的mode,IN表示入参,OUT标识出参,还有个INOUT。
注意:在SqlMap.xml文件中<parameterMap>中参数的顺序跟<Procedure>中”?”的顺序一致。
如:seqValue,seqName。对应{ ? = call get_seq_nextval(?) },一一对应就行了。
3、在java中
- public Integer get_seq_nextval(String string) throws SQLException {
- HashMap<String, Object> hm = new HashMap<String, Object>();
- hm.put("seqName", string);
- hm.put("seqValue",new Integer(1));
- super.find("get_seq_nextval", hm);
- Integer result = (Integer) hm.get("seqValue");//获取存储过程返回的值
- return result;
- }