• MyBatis Order By 字符串替换


    MyBatis Order By 字符串替换

    默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。 这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。 比如 ORDER BY 子句,这时候你可以:

    ORDER BY ${columnName}
    

    这样,MyBatis 就不会修改或转义该字符串了。

    当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。 举个例子,如果你想 select 一个表任意一列的数据时,不需要这样写:

    @Select("select * from user where id = #{id}")
    User findById(@Param("id") long id);
    
    @Select("select * from user where name = #{name}")
    User findByName(@Param("name") String name);
    
    @Select("select * from user where email = #{email}")
    User findByEmail(@Param("email") String email);
    
    // 其它的 "findByXxx" 方法
    

    而是可以只写这样一个方法:

    @Select("select * from user where ${column} = #{value}")
    User findByColumn(@Param("column") String column, @Param("value") String value);
    

    其中 ${column} 会被直接替换,而 #{value} 会使用 ? 预处理。 这样,就能完成同样的任务:

    User userOfId1 = userMapper.findByColumn("id", 1L);
    User userOfNameKid = userMapper.findByColumn("name", "kid");
    User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");
    

    这种方式也同样适用于替换表名的情况。

    综上所述,order by 进行排序可以这么写:

    @Select(select * from user order by ${value} desc)
    List<User> findAll(@Param("column") String column);
    
    xml写法:
    <select id="testGetOffers" resultType="com.xy.erp.saas.userserver.entity.Offer">
        select * from offer o
        where o.orderGUID = #{orderGUID}
        <if test="word != null">
            order by ${word} ${desc}
        </if>
        limit #{currIndex}, #{pageSize}
    </select>
    

    注意:用这种方式接受用户的输入,并用作语句参数是不安全的,会导致潜在的 SQL 注入攻击。因此,要么不允许用户输入这些字段,要么自行转义并检验这些参数。

    自我控制是最强者的本能-萧伯纳
  • 相关阅读:
    静态资源放置于独立域名之下
    一个程序学习String类的所有常用方法
    Myeclipse的workspace配置文件浅谈
    使用myeclipse自带的tomcat发布web功能怎么访问
    Java陷阱之assert关键字
    Java集合Map接口与Map.Entry学习
    Java中List和ArrayList的区别
    手动命名名字空间打包以及调用
    命令行java -classpath 的使用
    maven 环境变量设置和Java maven工具配置 on windows 7
  • 原文地址:https://www.cnblogs.com/CF1314/p/13554624.html
Copyright © 2020-2023  润新知