TextSqlNode是文本sql节点,提供解析文本sql的功能。

    1. package com.example.aninbatis.sqlnode;
    2. import com.example.aninbatis.sqlsource.DynamicContext;
    3. import com.example.aninbatis.utils.GenericTokenParser;
    4. import com.example.aninbatis.utils.OgnlUtils;
    5. import com.example.aninbatis.utils.SimpleTypeRegistry;
    6. import com.example.aninbatis.utils.TokenHandler;
    7. /**
    8. * 文本sql节点
    9. * 首先是文本内容,其次该内容中包含${}
    10. * 如果是这种SqlNode则存储在DynamicSqlSource中
    11. */
    12. public class TextSqlNode implements SqlNode {
    13. /**
    14. * sql文本
    15. */
    16. private String sqlText;
    17. public TextSqlNode(String sqlText) {
    18. this.sqlText = sqlText;
    19. }
    20. /**
    21. * 要处理${} 比如说username like '%${username}' 入参username=“zhangsan” 处理之后username
    22. * like '%zhangsan'
    23. */
    24. @Override
    25. public void apply(DynamicContext context) {
    26. TokenHandler tokenHandler = new BindingTokenParser(context);
    27. GenericTokenParser tokenParser = new GenericTokenParser("${", "}", tokenHandler);
    28. // tokenParser.parse(sqlText)参数是未处理的,返回值是已处理的(没有${})
    29. context.appendSql(tokenParser.parse(sqlText));
    30. }
    31. public boolean isDynamic() {
    32. if (sqlText.indexOf("${") > -1) {
    33. return true;
    34. }
    35. return false;
    36. }
    37. private static class BindingTokenParser implements TokenHandler {
    38. private DynamicContext context;
    39. public BindingTokenParser(DynamicContext context) {
    40. this.context = context;
    41. }
    42. /**
    43. * expression:比如说${username},那么expression就是username username也就是Ognl表达式
    44. */
    45. @Override
    46. public String handleToken(String expression) {
    47. Object paramObject = context.getBindings().get("_parameter");
    48. if (paramObject == null) {
    49. // context.getBindings().put("value", null);
    50. return "";
    51. } else if (SimpleTypeRegistry.isSimpleType(paramObject.getClass())) {
    52. // context.getBindings().put("value", paramObject);
    53. return String.valueOf(paramObject);
    54. }
    55. // 使用Ognl api去获取相应的值
    56. Object value = OgnlUtils.getValue(expression, context.getBindings());
    57. String srtValue = value == null ? "" : String.valueOf(value);
    58. return srtValue;
    59. }
    60. }
    61. }