- 需求:表中的主鍵id是字符串類型的,要實現主鍵自增就需要用這這個函數啦。
首先要創建table_sequence表
CREATE TABLE `table_sequence` (
`sequence_names` varchar(50) NOT NULL, -- 序列名稱
`current_value` bigint(50) NOT NULL, -- 當前值
`increment` int(1) NOT NULL, -- 步長(跨度)
PRIMARY KEY (`sequence_names`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sequence_names:代表主鍵自增的那張表名
current_value:代表當前主鍵的值,只能是數字類型,如果要帶字母的主鍵,需要自己再代碼中拼接
increment:代表每次自增的步長
下面需要創建兩個函數
1.獲取當前主鍵值
DELIMITER $$
USE `數據庫名字`$$
DROP FUNCTION IF EXISTS `currval`$$
CREATE FUNCTION `currval`(`sequence_name` VARCHAR(50)) RETURNS BIGINT(50)
BEGIN
DECLARE seq_current BIGINT(40);
SET seq_current = 0;
SELECT t.current_value INTO seq_current FROM table_sequence t WHERE t.sequence_names = sequence_name;
RETURN seq_current;
END$$
DELIMITER ;
2.獲取下一個自增主鍵值
DELIMITER $$
USE `數據庫名字`$$
DROP FUNCTION IF EXISTS `nextval`$$
CREATE FUNCTION `nextval`(`sequence_name` VARCHAR(50)) RETURNS BIGINT(50)
BEGIN
DECLARE seq_current BIGINT(20);
DECLARE seq_increment INT(1);
SET seq_current = 0;
SET seq_increment = 0;
SELECT current_value INTO seq_current FROM table_sequence WHERE sequence_names=sequence_name FOR UPDATE;
SELECT increment INTO seq_increment FROM table_sequence WHERE sequence_names=sequence_name FOR UPDATE;
UPDATE table_sequence SET current_value=seq_current+seq_increment WHERE sequence_names=sequence_name;
SET seq_current = seq_current + seq_increment;
RETURN seq_current;
END$$
DELIMITER ;
創建了兩個自定義函數
下面是java代碼部分
創建一個SequenceMapper.java的接口
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SequenceMapper {
/**
* 獲取下一個主鍵值
*/
String queryNextSequence(@Param("seq_table_name") String seq_table_name);
/**
* 獲取當前主鍵值SequenceMapper.xml
*/
String queryCurSequence(@Param("seq_table_name") String seq_table_name);
}
創建一個SequenceMapper.xml
<?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="com.dowin.miniapp_admin.mapper.SequenceMapper">
<select id="queryNextSequence" resultType="java.lang.String">
select
nextval(#{seq_table_name})
</select>
<select id="queryCurSequence" resultType="java.lang.String">
select
currval(#{seq_table_name})
</select>
</mapper>
到此代碼就結束了!!!
下面就是調用寫的接口啦
1.先注入bean
@Resource
private SequenceMapper sequenceMapper;
2.調用接口
td_b_house_ad是表名
String curId = sequenceMapper.queryCurSequence("td_b_house_ad");
String nextId = sequenceMapper.queryNextSequence("td_b_house_ad");