docs: private void parse(String namedSql, Map<String, Object> paramMap) {
  		int len = namedSql.length();
  
  		final StrBuilder name = StrUtil.strBuilder();
  		final StrBuilder sqlBuilder = StrUtil.strBuilder();
  		char c;
  		Character nameStartChar = null;
  		for (int i = 0; i < len; i++) {
  			c = namedSql.charAt(i);
  			if (c == ':' || c == '@' || c == '?') {
  				nameStartChar = c;
  			} else if (null != nameStartChar) {
  				// 变量状态
  				if (isGenerateChar(c)) {
  					// 变量名
  					name.append(c);
  				} else {
  					// 变量结束
  					String nameStr = name.toString();
  					if(paramMap.containsKey(nameStr)) {
  						// 有变量对应值（值可以为null），替换占位符
  						final Object paramValue = paramMap.get(nameStr);
  						sqlBuilder.append('?');
  						this.params.add(paramValue);
  					} else {
  						// 无变量对应值，原样输出
  						sqlBuilder.append(nameStartChar).append(name);
  					}
  					nameStartChar = null;
  					name.clear();
  					sqlBuilder.append(c);
  				}
  			} else {
  				sqlBuilder.append(c);
  			}
  		}
  
  		if (false == name.isEmpty()) {
  			// SQL结束依旧有变量名存在，说明变量位于末尾
  			final Object paramValue = paramMap.get(name.toString());
  			if (null != paramValue) {
  				// 有变量对应值，替换占位符
  				sqlBuilder.append('?');
  				this.params.add(paramValue);
  			} else {
  				// 无变量对应值，原样输出
  				sqlBuilder.append(nameStartChar).append(name);
  			}
  			nameStartChar = null;
  			name.clear();
  		}
  
  		this.sql = sqlBuilder.toString();
  	}