pátek 14. března 2014

Auto(H)Key a formátování SQL

V Javě se obecně nedoporučuje používat SQL výrazy uvnitř metod. Takové konstrukce se špatně testují, refaktorují a dohledávají. Vhodnější postup je SQL externalizovat. Nicméně ne vždy je toto možné. To obzvláště platí pro složitější skládané dotazy. Vývojové nástroje jako Eclipse, NetBeans sice nepodporují "pěkné" formátování SQL výrazů, ale tento nedostatek lze snadno vyřešit přes externí program. Externí formátovací utilitku provážeme s konkrétní IDE přes AutoKey nebo AutoHKey tak, že nadefinijume klávesovou zkratku, která volá formátovač. Autokey vloží obsah clipboardu do stdin formátovače, který zpracovaný text vloží na stdout a ten se, opět  přes AutoKey, plácne třeba do editoru v eclipse. Jak jednoduché.

Formátovací utilita jsqlformatter  umí zpracovat SQL výraz zadaný ve Stringu, StringBufferua StringBuilderu.

Příklad:
sb.append(" select ");
sb.append(" home_url, ");
sb.append(" user_first_name ");
sb.append(" from ");
sb.append(User.TABLE);
sb.append(" WHERE ");
sb.append(" url LIKE '" + like + "' ");
sb.append(" and user_id != " + userId);
sb.append(" order by");
sb.append(" NLSSORT(user_first_name,'NLS_SORT=XWEST_EUROPEAN')");
výstup:
"SELECT " +
        "home_url,  user_first_name  " +
"FROM " +
        User.TABLE + " " +
"WHERE " +
        "url LIKE '" +  like + "'  " +
        "AND user_id != " +  userId + " " +
"ORDER BY " +
        "NLSSORT(user_first_name, " +
        "'NLS_SORT=XWEST_EUROPEAN')";

Aby se zabránilo opětovnému přeformátování textu formátovačem IDE, tak se pěkný SQL výraz zabalí do:

// @formatter:off
...
// @formatter:on