Mybatis获得参数值的两种方式:#{}和${}的区别

    技术2022-08-09  74

    #{}: 底层创建一个PreparedStatement对象.

    ${}:底层创建一个Statement对象.

    preparedStatement和statement的区别:

    preparedStatement: 支持通配符赋值,可以预编译sql语句

    statement: 必须使用字符串拼接的方式操作sql语句,不能使用通配符,因为statement对象调用executeQuery(String sql)直接执行sql语句. 因此,在使用#{}传输实体类对象时,有字符串的地方不用加单引号’’,而使用${}拼接字符串时需要手动加上单引号’’.

    而在传输数据的类型不同时也有区别:

    在传输实体类对象使用#{}时:

    < insert> insert into user values (null,#{name},#{age},#{gender}) < /insert>

    sql执行时转化为以下:

    sql:insert into user values (null,?,?,?);

    在传输实体类对象使用${}时:有字符串的地方使用单引号哦

    < insert> insert into user values (null,'${name}',${age},'${gender}') < /insert>

    执行时转化为以下:

    sql:insert into user values (null,'张三',12,'男');

    在传输单个String类型或基本数据类型时,因为#{}是通配符进行赋值,所以#{}里面的内容无论写什么,mybatis都可以进行赋值,但是建议与属性名保持一致

    <select id="getUserByUid"> select * from user where uid=#{uid} </select>

    而${}在传输单个String类型或者基本数据类型时, $ {}里面只能填写value或者_parameter

    <select id="getUserByUid"> select * from user where uid=${value} </select>

    总结:

    传递不同参数类型,#{}和${} 的不同取值方式:

    1,当传输类型为实体类对象时:

    #{}和 $ {}都可以通过属性名直接获取参数值,但是要注意${}的单引号问题

    2,当传输类型为单个字符串或者基本数据类型时:

    #{} 可以通过属性名直接获取参数值 ${}里面的值只能是value或者_parameter

    3,当传输多个参数时:Mybatis会默认将这些参数放在map集合中,键为0,1,2…或者param1,param2,param3…

    #{}:可以通过#{0},#{1};#{param1},#{param2}来获取参数值 ${}:只能通过 ${param1}, ${param2}来获取参数值

    Processed: 0.016, SQL: 9