Whether or not using parameters is more efficient mainly depends on your use case. When you monitor the times spent in preparation and execution of statements, you will notice, that preparation of statements is somtimes siginificantly more expensive than the actual execution, so it depends, whether you can save on prepares.
You will always win in a scenario like this:
PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
stmt.setInt(1, y);
stmt.executeQuery();
...
because you save on the prepare-times. This is DBMS independent.
Some DBMS do some server side caching. What and how they do it is highly vendor and even version-specific. However, we have learned that in Oracle-DBMS parametrised statements which are used more often do sometimes get quite a speed-up in such a scenario:
PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
PreparedStatement stmt2 = dbConnection.prepareStatement(...);
stmt2.setInt(1, y);
stmt2.executeQuery();
...
Here the server is able to identify that both statements are essentially the same and prepare-times for the second statement were significantly reduced. This does not work for fixed-string statements because the server cannot determine, they are the same.
I don't think, you will find a scenario, where using parametrized statements are measurable slower than fixed-string-statements but a lot of scenarios, where its the other way around.