我在MySQL中有一个表格如下:
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
中有三个版本:id
,phone
,createTime
。现在我可以在致电id
后获得insertRecord
,但我也想获得createTime
。
我已经浏览了Mybatis上的documents。它提到我可以向createTime
和keyProperty
添加多个属性名称(例如keyColumn
)。
keyProperty(仅限插入和更新)标识MyBatis将设置getGeneratedKeys或insert语句的selectKey子元素返回的键值的属性。默认值:未设置。如果需要多个生成的列,则可以以逗号分隔的属性名称列表。
keyColumn(仅限插入和更新)使用生成的密钥设置表中列的名称。仅当键列不是表中的第一列时,才需要在某些数据库(如PostgreSQL)中使用此选项。如果需要多个生成的列,则可以以逗号分隔的列名列表。
我不清楚逗号分隔的属性/列名称列表的含义。我已经尝试过keyProperty =“id,createTime”但它似乎没有用。
感谢。
答案 0 :(得分:1)
如果keyProperty="id, createTime"
是代码中的副本,则清除逗号后面的空格。无论如何,它可能不是(唯一的)罪魁祸首。
我猜auto_increment内部操作就像一个序列。而CURRENT_TIMESTAMP是一个函数。 然后你可以检查多个keyProperty支持行为:为了测试目的,你可以添加另一个列(auto_increment,serial?),以便检查你是否可以获得生成的密钥。
来自Insert的值似乎是PostgreSQL allows RETURNING,但我还没有找到MySQL中的等价物。
您执行单个多行插入语句,CURRENT_TIMESTAMP的行为如何?是否为所有记录插入了完全相同的时间戳?或者价值在变化?这可以在插入大量记录时观察到,这将花费超过1秒。
为什么不自己插入时间戳?只是批量插入而不是多行插入,迭代java中的列表,会话必须使用ExecutorTYPE.REUSE
只准备一次语句。
for(PhoneModel model : list) {
model.setCreateTime(new Date());
mapper.insertRecord(model);
}