2017-02-22 20 views
1

У меня есть таблица в MySQL, как показано ниже:Как получить значение поля, которое по умолчанию CURRENT_TIMESTAMP, в операторе вставки в MySQL с Mybatis

CREATE TABLE `mytable` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `phone` VARCHAR(128) NULL DEFAULT NULL, 
    `createTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=25 
; 

У меня есть картографа Mybatis, как показано ниже

@Mapper 
public interface MyMapper { 
    Integer insertRecord(List<PhoneModel> list); 
} 


<insert id="insertRecord" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
    insert into mytable(phone) values 
    <foreach item="item" index="index" collection="list" separator=","> 
     (#{item.phone}) 
    </foreach> 
</insert> 

В PhoneModel имеется 3 объекта: id, phone, createTime. Теперь я могу получить id после звонка insertRecord, но я хочу получить createTime.

Я прошел через documents на Mybatis. В нем упоминается, что я могу добавить несколько имен свойств (например, createTime) в keyProperty и keyColumn.

keyProperty (вставка и обновление только) Определяет свойство, в котором MyBatis будет установить значение ключа, возвращаемое getGeneratedKeys, или с помощью selectKey дочернего элемента оператора вставки. По умолчанию: unset. Может быть список имен свойств, разделенных запятыми, если ожидается несколько генерируемых столбцов.

keyColumn (только для вставки и обновления) Устанавливает имя столбца в таблице сгенерированным ключом. Это требуется только в некоторых базах данных (например, PostgreSQL), когда столбец ключей не является первым столбцом в таблице. Может быть список разделенных запятыми столбцов, если ожидается несколько генерируемых столбцов.

Я не ясно, о том, что разделенный запятыми список имен свойств/столбцов средства. Я пробовал keyProperty = "id, createTime", но он не работает.

Спасибо.

ответ

1

Если keyProperty="id, createTime" - это копия с вашего кода, затем очистите пространство после запятой. В любом случае, это может быть не только (единственный) преступник.

Я предполагаю, что auto_increment внутренне работает как последовательность. В то время как CURRENT_TIMESTAMP является функцией. Затем вы можете проверить поведение поддержки нескольких ключевых свойств: для целей тестирования вы можете добавить еще один столбец (auto_increment, serial?), Чтобы вы могли проверить, что вы можете получить сгенерированные ключи.

Кажется PostgreSQL allows RETURNING значение из Вставки, но я не нашел эквивалента в MySQL.

Вы выполняете инструкцию для вставки нескольких строк, как ведет себя CURRENT_TIMESTAMP? точно такая же временная метка вставлена ​​для всех записей? или значения меняются? это можно наблюдать при вставке большого количества записей, которые занимают более 1 секунды.

Почему бы вам не вставить временную метку самостоятельно? просто вставка вставки вместо многострочной вставки, итерация списка в java, сеанс должен использовать ExecutorTYPE.REUSE, чтобы подготовить инструкцию только один раз.

for(PhoneModel model : list) { 
    model.setCreateTime(new Date()); 
    mapper.insertRecord(model); 
}