zoukankan      html  css  js  c++  java
  • Mybatis框架学习_6_mapper.xml 文件中的输入参数详解 (paraterType)

    1.简介

    在前面的章节中,我们看到,在 mapper.xml 文件中,都使用  #{value} 或者 #{属性值} 的方式来显示输入参数,其实 mybatis 还支持另一种写法。 ${value} 或者 ${属性值},本章着重讲解下 ${} 的使用方法;

    2. # 和 $ 二者异同

    2.1 不同点如下

    • #{} 这种方式会自动给 {} 里面的值附上 ' '(单引号);${} 这种方式只是会原样输出
    • #{} 这种方式可以防止 sql 注入;${} 这种方式不可以防止 sql 注入

    但是请注意:因为  $ 有  sql  注入的风险,所以尽量使用  #{} 的形式。

    3. $ 的使用场景

    $ {} 只使用在动态排序的应用中。何为动态排序,即:如我们现有如下表:

    create table person
    (
        id int(10) auto_increment comment '人员ID'
            primary key,
        name varchar(20) null comment '姓名',
        age int(20) null comment '年龄',
        sex int(10) null comment '性别:1-男,0-女'
    )
    comment '人力表'
    ;

    我们想根据传值不同分别依靠姓名、年龄进行排序,此时我们希望得到的 sql 如下,select * from person order by name desc;或者 select * from person order by age desc。如果我们此时采用 #{},那么我们得到的 sql 就是 select * from person order by 'name',显然有了单引号不是我们期待的结果。

    此时我们的 mapper.xml 文件应该如下配置:

     <!--进行动态排序后进行查询-->
        <select id="selectOrderByValue" resultType="Person" parameterType="String">
            select * from person order by ${value} ASC 
        </select>

    此时程序执行结果为:

     此时如果我们写成

     <!--进行动态排序后进行查询-->
        <select id="selectOrderByValue" resultType="Person" parameterType="String">
            select * from person order by #{value} ASC 
        </select>

    程序是不会报错的,但是此时的执行结果为:

     即 order by  后面的 用于排序的字段不会生效;

    4.总结

    不到万不得已。请禁止使用  ${}的样式;

     

  • 相关阅读:
    js 常用方法
    Request.UrlReferrer
    批处理定时打开一个网页
    js基础知识总结:函数
    .NET DataTable转换为JSON格式的字符串
    .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
    .NET错误提示之:无法更新EntitySet“TableName”因为它有一个DefiningQuery
    python中安装web.py
    pycharm中运行flask项目安装flask
    jmeter--查看结果数中响应数据部分乱码
  • 原文地址:https://www.cnblogs.com/haibaowang/p/11880574.html
Copyright © 2011-2022 走看看