如何在MyBatis中使用n前缀插入NVARCHAR2数据(无需修改Tomcat配置)
在MyBatis中为NVARCHAR2列添加n前缀插入字符串的解决方案
针对你的需求,这里提供两种可靠的实现方式,解决旧字符集下存储€符号的问题:
方式1:使用字符串拼接绑定参数(安全无注入)
通过n'' || #{value}的方式拼接,Oracle会自动将绑定的参数识别为国家字符集类型,效果等效于目标SQL的n'value'格式:
<insert id="createOne" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> INSERT INTO table ( id, column ) VALUES ( FBK_SQ_PAGOPA_CREDITOR_INFO_ID.nextval, n'' || #{value} ) </insert>
方式2:指定MyBatis类型处理器
直接为参数指定NStringTypeHandler,MyBatis会自动为字符串参数添加n前缀,适配NVARCHAR2列的字符集要求:
<insert id="createOne" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> INSERT INTO table ( id, column ) VALUES ( FBK_SQ_PAGOPA_CREDITOR_INFO_ID.nextval, #{value, typeHandler=org.apache.ibatis.type.NStringTypeHandler} ) </insert>
为什么之前的写法无效?
n#{value}:生成的SQL为n ?,不符合Oraclen'xxx'的语法格式,无法被识别为国家字符集常量n'#{value}':MyBatis不会解析单引号内的#{value},会直接将#{value}作为字符串内容插入,导致SQL语法错误n${value}:若参数无单引号,生成nvalue格式错误;若参数包含单引号,存在严重SQL注入风险n #{value}:空格会导致Oracle无法识别n为国家字符集前缀,语法不生效
内容的提问来源于stack exchange,提问作者LiefLayer
相关产品推荐
相关产品推荐

