• Mybatis中#{}和${}的区别


    Mybatis的优点之一就是可以动态的使用SQL,而在相应的mapper.xml文件中编写SQL时,分别有两种动态获取参数的方式即 #{}${}

    首先,介绍一下mapper.xml中mapper标签下select,delete等标签中的 parameterType属性

    parameterType属性是用来控制SQL中需要传入的参数类型的属性,同样是通过不同类型的映射值来确定,这一点和resultType属性一样。

    SqlSession的实例化对象的 selectList()、selectOne()方法中,第二个参数均为需要传入的Sql参数;selectMap()的第三个参数为需要传入Sql语句参数

    在mybatis里,只能传入一个参数,如果想要传入多个参数,需要通过对象或者Map集合的方式传入

    然后谈一谈#{}和${}的使用

    1.#{}可以通过 索引#{0}(mybatis下标是从0开始),#{param1}获取第一个参数;若是只传入一个参数,可以通过#{}直接获取

    2.如果传入参数类型是对象,需要在#{}中写入对象属性名;如果传入参数类型是Map集合名,需要在#{}中写入键名;来获取对应的参数

    3.${}中,如果内容写入的是基本数据类型的值,则sql语句直接使用这个值;需要使用${属性名}才能获得传入对象的属性值

    主要区别:

    1.使用#{}时,mybatis中的sql语句会被预编译处理(此时低层应该使用的是PreparedStatement对象?),即会先将sql中的#{}用占位符?替代,并编译。

    然后该sql语句在获取参数时,会调用PreparedStatement的set方法来赋值。即#{}是预编译处理

    2.使用${}时,mybatis会直接将${}获得的参数值和${}替换,就是把${}替换成变量的值(在编译阶段就已经替换了)。即${}是字符串替换

    当想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:ORDER BY ${columnName}

    一般来说能使用#{}尽量使用#{}

    原因如下:

      #{}既然是预编译处理,那么使用#{}就能够很大的程度上防止SQL注入;而${}无法防止SQL注入

  • 相关阅读:
    Dockerfile常用指令
    Maven相关命令
    CI-CD平台搭建过程整理
    边工作边刷题:70天一遍leetcode: day 28-1
    边工作边刷题:70天一遍leetcode: day 28
    边工作边刷题:70天一遍leetcode: day 29-1
    边工作边刷题:70天一遍leetcode: day 29
    边工作边刷题:70天一遍leetcode: day 30-1
    边工作边刷题:70天一遍leetcode: day 30
    边工作边刷题:70天一遍leetcode: day 31-4
  • 原文地址:https://www.cnblogs.com/xiang9286/p/10430965.html
Copyright © 2020-2023  润新知