private boolean isSQLQuery(Method method) {
   return sqlQueries != null && sqlQueries.hasQuery(getMethodName(method));
 }
    /**
     * Determine the transaction attribute for this method invocation.
     *
     * <p>Defaults to the class's transaction attribute if no method attribute is found.
     *
     * @param method the method for the current invocation (never <code>null</code>)
     * @param targetClass the target class for this invocation (may be <code>null</code>)
     * @return TransactionAttribute for this method, or <code>null</code> if the method is not
     *     transactional
     */
    public TransactionAttribute getTransactionAttribute(Method method, Class<?> targetClass) {
      // First, see if we have a cached value.
      Object cacheKey = getCacheKey(method, targetClass);
      Object cached = this.attributeCache.get(cacheKey);
      if (cached != null) {
        // Value will either be canonical value indicating there is no transaction attribute,
        // or an actual transaction attribute.
        if (cached == NULL_TRANSACTION_ATTRIBUTE) {
          return null;
        } else {
          return (TransactionAttribute) cached;
        }
      } else {
        TransactionAttribute txAtt = NULL_TRANSACTION_ATTRIBUTE;

        // We need to work it out.
        // add by carvin.. jade method adapter.
        boolean isSQLQuery = false, isSQLAnnotation = false;
        if ((isSQLQuery = isSQLQuery(method)) || (isSQLAnnotation = isSQLAnnotation(method))) {
          SQLType sqlType = SQLType.READ;
          if (isSQLQuery) {
            String sql = sqlQueries.getQuery(getMethodName(method));
            sqlType = getSqlType(sql);
          } else {
            SQL sqlAnnotation = method.getAnnotation(SQL.class);
            String sql = sqlAnnotation.value();
            sqlType = sqlAnnotation.type();
            if (sqlType == SQLType.AUTO_DETECT) {
              sqlType = getSqlType(sql);
            }
          }
          try {
            Class<DataAccessImpl> tempClass = DataAccessImpl.class;
            Method tempMethod = null;
            if (sqlType == SQLType.WRITE) {
              tempMethod =
                  tempClass.getDeclaredMethod(
                      "update", String.class, Object[].class, KeyHolder.class);
            } else if (sqlType == SQLType.PROCEDURE) {
              tempMethod =
                  tempClass.getDeclaredMethod(
                      "call", String.class, Object[].class, KeyHolder.class);
            } else {
              tempMethod =
                  tempClass.getDeclaredMethod(
                      "select", String.class, Object[].class, RowMapper.class);
            }
            txAtt = computeTransactionAttribute(tempMethod, tempClass);
          } catch (NoSuchMethodException e) {
            logger.warn(
                "no [update] method adapter. exception messager is : " + e.getLocalizedMessage());
            txAtt = NULL_TRANSACTION_ATTRIBUTE;
          }
        } else {
          txAtt = computeTransactionAttribute(method, targetClass);
        }

        // Put it in the cache.
        if (txAtt == null) {
          this.attributeCache.put(cacheKey, NULL_TRANSACTION_ATTRIBUTE);
        } else {
          if (logger.isDebugEnabled()) {
            logger.debug(
                "Adding transactional method '" + method.getName() + "' with attribute: " + txAtt);
          }
          this.attributeCache.put(cacheKey, txAtt);
        }
        return txAtt;
      }
    }