zoukankan      html  css  js  c++  java
  • #{}和${}的用法和区别

    #{}的用法:

    我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQL语句的占位符,来映射Sql需要的实际参数

    如果只有一个参数

        <select id="getUserById" parameterType="int" resultType="User">
            select * from users where id=#{id}
        </select>

    也就是说:#{}就是一个预编译的占位符作用,运行的时候会编译成 ? ;但这只适用于只有一个参数的情况,而且这种情况#{id}中的id可以写成任何字符串,比如#{abc}

    但是如果我们有多个参数呢?

    如果有多个参数

    解决方案一:按照顺序用 0 1 来标志

        <select id="getUserByNameAndAge" resultType="User">
            select * from users where username=#{0} and age=#{1}
        </select>
    

      解决方案二:按照顺序用param1 param2 来标志

        <select id="getUserByNameAndAge" resultType="User">
            select * from users where username=#{param1} and age=#{param2}
        </select>
    

      解决方案三:利用参数

        <select id="getUserByNameAndAge" resultType="User">
            select * from users where username=#{username123} and age=#{age233}
        </select>
    

      

    public interface UserMapper {
        public User getUserByNameAndAge(@Param("username123") String username, @Param("age233") int age);
    } 

    这种方式是推荐方式,不过我们需要注意的是xml和interface中的参数名称需要对应。

    ${}的用法:

    ${}的用法和#{}的用法不同在于: #{}会被编译成?,而${}则会被原样输出(用在参数上,需要用param注解)

        <select id="getUserById" parameterType="int" resultType="User">
            select * from users where id=${id}
        </select>
    
    public interface UserMapper {
        public User getUserById(@Param("id") int id);
    }
    

      

    运行的时候 会直接原样输出,不能解决sql注入问题,但是这种情况如果参数是字符串或者日期类型的话 需要手动加单引号 不然会报错

    由于是直接输出的,所以我们在配置mybatis-config.xml的时候 可以用${}来可以配置一些东西,比如:

    <!--加载外部属性-->
        <properties resource="jdbc.properties"/>
        
        <!--运行环境可以配置多个, default指定默认使用哪个-->
        <environments default="development">
            <!--配置环境, id是这个环境的唯一标识-->
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driverClassName}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
    

      

    总结:

      #是占位符, 会对SQL进行预编译,相当于?; $是做sql拼接, 有SQL注入的隐患 2. #不需要关注数据类型, MyBatis自动实现数据类型转换; ${} 必须自己判断数据类型

    ​   两者都支持@param注解, 指定参数名称, 获取参数值. 推荐这种方式

      一般做参数传递,都会使用#{}

      如果不是做预编译,而是做拼接sql, 会使用${}, 例如表名称的变化,或者用在其他配置文件中

    原文链接:https://www.cnblogs.com/blazeZzz/p/9295634.html

  • 相关阅读:
    五场面试之后的小结
    玩转ubuntu之初体验
    现阶段规划小结
    高并发秒杀系统--课程总结与思考
    高并发秒杀系统--秒杀高并发分析与解决方案
    高并发秒杀系统--SpringMVC整合
    高并发秒杀系统--Service事务管理与继承测试
    高并发秒杀系统--Service接口设计与实现
    对于你为什么要离职的深入思考
    两场面试之后的小结
  • 原文地址:https://www.cnblogs.com/wwct/p/12994953.html
Copyright © 2011-2022 走看看