`

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

 
阅读更多
http://blog.csdn.net/weibing_huang/article/details/7368556

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。



1.MyBatis排序 针对单字段排序
1.1 MyBatis排序时,ORDER BY 后的参数应该形如:ORDER BY ${sname} ${sord}
    sname : 排序字段
     sord : 排序顺序 (ASC,DESC)
1.2 MyBatis排序时,ORDER BY 后的参数如果形如:ORDER BY #{sname} #{sord}
    sname : 排序字段
     sord : 排序顺序 (ASC,DESC)
     则不能返回想当然正确的结果。
分享到:
评论
1 楼 jnjeC 2016-12-01  
厉害,困扰了我很久

相关推荐

    Mybatis现学现用

    MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,...

    Mybatis排序无效问题解决.doc

    在实际开发过程中,当尝试通过动态SQL的方式实现排序功能时,可能会遇到一个常见问题:使用`order by #{sortInfo}`进行排序时,发现查询结果并未按照预期排序。例如,若传入的排序参数为`empno desc`,则期望的结果...

    MyBatis 需要注意的地方junit注解

    1.junit 常用注解 @Before 初始化方法,每次测试方法调用前都执行一次。 @After 释放资源:每次测试方法调用后都执行一次 ...6. 一般能用#的就别用$ MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

    MyBatisPlus条件构造器带条件排序方法orderBy、orderByDesc、orderByAsc使用示例代码

    在实际开发中,我们经常需要对查询结果进行排序,MyBatisPlus为此提供了`orderBy`、`orderByDesc`和`orderByAsc`三个方法,方便我们实现条件排序。下面将详细介绍这三个方法的使用及原理。 `orderBy`方法是...

    Mybatis中#{}和${}传参的区别及#和$的区别小结

    只有在确实需要动态SQL片段,如`ORDER BY`、`WHERE`子句中的列名变化时,才使用`${}`。在使用`${}`时,务必确保对用户输入进行验证和转义,以保障系统安全。在面试或日常开发中,了解这些基本概念和最佳实践,有助于...

    ibatis中 $ 于 # 的 区别

    - **例子**:假设需要根据外部传入的`str`参数动态构建`ORDER BY`子句,使用`${str}`可以正确地生成如`ORDER BY str`这样的SQL语句。 - **$ 对 SQL 注释的影响** 当使用`${}`时,如果传入的参数值中含有SQL...

    mybatis入门

    - 在排序时使用`orderby`动态参数时,建议使用`$`而不是`#`,因为`#`会自动添加引号,可能导致SQL语法错误。 - 对于复杂的条件判断和动态SQL构建,MyBatis提供了丰富的标签如`<if>`、`<choose>`、`<when>`、`...

    深入浅出MyBatis技术原理与实战.杨开振(详细书签)

    例如,可以根据传入的参数决定是否包含某个WHERE子句,或者根据参数值改变ORDER BY的排序依据。这大大提高了SQL的灵活性,降低了代码维护难度。 在事务管理方面,MyBatis支持手动和自动两种模式。手动模式下,...

    Mybatis中#{}与${}的区别详解

    在排序时使用 order by 动态参数时,也可以使用 ${}。 #{} 和 ${} 都是 MyBatis 中的占位符号,但是它们有着不同的特性和应用场景。#{} 能够防止 SQL 注入,而 ${} 方式无法防止 SQL 注入。在开发中,需要根据实际...

    MyBatis 最简单的分页+原理解析

    总结,MyBatis通过动态SQL和参数传递实现了最简单的分页查询,而分页的实现原理主要是通过SQL的`LIMIT`子句。在实际应用中,结合最佳实践和第三方插件,可以进一步提升分页功能的效率和灵活性。同时,针对不同的场景...

    springboot+mybatis分页

    在本文中,我们将深入探讨如何在SpringBoot项目中集成Mybatis并使用PageHelper进行分页。SpringBoot以其简洁的配置和强大的自动配置功能,已成为Java开发中的热门选择。Mybatis作为一个轻量级的持久层框架,它允许...

    MyBatis中#{}和${}的区别详解

    在处理排序条件时,如`ORDER BY`子句,如果你需要根据变量动态地指定排序的列名,应使用`${}`,因为`#{}`无法识别表达式中的列名。然而,这样做存在安全隐患,所以建议避免使用用户提供的数据来构建动态列名,或者对...

    SQL.rar_MyBatis3DynamicSql_dynamic mybatis_mybatis_mybatis Dyna

    5. `<foreach>`标签:用于遍历集合,构建IN或NOT IN子句,也可以用于动态生成ORDER BY或GROUP BY等。 在实际应用中,我们通常会在Mapper接口的XML配置文件中使用这些动态SQL元素。例如,可以创建一个根据多个条件...

    mybatis自动生成代码分页功能 mysql 数据库

    一种优化策略是结合`ORDER BY`子句一起使用,将`ORDER BY`的计算放到索引中进行,这样可以提高查询速度。例如,如果有一个根据`create_time`字段排序的索引,可以写成: ```xml SELECT * FROM user WHERE ...

    MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据

    - **性能考虑**:过度使用动态SQL可能会影响查询性能,特别是在复杂的查询中。 #### 五、总结 MyBatis动态SQL作为一种强大的工具,极大地简化了SQL语句的构建过程,并提高了代码的质量。合理利用MyBatis提供的各种...

    mybatis 通用mapper

    - `@OrderBy`:指定排序规则。 6. **创建实体对应的Dao** 创建一个具体的Dao接口,该接口继承之前定义的基础Mapper接口。同时,还需要创建一个对应的XML文件,虽然通用Mapper已经为我们提供了大量的默认方法,但...

    mybatis_pagehelper.zip

    3. 排序无效:确认排序字段是否存在,并检查`@OrderBy`注解的使用。 4. 性能下降:排查是否因为SQL优化不足导致,可以开启PageHelper的日志查看生成的SQL。 总结,MyBatis PageHelper插件通过简洁的API和智能的参数...

    mybatis官网

    例如,可以根据条件选择性地添加WHERE子句,或者在ORDER BY中动态指定排序字段。这种灵活性大大提高了代码的可维护性和可读性。 MyBatis 支持多种数据源和事务管理方式。它可以与Spring框架无缝集成,利用Spring的...

    Mybatis多参数及实体对象传递实例讲解

    当`lifetouchRelease.page.orderBy`存在时,按照用户指定的字段进行排序;否则,默认按`a.update_date`字段降序排列。 5. **注解与XML映射文件的结合**: 示例中接口方法的注解与XML映射文件相互配合,共同完成...

    Mybatis分页插件 - PageHelper.zip

    - **排序支持**:在查询时可以通过设置OrderBy参数实现动态排序。 - **缓存机制**:PageHelper集成了Mybatis的二级缓存,提高查询效率。 - **自定义拦截器**:如果需要更复杂的分页逻辑,可以通过自定义拦截器实现...

Global site tag (gtag.js) - Google Analytics