藉助一個數據庫表來維護主鍵(mybatis呼叫儲存過程)
阿新 • • 發佈:2018-11-11
###建立主鍵表
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
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"); }