【SpringBoot异常】org.springframework.jdbc.BadSqlGrammarException

SpringBoot在启动后调用SQL语句查询用户时出现BadSqlGrammarException异常,描述内容为Unknown column ‘admin’ in ‘where clause’,没有在表中找到admin用户名
报错异常:
org.springframework.jdbc.BadSqlGrammarException: Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘admin’ in ‘where clause’
在这里插入图片描述
原因:
在mapper.xml配置文件中的select sql语句中,占位符用了${userName},没有将userName的值转化为字符串传入sql语句,导致没有在数据库表中找到用户名

  <select id="queryUserByName" parameterType="String" resultType="com.zeta.crm.vo.User">
    select
        <include refid="Base_Column_List"/>
    from
        t_user
    where
        user_name = ${userName}
  </select>

MyBatis的#{}和${}的区别
1.#{}相当于用的JDBC中的PrepareStatement模式,预编译SQL语句,然后传入参数
${}相当于JDBC中的Statement模式,采用“SQL语句” + “参数”的形式连接
2.#{}在进行输入映射时,会对参数进行类型解析。如果是String类型,sql语句中会自动加上“”引号
${}在进行输入映射的时候参数是什么就原样输出到sql语句中
3.#{}如果是进行简单类型的(八大基本类型+String和date类型)输入映射时,#{}中的参数名称可以任意
${}如果进行简单类型的输入映射时 ${}里面的参数必须是value
总结
在MyBatis的sql映射配置文件中,使用正则表达式时,尽量用#{},可以避免sql注入等一些问题
解决方法
mapper.xml中的正则表达式改为#{userName}

<select id="queryUserByName" parameterType="String" resultType="com.zeta.crm.vo.User">
    select
        <include refid="Base_Column_List"/>
    from
        t_user
    where
        user_name = #{userName}
  </select>

参考文章
https://blog.csdn.net/chengwei9975/article/details/100786607

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐