C0d3D3m0n

导航

Mybatis-Plus关于实体类型与数据库类型不匹配的问题

以JAVA List 与 Jdbc varchar为例
需在实体类的属性上加@TableField注解
例如:

@TableField(value = "user_name", typeHandler = StringListTypeHandler.class)
    private List<String> userName;

这样即可解决插入的问题,使用中会发现读取时还是无法正确匹配,由于mybatis-plus新增或者查询用的是两套映射,查询时workAddress是为null
需要再实体类在加上注解
@TableName(value = "user",autoResultMap = true)

更新,如果java类型为数组时,即使用了ArrayTypeHandler类型处理器,插入数据时还会导致Mysql报错:
java.sql.SQLException: Incorrect string value: '\xE6\x9D\xAD\xE5\xB7\x9E...' for xxx
网上搜了半天,只有插入emoji时的报错,解决方法是将字符集改为utf8mb4,但实际上mysql 8以上都会默认使用这个字符集;
后来想到的解决方案是:用一个工具方法即可完成对string[]类型到String字符串的转换

Map arrayHandler(Map map){
        for (Object key : map.keySet()) {
            if (map.get(key) instanceof String[]){
                String[] strings = (String[]) map.get(key);
                String string = Arrays.toString(strings);
                string.replace("[", "");
                string.replace("]", "");
                map.put(key, string);
            }

        }
        return map;
    } 

再次插入则一切正常

posted on 2024-01-04 14:59  C0d3D3m0n  阅读(224)  评论(0编辑  收藏  举报