1. 程式人生 > >藉助一個數據庫表來維護主鍵(mybatis呼叫儲存過程)

藉助一個數據庫表來維護主鍵(mybatis呼叫儲存過程)

###建立主鍵表
CREATE TABLE c_table_key (
table_name varchar(50) NOT NULL COMMENT ‘需要建立主鍵的表名’,
last_key bigint(20) NOT NULL COMMENT ‘最後一次使用的主鍵,新的主鍵將在此基礎上累加’,
create_date_time datetime NOT NULL COMMENT ‘建立時間’,
update_date_time datetime NOT NULL COMMENT ‘更新時間’,
PRIMARY KEY (table_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘建立表主鍵時的參照資訊表名’;
###新建一個儲存過程
引數:IN table_name_in

varchar(50),IN sequence_count int,OUT d_sequence_value int

BEGIN
	START TRANSACTION;
	SELECT last_key INTO d_sequence_value FROM c_table_key WHERE table_name = table_name_in FOR UPDATE;
	IF(d_sequence_value IS NULL) THEN
		SET d_sequence_value = 1;
		-- 插入新主鍵
		INSERT INTO c_table_key (table_name, last_key,create_date_time,update_date_time) values(table_name_in, 1,NOW(),NOW());
	END IF;
		-- 更新表中主鍵
		UPDATE c_table_key SET last_key = d_sequence_value + sequence_count,update_date_time = NOW() WHERE last_key = d_sequence_value AND table_name = table_name_in;
	COMMIT;
END

###除錯
CALL getGeneratorId(‘aa’,‘1’,@cout);
SELECT @cout;

這裡寫圖片描述

###mybatis中儲存過程語句

CALL getGeneratorId(#{tableName,mode=IN,jdbcType=VARCHAR},#{tableCount,mode=IN,jdbcType=INTEGER},#{generatorId,mode=OUT,jdbcType=BIGINT});

###java中
void getGeneratorId(Map<String, Object> paramMap);

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public <T> long getLongGeneratorId(Class<T> doMain) {
        Map<String, Object> paramMap = new HashMap<>(3);
        paramMap.put("tableName", doMain.getAnnotation(Table.class).name());
        paramMap.put("generatorId", 0);
        paramMap.put("tableCount",1);
        cTableKeyMapper.getGeneratorId(paramMap);
        return(long) paramMap.get("generatorId");
    }