Even though iBATIS offers a very good performance-to-code complexity ratio, several features are missing. Perhaps the most annoying absence is lack of support for persistent enumerations and object canonicalization.
Take a User domain object for example. Usually a limited number of Roles are used in the system. If a User object has a userRole property, a select statement that returned 1,000 User objects also creates 1,000 UserRole objects, even though most of the UserRole objects actually represent the same Role. This is very inefficient and results in a lot of memory being used up. This is a similar situation to java.lang.Boolean where you can create 1,000 Booleans that represent Boolean.TRUE. Even though these 1,000 objects represent the same information, you have 1,000 distinct objects. Another side effect is that you have to use the equals(Object) method to compare the values whereas if you had 1,000 references to the same object, you could use the == operator.
Finally, a persistent enumeration would be a nice addition to iBATIS. Hibernate allows you to use persistent enumeration. This is actually an object that has public static <T> fromInt() and public int toInt() methods, which return an int value that represents value in the enumeration. Hibernate, however, creates instance of the object.
The issues just discussed are the only problems in iBATIS we can think of, which makes it an exceptional DAO framework.