Spring-boot & mybatis & mysql - java.sql.SQLException: Incorrect integer value: 'string_value' for column 'column_name' at row 1
Error using Enum Type in Spring-boot, Mysql, Mybatis environment.
Incorrect integer value: 'string_value' for column 'column_name' at row 1
Java Person class
public class Person {
private int id;
private String name;
private AgeType age;
private String email;
}
public enum AgeType
{
One(1, "일"),
Two(2, "이"),
Three(3, "삼"),
Four(4, "사"),
Five(5, "오");
}
Mysql DB Person table
+-----------------------+
| Tables_in_spring-boot |
+-----------------------+
| Person |
+-----------------------+
1 row in set (0.01 sec)
mysql> desc Person;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| age | int | NO | | NULL | |
| email | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
위와 같이 JAVA Person Class, age property가 Enum AgeType 이고
MySql Person Table의 age field가 int Type 일때.
정상적으로 타입 변환이 되지 않습니다.
이런 경우 MyBastis TypeHandler를 재정의 해야 합니다.
자세한 내용은 아래 mybatis.org 사이트를 참고하세요.
typeHandlers
Whenever MyBatis sets a parameter on a PreparedStatement or retrieves a value from a ResultSet, a TypeHandler is used to retrieve the value in a means appropriate to the Java type. The following table describes the default TypeHandlers.
NOTE Since version 3.4.5, MyBatis supports JSR-310 (Date and Time API) by default.
You can override the type handlers or create your own to deal with unsupported or non-standard types. To do so, implement the interface org.apache.ibatis.type.TypeHandler
or extend the convenience class org.apache.ibatis.type.BaseTypeHandler
and optionally map it to a JDBC type. For example:
홈페이지 내용을 읽어 보면 org.apache.ibatis.type.TypeHandler 인터페이스를 구현하거나 org.apache.ibatis.type.BaseTypeHandler abstract class를 확장 해야 한다고 써있습니다.
그리고 새로 정의한 TypeHandler를 MyBatis TypeHandlers에 추가해주면 됩니다.
영어를 잘은 모르지만.
Handling Enums 섹션을 보면 Enum Type을 이용하기 위해 준비된 EnumTypeHandler 와 EnumOrdinalTypeHandler이 이미 준비되어 있습니다.
DB Enum Type의 정수 값을 처리하기 위해서는 EnumOrdinalTypeHandler를 사용하면 되는 것 같습니다.
다만 Enum의 orinal (서수 번호)를 사용하지 않고 특정 값을 이용할 때는 BaseTypeHandler를 상속 받아서 처리하면 될 것 같습니다.
예제가 필요하신 분들은 구현을 해 놓은 블로그 참고 하시면 될 것 같습니다.
댓글
댓글 쓰기