ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

There is no getter for property named ‘xxx’ in ‘class java.lang.String异常

2021-12-15 19:03:23  阅读:193  来源: 互联网

标签:lang named String xxx 拼接 sql users name



1.问题引入

MyBatis在配置mapper.xml映射文件中进行与对应的接口进行传递参数处出现了异常:

Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘xxx’ in ‘class java.lang.String’

Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘xxx’ in ‘class java.lang.String’

  • 异常翻译:该异常就是说在String类中找不到属性xxx。常见的就是当接口和mapper.xml传递单个参数时用${}取值时;

  • 制造异常:
    dao接口中的方法定义:

    ArrayList<User> selectByName(String name);
    

    Xxxmapper.xml映射配置文件中的sql:

    <select id="selectByName" resultType="user" parameterType="string">
        select * from users where name='${name}'
    </select>
    

    测试类中的调用:

    ArrayList<User> users = userDao.selectByName("郭德纲");
    

  • 解决办法:
    将mapper文件中的${name}替换成MyBatis提供的固定获取单参数值方式:${_parameter} 或 ${value}

  • 粗略解释:当传递单个值时若使用${xxx}相当于获取String类中的xxx属性(当传递单个基本数据类型参数时,都会发生这样的异常)

2.${}和#{}的主要区别

1、 ${}类似于原始JDBC中的Statement,采用的时拼接sql的方式生成,直接将${xxx}对应的内容直接拼接到sql语句中:

<!-- 比如${xxx}对应的内容是 Tom and 1=1 -->

<select id="selectByName" resultType="user" parameterType="string">
    select * from users where name=${xxx};
</select>
  • 上面标签中的sql就 是:
    select * from users where name=Tom and 1=1;

    1、很明显不能防止sql注入。

    2、如果传递的值是字符串,没有自动添加引号,主要在标签中${xxx}两端自动拼接引号(单双引号)都行:’’${xxx}’’。

2、#{}类似于原始JDBC中的PrepareStatement,采用占位符的方式,生成sql语句,会将#{xxx}对应的内容当做字符串的形式填入对应的占位符位置上。

<!-- 比如${xxx}对应的内容是 Tom and 1=1 -->

<select id="selectByName" resultType="user" parameterType="string">
    select * from users where name=#{xxx};
</select>
  • 上面标签中的sql就是:
    select * from users where name=‘Tom and 1=1’ ;

    1、可以在很大程度上防止sql注入。

    2、该方式将对应的内容当做字符串,会自动加上引号,对于非字符串数据会利用数据库的自动类型转换,不用我们处理。

3.${}和#{}的使用场景

  • 由上面两者区别可以看出:
    1. ${}适用于拼接sql的情况下,注意拼接=后的之值时,如果是字符串类型,需要手动拼接引号。
    2. #{}适用于可以使用占位符的位置,大多数时候用在=后的数值的动态赋值,对于字符串类型不需要手动拼接引号。

标签:lang,named,String,xxx,拼接,sql,users,name
来源: https://blog.csdn.net/douju/article/details/121959203

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有