I am using IntelliJ 13 as an IDE for a project where communication with DB is done via Spring's JDBC Template. When I have code fragments in Java like the following one:
getJdbcTemplate().queryForObject("SELECT CONVERT(VARCHAR(255), NEWID())", String.class);
where getJdbcTemplate() returns initialized JdbcTemplate object, the IDE has proper syntax highlighting for the SQL statement (you can see it on the snippet bellow):
.code {font-family: Monospace}
.db-stmt {background: #EDFCED}
.db-keyword {color: #000080; font-weight: bold;}
.db-column {color: #7D0C8D; font-weight: bold;}
.db-number {color: #0000FF;}
.java-class {color: #39008E; font-weight: bold;}
<span class="code">getJdbcTemplate().queryForObject("<span class="db-stmt"><span class="db-keyword">SELECT CONVERT</span>(<span class="db-keyword">VARCHAR</span>(<span class="db-number">255</span>), NEWID())</span>", String.<span class="java-class">class</span>);</span>
However, when I use another method, created by me:
protected String queryForString(String sql, Object... args) {
try {
return getJdbcTemplate().queryForObject(sql, String.class, args);
}
catch (RuntimeException e) {
return null;
}
}
for the same query:
queryForString("SELECT CONVERT(VARCHAR(255), NEWID())");
there is no syntax highlighting of the SQL statement.
Do you know how to enable syntax highlighting of SQL staments for Java stings that are not arguments of methonds of JdbcTemplate or java.sql interfaces?
You can do this via 1) a setting 2) an annotation, and/or 3) a comment. For any of these, you must have the (bundled) IntelliLang
Plugin enabled.
Setting
You can add a setting to say that a particular method's parameter is of a certain 'language' (SQL for example.)
- Open Setting (Ctrl+Alt+S / ⌘,) > Editor > Language Injections
- On the right, click the add button and select
Java Parameter
- In the Language Injection Settings dialog, select
SQL
(or the desired language) in the ID field
- You can also specify a specific SQL dialect such as
MySQL
, Oracle
, etc.
- In the "Class Methods" field, enter the method you want to identify as taking an
SQL
parameter. You can open a class browser/search window via the ellipsis button
- You can select classes from your code, or from libraries
- If your method takes multiple parameters, you can select the parameter in the dialog:
Now IntelliJ IDEA will automatically apply language injection when you use that method:
Annotations
You can annotate a method parameter (or variable or field) as being of a particular language type. By default, IntelliJ IDEA will use the org.intellij.lang.annotations.Language
annotation that is in the annotations.jar
included with IntelliJ IDEA. It is located at <installDirectory>/redist/annotations.jar
or in maven central: g:"com.intellij" AND a:"annotations" (Note: The latest jar in maven central is from version 12. It has everything you need. A non related annotation was added in v14. I'll upload the jars from v13 and v14 to maven central today (as I've been the one to do such in the past and have been meaning to update them). But it takes a few days to process through the system.)
Add the annotations JAR to your class path. Then annotate your method's Parameter as being SQL. Note that code completion will work when you type the language type:
public void checkDatabase(String foo, @Language("SQL")String sql, String bar)
I like the annotation since even for non-IntelliJ IDEA users, it lets them know that a String should be valid SQL, XML, CSS, or whatever. You can also annotate a variable, or field:
If desired, you can change the annotation to use in Setting (Ctrl+Alt+S / ⌘,) > Editor > Language Injections > Advanced
Comment
As an alternative to annotations, you can use a comment. (I can't remember when this was added. So it may not be in v13). To the best of my knowledge though, language injection via comments only works for variables and fields. It does not work for parameters. For example:
P.S. See the help topics Help > Manuals > General Guidelines > Using Language Injections (available online here) and Help > Manuals > Language and Frameworks - Specific Guidelines > IntelliLang (available online here) for more information.