Mybatis #{}预处理错误

nnnnyyyy 2020-06-24 04:19:14
1.使用Mybatis操作Neo4j数据库,Cql语句:MATCH (N{NAME:'杨幂',BORN:34}) SET N:OAUTH_USER RETURN N,可以执行。

2.其中Cql有两个参数传入,参数都是String类型:
2.1 #{node}:{NAME:'杨幂',BORN:34}
2.2 #{labelCode}:N:OAUTH_USER

3.如果使用${}接受参数,正常执行Cql语句,如果使用#{}接受参数则抛错:

看内容是预处理失败了。我怀疑是参数里面包含了{}引起的。

4.实体类

/*节点标签管理*/
public class LabelCenter {

/*节点*/
String node;

/*关系编码*/
String labelCode;

//region get and set
public String getNode() {
return node;
}

public void setNode(String node) {
this.node = node;
}

public String getLabelCode() {
return labelCode;
}

public void setLabelCode(String labelCode) {
this.labelCode = labelCode;
}
//endregion get and set

}


5.mapp.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.eee.neo4jmybatis.mapper.LabelCenterMapper">

<!--新增-->
<insert id="add" parameterType="com.eee.neo4jmybatis.base.LabelCenter">
MATCH (N#{node}) SET N:#{labelCode} RETURN N
</insert>

<!--删除用户信息-->
<delete id="delete" parameterType="com.eee.neo4jmybatis.base.LabelCenter">
MATCH (N#{node}) REMOVE N:#{labelCode} RETURN N
</delete>

</mapper>


5.mapper.java

package com.eee.neo4jmybatis.mapper;


import com.eee.neo4jmybatis.base.LabelCenter;

public interface LabelCenterMapper {

/*新增*/
public int add(LabelCenter labelCenter);

/*删除*/
public int delete(LabelCenter labelCenter);
}


6. 测试java

@Test
public void delete() {

//指向XML配置文件中的n4oj节点
SqlSession sqlSession = Neo4jConnectionFactory.getSqlSessionFactory("neo4j")
.openSession();

try {

LabelCenterMapper labelCenterMapper = sqlSession.getMapper(LabelCenterMapper.class);

LabelCenter labelCenter = new LabelCenter();

labelCenter.setNode("{NAME:'杨幂',BORN:34}");
labelCenter.setLabelCode(LabelEnum.OAUTH_USER.getCode());

int i = labelCenterMapper.delete(labelCenter);

sqlSession.commit();

System.out.println("i:" + i);
} finally {
sqlSession.close();
}
}

...全文
8495 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nnnnyyyy 2021-05-26
  • 打赏
  • 举报
回复
引用 10 楼 boywamg1 的回复:
已经解决了吗,我这边解决的方法是换了neo4j-jdbc-driver的jar包版本要和数据库一致
十分感谢!我这边暂时用$处理了
35岁魔咒 2021-05-25
  • 打赏
  • 举报
回复
已经解决了吗,我这边解决的方法是换了neo4j-jdbc-driver的jar包版本要和数据库一致
easyMoneySniper_ 2022-07-10
  • 举报
回复
@35岁魔咒 请问哪里可以查到neo4j-jdbc-driver和neo4j的版本对应关系
  • 打赏
  • 举报
回复
引用 2 楼 解咚咚 的回复:
#{}可以[u]防止SQL注入,这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,预编译后,会动态解析成一个参数标记符 ? 而使用${}在动态解析时候,会传入参数字符串,也就是 ‘?’。 简单来说就是: #{} 这种就是将参数直接赋值,也就编译好SQL语句在直接将参数值赋上去 ${} 这种就是将参数打上引号赋值,也就是先取值以后再去编译SQL语句 而且SQL是弱类型的,所以一般中文不含 '' 执行是会报错的。 (个人理解....)
认同
KeepSayingNo 2020-09-29
  • 打赏
  • 举报
回复
检查下出入的值,${} 不做转义,直接是什么就存入什么,#{}会识别变量,将传值作为变量存入
廾匸随笔 2020-09-29
  • 打赏
  • 举报
回复
引用 5 楼 qq_40202111 的回复:
楼上的不要乱教人。。。 ${}:sql拼接符号(替换结果不会增加单引号‘’,like和order by后使用,存在sql注入问题,需手动代码中过滤) #{}:占位符号,可以防止sql注入(替换结果会增加单引号‘’)
这位是对的,处理好单引号的问题就能解决问题了
nnnnyyyy 2020-09-28
  • 打赏
  • 举报
回复
引用 4 楼 qq_41948735 的回复:
请教一下 问题处理了么 我碰到了相同的问题
并没有,如果你解决,还请麻烦告诉我一下
guo1. 2020-09-27
  • 打赏
  • 举报
回复
楼上的不要乱教人。。。 ${}:sql拼接符号(替换结果不会增加单引号‘’,like和order by后使用,存在sql注入问题,需手动代码中过滤) #{}:占位符号,可以防止sql注入(替换结果会增加单引号‘’)
qq_41948735 2020-09-27
  • 打赏
  • 举报
回复
请教一下 问题处理了么 我碰到了相同的问题
nnnnyyyy 2020-07-13
  • 打赏
  • 举报
回复
引用 2 楼 解咚咚 的回复:
#{}可以[u]防止SQL注入,这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,预编译后,会动态解析成一个参数标记符 ? 而使用${}在动态解析时候,会传入参数字符串,也就是 ‘?’。 简单来说就是: #{} 这种就是将参数直接赋值,也就编译好SQL语句在直接将参数值赋上去 ${} 这种就是将参数打上引号赋值,也就是先取值以后再去编译SQL语句 而且SQL是弱类型的,所以一般中文不含 '' 执行是会报错的。 (个人理解....)
道理我都懂,但是不知道怎么解决这个问题
解咚咚 2020-07-13
  • 打赏
  • 举报
回复
#{}可以[u]防止SQL注入,这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,预编译后,会动态解析成一个参数标记符 ? 而使用${}在动态解析时候,会传入参数字符串,也就是 ‘?’。 简单来说就是: #{} 这种就是将参数直接赋值,也就编译好SQL语句在直接将参数值赋上去 ${} 这种就是将参数打上引号赋值,也就是先取值以后再去编译SQL语句 而且SQL是弱类型的,所以一般中文不含 '' 执行是会报错的。 (个人理解....)
nnnnyyyy 2020-07-13
  • 打赏
  • 举报
回复
我发现好像是是#{}没有送值进去,但${}却没有问题

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧