如何通过spring引导批处理JdbcBatchItemWriter()将java字符插入MariaDB字符(1)
我有一个列数据类型为CHAR(1)的表。现在,我需要将JavaChar值插入到该列中。这就是创建表的方式如何通过spring引导批处理JdbcBatchItemWriter()将java字符插入MariaDB字符(1),java,mariadb,spring-batch,Java,Mariadb,Spring Batch,我有一个列数据类型为CHAR(1)的表。现在,我需要将JavaChar值插入到该列中。这就是创建表的方式 CREATE TABLE db1.test_table ( user_id INT NOT NULL, user_status CHAR(1) NOT NULL, last_updated DATETIME, PRIMARY KEY (user_id) )ENGINE=InnoDB DEFAULT CHARSET=latin2; Java中的字符是一个UTF-16代码单元,
CREATE TABLE db1.test_table (
user_id INT NOT NULL,
user_status CHAR(1) NOT NULL,
last_updated DATETIME,
PRIMARY KEY (user_id)
)ENGINE=InnoDB DEFAULT CHARSET=latin2;
Java中的字符是一个UTF-16代码单元,因此这可能是一个问题,但我们如何解决这个问题呢。我在SpringBoot批处理应用程序中使用它,我在其中读取和写入数据库。显然,reader正在将数据库CHAR(1)值设置为Java CHAR,但JdbcBatchItemWriter抛出如下错误
Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'user_status' at row 1
这是我的ItemWriter()
JDBC驱动程序正在将
字符(1)
映射到字符串
,即使长度固定为1
我认为错误是因为JDBC驱动程序将
char
值视为一个数字,并将数字转换为字符串。该字符串有多个数字,因此对于CHAR(1)
列来说太长。有什么建议吗?@Thomson将值作为字符串提供给JDBC。将方法char getUserStatus()
更改为String getUserStatus()
,或者不要使用BeanPropertyItemSqlParameterSourceProvider
,以便在映射值时可以转换类型。我将方法从char更改为String,结果成功了。我从没想过这会奏效。非常感谢你!
@Bean
public JdbcBatchItemWriter<UserInfo> loadUserWriter() {
JdbcBatchItemWriter<UserInfo> writer = new JdbcBatchItemWriter<UserInfo>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
writer.setSql("INSERT INTO db1.test_table "
+ "(user_id, user_status, last_updated)"
+ "VALUES (:userId, :userStatus, NOW())");
writer.setDataSource(dataSource);
return writer;
}
public class UserInfo {
private int userId;
private char userStatus;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public char getUserStatus() {
return userStatus;
}
public void setUserStatus(char userStatus) {
this.userStatus = userStatus;
}
}