• 模糊查询like用法实例(Bee)


     like通过两个匹配符%和_进行模糊查询.

    %: 匹配任意个任意字符

    _: 匹配一个字符

    以下以userid为例,  在数据库中的值如下图所示:

     V1.11及之前版本, 使用Op.like, 需要判断值是否为空字段,是否只含有匹配符(%和_)

     Op.like可以创建比左右匹配更复杂的模糊查询,但需要防止,最终的值只包含有匹配符(%和_)

    在V1.17( 1.17.0.9) 中,能明确%使用在左还是右,还是同时使用在左右, 则应该选用:likeLeft,likeRight,likeLeftRight;

    Bee框架会对这三种用法的值进行转义(匹配符%,由框架添加), 转义后值中的%(如果有),只代表符号%.


     where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)

    1. public class LikeTest {
    2. public static void main(String[] args) {
    3. test();
    4. }
    5. public static void test() {
    6. try{
    7. Suid suid = BeeFactory.getHoneyFactory().getSuid();
    8. Orders orders = new Orders();
    9. Condition condition=BF.getCondition();
    10. // condition
    11. .op("1=1 -- userid", Op.like, "bee%") // test invalid field
    12. .op("userid", Op.like, "bee%") //模糊查询
    13. // .op("userid", Op.like, "%") //模糊查询 只有%或_, 从1.17开始,Bee会抛出异常.
    14. .op("userid", Op.like, "_")
    15. .op("userid", Op.like, "")
    16. 使用Op.like,调用方需要对传入的字符进行过滤,特别是1.17之前的版本.
    17. // ;
    18. List list2 =null;
    19. list2=suid.select(orders, condition);
    20. // for (int i = 0; i < list2.size(); i++) {
    21. // Logger.info(list2.get(i).toString());
    22. // }
    23. condition=BF.getCondition();
    24. condition.op("userid", Op.like, "test\\%"); //userid是test%
    25. list2 = suid.select(orders, condition);
    26. for (int i = 0; i < list2.size(); i++) {
    27. Logger.info(list2.get(i).toString());
    28. }
    29. condition=BF.getCondition();
    30. condition.op("userid", Op.like, "test%"); //test开头的
    31. list2 = suid.select(orders, condition);
    32. for (int i = 0; i < list2.size(); i++) {
    33. Logger.info(list2.get(i).toString());
    34. }
    35. condition=BF.getCondition();
    36. condition.op("userid", Op.like, "test_"); //test开头有5个字符的
    37. list2 = suid.select(orders, condition);
    38. for (int i = 0; i < list2.size(); i++) {
    39. Logger.info(list2.get(i).toString());
    40. }
    41. condition=BF.getCondition();
    42. condition.op("userid", Op.like, "test\\_"); //userid是test_
    43. list2 = suid.select(orders, condition);
    44. for (int i = 0; i < list2.size(); i++) {
    45. Logger.info(list2.get(i).toString());
    46. }
    47. condition=BF.getCondition();
    48. condition.op("userid", Op.likeLeft, "test"); //likeLeft
    49. list2 = suid.select(orders, condition);
    50. for (int i = 0; i < list2.size(); i++) {
    51. Logger.info(list2.get(i).toString());
    52. }
    53. condition=BF.getCondition();
    54. condition.op("userid", Op.likeRight, "test"); //likeRight
    55. list2 = suid.select(orders, condition);
    56. for (int i = 0; i < list2.size(); i++) {
    57. Logger.info(list2.get(i).toString());
    58. }
    59. condition=BF.getCondition();
    60. condition.op("userid", Op.likeLeftRight, "test"); //likeLeftRight
    61. list2 = suid.select(orders, condition);
    62. for (int i = 0; i < list2.size(); i++) {
    63. Logger.info(list2.get(i).toString());
    64. }
    65. condition=BF.getCondition();
    66. condition.op("userid", Op.likeLeft, "test%"); //likeLeft
    67. list2 = suid.select(orders, condition);
    68. for (int i = 0; i < list2.size(); i++) {
    69. Logger.info(list2.get(i).toString());
    70. }
    71. System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    72. // condition=BF.getCondition();
    73. // condition.op("userid", Op.likeLeft, ""); //likeLeft
    74. // list2 = suid.select(orders, condition);
    75. // for (int i = 0; i < list2.size(); i++) {
    76. // Logger.info(list2.get(i).toString());
    77. // }
    78. // condition=BF.getCondition();
    79. // condition.op("userid", Op.likeLeft, null); //likeLeft
    80. // list2 = suid.select(orders, condition);
    81. // for (int i = 0; i < list2.size(); i++) {
    82. // Logger.info(list2.get(i).toString());
    83. // }
    84. condition=BF.getCondition();
    85. condition.op("userid", Op.likeLeft, "test\\%"); //likeLeft
    86. list2 = suid.select(orders, condition);
    87. for (int i = 0; i < list2.size(); i++) {
    88. Logger.info(list2.get(i).toString());
    89. }
    90. condition=BF.getCondition();
    91. condition.op("userid", Op.likeLeft, "test_"); //likeLeft
    92. list2 = suid.select(orders, condition);
    93. for (int i = 0; i < list2.size(); i++) {
    94. Logger.info(list2.get(i).toString());
    95. }
    96. condition=BF.getCondition();
    97. condition.op("userid", Op.likeLeft, "test\\u0025"); //likeLeft
    98. list2 = suid.select(orders, condition);
    99. for (int i = 0; i < list2.size(); i++) {
    100. Logger.info(list2.get(i).toString());
    101. }
    102. System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2");
    103. condition=BF.getCondition();
    104. condition.op("userid", Op.like, "\\\u0025\\\u0025"); //like \u0025 is % 转义 \%是\\\u0025
    105. list2 = suid.select(orders, condition);
    106. for (int i = 0; i < list2.size(); i++) {
    107. Logger.info(list2.get(i).toString());
    108. }
    109. condition=BF.getCondition();
    110. condition.op("userid", Op.likeLeft, "\\\u0025"); //like \u0025 is % 转义 \%是\\\u0025
    111. list2 = suid.select(orders, condition);
    112. for (int i = 0; i < list2.size(); i++) {
    113. Logger.info(list2.get(i).toString());
    114. }
    115. //查询 userid=\u0025
    116. condition=BF.getCondition();
    117. condition.op("userid", Op.like, "\\\\u0025"); //like \u0025 is %
    118. list2 = suid.select(orders, condition);
    119. for (int i = 0; i < list2.size(); i++) {
    120. Logger.info(list2.get(i).toString());
    121. }
    122. }catch (Exception e) {
    123. Logger.error("In ConditionExam (Exception):"+e.getMessage());
    124. e.printStackTrace();
    125. }
    126. }
    127. }

    like需要防止是否会受到攻击,而暴露整个表的数据.

    where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)

    最终的值只包含有匹配符(%和_)

    1. /**
    2. * V1.11及之前版本, 使用Op.like, 需要判断值是否为空字段,是否只含有匹配符(%和_)
    3. *
      Op.like可以创建比左右匹配更复杂的模糊查询,但需要防止,最终的值只包含有匹配符(%和_)
    4. *
      在V1.17( 1.17.0.9) 中,能明确%使用在左还是右,还是同时使用在左右, 则应该选用:likeLeft,likeRight,likeLeftRight
    5. *
      where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)
    6. * @author Kingstar
    7. * @since 1.17
    8. */
    9. public class LikeEnhanceTest {
    10. private static PreparedSql preparedSql = BF.getPreparedSql();
    11. private static Suid suid = BF.getSuid();
    12. public static void main(String[] args) {
    13. try {
    14. Map map = new HashMap<>();
    15. map.put("name", "");
    16. selectNoPage(CustomSql.getCustomSql("example.autosql.like.isNotNull"), map);
    17. // example.autosql.like.isNotNull=select * from orders where name like #{%name}
    18. // name的值非null,会保留之前的内容,但name的值为空字符,会有注入风险,所以报错.
    19. } catch (Exception e) {
    20. e.printStackTrace();
    21. }
    22. Condition condition = null;
    23. List list2 = null;
    24. Orders orders = new Orders();
    25. try {
    26. condition = BF.getCondition();
    27. condition
    28. // .op("1=1 -- userid", Op.like, "bee%") // test invalid field
    29. // .op("userid", Op.like, "bee%") //模糊查询
    30. .op("userid", Op.like, "%") // 模糊查询 只有%或_, 从1.17开始,Bee会抛出异常.
    31. // .op("userid", Op.like, "_")
    32. // .op("userid", Op.like, "")
    33. // 使用Op.like,调用方需要对传入的字符进行过滤,特别是1.17之前的版本.
    34. ;
    35. list2 = suid.select(orders, condition);
    36. for (int i = 0; i < list2.size(); i++) {
    37. Logger.info(list2.get(i).toString());
    38. }
    39. } catch (Exception e) {
    40. e.printStackTrace();
    41. }
    42. try {
    43. condition = BF.getCondition();
    44. condition.op("userid", Op.like, "\u0025"); // like \u0025 is %
    45. list2 = suid.select(orders, condition);
    46. for (int i = 0; i < list2.size(); i++) {
    47. Logger.info(list2.get(i).toString());
    48. }
    49. } catch (Exception e) {
    50. e.printStackTrace();
    51. }
    52. try {
    53. condition = BF.getCondition();
    54. condition.op("userid", Op.like, "\u005f"); // like \u005f is _
    55. list2 = suid.select(orders, condition);
    56. for (int i = 0; i < list2.size(); i++) {
    57. Logger.info(list2.get(i).toString());
    58. }
    59. } catch (Exception e) {
    60. e.printStackTrace();
    61. }
    62. try {
    63. condition = BF.getCondition();
    64. condition.op("userid", Op.like, "\u0025\u0025"); // like \u0025 is %
    65. list2 = suid.select(orders, condition);
    66. for (int i = 0; i < list2.size(); i++) {
    67. Logger.info(list2.get(i).toString());
    68. }
    69. } catch (Exception e) {
    70. e.printStackTrace();
    71. }
    72. try {
    73. condition = BF.getCondition();
    74. condition.op("userid", Op.likeLeft, ""); // likeLeft
    75. list2 = suid.select(orders, condition);
    76. for (int i = 0; i < list2.size(); i++) {
    77. Logger.info(list2.get(i).toString());
    78. }
    79. } catch (Exception e) {
    80. e.printStackTrace();
    81. }
    82. try {
    83. condition = BF.getCondition();
    84. condition.op("userid", Op.likeLeft, null); // likeLeft
    85. list2 = suid.select(orders, condition);
    86. for (int i = 0; i < list2.size(); i++) {
    87. Logger.info(list2.get(i).toString());
    88. }
    89. } catch (Exception e) {
    90. e.printStackTrace();
    91. }
    92. // PreparedSqlExam.java
    93. PreparedSql preparedSql = BF.getPreparedSql();
    94. String sql3_2 = CustomSql
    95. .getCustomSql("osql.example.entity.selectOrdersLikeNameViaMap2"); // %name
    96. Map map2 = new HashMap<>();
    97. // map2.put("name", "Bee");
    98. // map2.put("name", ""); //1.17之前的版本,需要判断传入的值不能为空字符,%,_.
    99. // case "%"
    100. try {
    101. map2.put("name", "%");
    102. // map2.put("name", "_");
    103. // map2.put("name", null);
    104. preparedSql.select(sql3_2, new Orders(), map2);// map
    105. } catch (Exception e) {
    106. e.printStackTrace();
    107. }
    108. // case ""
    109. try {
    110. map2 = new HashMap<>();
    111. map2.put("name", ""); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
    112. preparedSql.select(sql3_2, new Orders(), map2);// map
    113. } catch (Exception e) {
    114. e.printStackTrace();
    115. }
    116. // case "_"
    117. try {
    118. map2 = new HashMap<>();
    119. map2.put("name", "_"); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
    120. preparedSql.select(sql3_2, new Orders(), map2);// map
    121. } catch (Exception e) {
    122. e.printStackTrace();
    123. }
    124. // case null
    125. //[WARN] the parameter value in like is null !
    126. try {
    127. map2 = new HashMap<>();
    128. map2.put("name", null); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
    129. preparedSql.select(sql3_2, new Orders(), map2);// map
    130. } catch (Exception e) {
    131. e.printStackTrace();
    132. }
    133. System.out.println("finished!");
    134. }
    135. private static void selectNoPage(String sql, Map map) {
    136. List list3 = preparedSql.select(sql, new Orders(), map);// map
    137. }
    138. }

     

  • 相关阅读:
    ICCV 2023 | SuS-X:仅靠类别名称微调CLIP模型,剑桥大学联合DeepMind出品
    【高性能计算】CUDA
    机器学习中常用的分类算法总结
    5G与UWB定位技术融合的四种方式
    如何用一个插件解决 Serverless 灰度发布难题?
    Harbor仓库概述
    六、python Django REST framework GET参数处理[过滤、排序、分页]
    等参单元与数值积分
    Springboot对MVC、tomcat扩展配置
    BRPC学习
  • 原文地址:https://blog.csdn.net/abckingaa/article/details/126074366