Mybatis 传参数的问题

1

 

Mybatis-There is no getter for property named 'tj' in 'class java.lang.String'

SELECT   ..   ${tj}

 

 在测试时报错:There is no getter for property named 'tj' in 'class java.lang.String'

 问题分析:Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取string.tj值,引起报错。

 解决方法:  public List methodName(@Param(value="tj") String tj);说明参数值。

 
 
 
 
 
 
 
 
 

一、发现问题

<select id="queryStudentByNum" resultType="student" parameterType="string">  

select num,name,phone from student  
<where> 
<if test = " num!=null and num!='' ">
AND num = #{num}
</if>
</where>
</select> 

Mybatis查询传入一个字符串传参数,报There is no getter for property named 'num' in 'class java.lang.String'。


二、解决问题

<select id="queryStudentByNum" resultType="student" parameterType="string">  

select num,name,phone from student  
<where> 
<if test = " _parameter!=null and_parameter!='' ">
AND num = #{_parameter}
</if>
</where>
</select>

无论参数名,都要改成"_parameter"或value。如"#{value}"


三、原因分析

Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取string.num值,引起报错。也可以public List methodName(@Param(value="num") String num)的方法说明参数值


参考博客:

http://blog.sina.com.cn/s/blog_86e49b8f010191hw.html

http://txin0814.iteye.com/blog/1533645

 

 

 

Mybatis3字符串替换问题

mybatis3的用户指南里关于字符串替换的解释是:

字符串替换
  默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并以它为背景设
置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在 SQL 语
句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
  ORDER BY ${columnName}
  这里 MyBatis 不会修改或转义字符串。
  重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会
导致潜在的 SQL 注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检
查。

 

我在使用的Maper xml映射时

  <select id="selectCartIdBymobileNo" parameterType="String" resultType="java.util.HashMap">
  SELECT CAR.MOBILE_NO,CAR.WORK_RECORD_ID FROM T_CAR_SOURE_INFO CAR WHERE CAR.MOBILE_NO IN (${mobileNos})
  </select>

使用Java调用如下:

    String mobileNos = "'1303423****',''1303413****'";

    SqlSession session = SqlMap.getSqlSessionFactory().openSession();
  try{
  List<Map<String,Object>> resultList =  session.selectList("selectCartIdBymobileNo", mobileNos);

   }finally{

     session.close();

   }

运行时报错   mybatis There is no getter for property named 'mobileNos' in 'class java.lang.String'

将 $ 换成 # 虽然不报错了,但是查询不出数据。

最后把 改成 ${value} 居然解决了这个问题。

 

现在分析认为,默认是使用#{} 这个没什么说的了,但是使用${} 时,因为框架支持了OGNL 所以会按照OGNL解析此语句,使用value为什么能够解决这个问题,本人现在还不明白,只是在网上搜了下,看到有人这样说。如有明白的,麻烦告知。

转自:http://hi.baidu.com/thinkingjava/item/5b40182c8f8b920c72863ea0

 

 

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值