springjdbc处理nvarchar

发布时间 2023-08-14 17:38:40作者: 冰雪女娲

当我们使用spring-jdbc来做持久化时(注意不是spring-data-jbc),有时候一些特殊字符存入数据库时会用到nvarchar、nvarchar2这种类型(比如存放化学式,如CO₂等),默认会直接按照String类型来处理字段类型映射,如果要最终让使用ps.setNString这种,一般有几种办法。

  1. 当使用JdbcTemplate时,可以自己在参数列表中设置数据类型为-9(即java.sql.Types.NVARCHAR)即可
  2. 当使用NamedParameterJdbcTemplate时,入参可以使用SqlParameterValue来设置,同时设置类型为-9
  3. 当使用NamedParameterJdbcTemplate,入参是Bean时,可以创建一个类,继承
    BeanPropertySqlParameterSource、然后定义一个注解,在需要nvarchar处理的字段上加上改注解。然后就可以直接使用,比如
    namedParameterJdbcTemplate.update(sql, new CustomerBeanPropertySqlParameterSource(...))
  4. import org.apache.commons.lang3.reflect.FieldUtils;
    import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
    
    import java.sql.Types;
    
    public class CustomerBeanPropertySqlParameterSource extends BeanPropertySqlParameterSource {
    
        public CustomerBeanPropertySqlParameterSource(Object object) {
            super(object);
            FieldUtils.getFieldsListWithAnnotation(object.getClass(), NvarcharTypeHandler.class)
                    .forEach(field -> registerSqlType(field.getName(), Types.NVARCHAR));
        }
    }
    
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface NvarcharTypeHandler {
    }
    
    public class Demo{
       @NvarcharTypeHandler
       private String cont;  
    }