springjdbc处理nvarchar
当我们使用spring-jdbc来做持久化时(注意不是spring-data-jbc),有时候一些特殊字符存入数据库时会用到nvarchar、nvarchar2这种类型(比如存放化学式,如CO₂等),默认会直接按照String类型来处理字段类型映射,如果要最终让使用ps.setNString这种,一般有几种办法。
- 当使用JdbcTemplate时,可以自己在参数列表中设置数据类型为-9(即java.sql.Types.NVARCHAR)即可
- 当使用NamedParameterJdbcTemplate时,入参可以使用SqlParameterValue来设置,同时设置类型为-9
- 当使用NamedParameterJdbcTemplate,入参是Bean时,可以创建一个类,继承
BeanPropertySqlParameterSource、然后定义一个注解,在需要nvarchar处理的字段上加上改注解。然后就可以直接使用,比如namedParameterJdbcTemplate.update(sql, new CustomerBeanPropertySqlParameterSource(...))
-
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; }
- 对于使用mybatis来说,参数的jdbcType指定为NVARCHAR即可,(要注意版本,3.5以上应该没问题)