使用mybatis批量插入时报错

配置:

TDengine Server 3.4.2.8.community
taos-jdbcdriver 3.9.2
连接方式 WebSocket:jdbc:TAOS-WS://host:6041
驱动类 com.taosdata.jdbc.ws.WebSocketDriver
JDK 17

是不支持mybatis的占位?(INSERT INTO t (tbname, device_no, create_time, message) VALUES (?,?,?,?),(?,?,?,?)),得手动直接拼接真实值(INSERT INTO iot_log.original_packet_stb (tbname, device_no, create_time, message) VALUES (‘d_A’,‘devA’,1791475200000,‘m1’),(‘d_B’,‘devB’,1791475200001,‘m2’);)?

java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4
at com.taosdata.jdbc.ws.WSColumnPreparedStatement.columnBuffer(WSColumnPreparedStatement.java:1140)
at com.taosdata.jdbc.ws.WSColumnPreparedStatement.stageString(WSColumnPreparedStatement.java:231)

不是"不支持占位符",也不需要手拼真实值。 TDengine 支持参数绑定,而且官方推荐的形式正是把 tbname 当作绑定列:INSERT INTO stb (tbname, ...) VALUES (?,?,...)。

问题出在你用了多行占位符 VALUES (?,?,?,?),(?,?,?,?)——这个形态不对,列模式按列组织参数缓冲区:你的 SQL 有 4 个列名(tbname, device_no, create_time, message),缓冲区长度就是 4;两个 (?,?,?,?) 元组会摊出 8 个占位符,走到第二行第一个参数时索引为 4,正好越界。因此要修改成一条语句一行占位符。

可以参考官网上的 示例程序: