ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Poitras Christian <Christian.Poit...@ircm.qc.ca>
Subject RE: Ibatis 3.0 Bugs/Suggestions
Date Mon, 21 Sep 2009 15:00:02 GMT
For point 5, it seems type handlers are ignored when simple types are set as resultType.


I have a select.

<select id="selectHasRole" resultType="java.lang.Boolean" parameterType="ca.qc.ircm.lims.persistence.mapper.AuthenticatingMapper$RoleTest">

The log does not show my boolean type handler...

2009-09-21 10:55:29,579 - DEBUG - debug - <== Columns: [COUNT(*)] - org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl
- (Christian.Poitras@ircm.qc.ca) - 26

2009-09-21 10:55:29,579 - DEBUG - debug - <== Row: [0] - org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl
- (Christian.Poitras@ircm.qc.ca) - 26

2009-09-21 10:55:29,595 - ERROR - logger - java.lang.Long - ca.qc.ircm.lims.web.handler.ExceptionHandler
- (Christian.Poitras@ircm.qc.ca) - 36

java.lang.ClassCastException: java.lang.Long

at $Proxy82.selectHasRole(Unknown Source)

at ca.qc.ircm.lims.service.AuthenticatingServiceDefault.hasRole(AuthenticatingServiceDefault.java:63)


Curiously enough, the type handler is used when it's a property of a complex object.

I'll create a JIRA for this.


Christian

________________________________
From: Clinton Begin [mailto:clinton.begin@gmail.com]
Sent: Sunday, August 16, 2009 1:13 PM
To: user-java@ibatis.apache.org
Subject: Re: Ibatis 3.0 Bugs/Suggestions

I've made it through these items... don't take offence to the strikethroughs, I used your
list as a sort of TODO list.  :-)

Your comments were very helpful, and offered a different perspective for both the software
and the documentation.  It's always amazing how one person might thing something is self explanatory
and clear as day, and another sees something completely different.  :-)  I've  implemented
the doc advice, and addressed some of the other points below.

Cheers,
Clinton

1) http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd
Getting error if I try to add either <typeAliases> or <typeAlias> in a mapper
xml file. Works only in a Configuration.xml file.

This is intentional.  TypeAliases are all defined in the config now.  The old way left it
ambiguous as to which type was being referenced, and it became more complicated with cross-mapping
references to ResultMaps or statements in other mapping files.

2) session.select
I am able to invoke the three param .select(arg0, arg1, arg2) but not .select(id, param).
The id/param select isn't available.

This is a documentation problem if it's not clear.  I'll see what I can do to clear it up.
  In a nutshell:

.selectOne is the equivalent of the old queryForObject -- use it when selecting one instance
of your result object.
.selectList is the equivalent of the old queryForList -- use it when selecting a list of your
result objects.
.select is used when you want to control how your results are loaded with the ResultHandler.

And I think you're right, I don't believe I documented the ResultHandler impl.

3) Is there anyway we can keep the colon syntax for defining jdbcType. It could be in addition
to the comma seperated diffinations. Just looks cleaner and is much shorter:
e.g. #{timeZone,jdbcType=VARCHAR} vs #{timeZone:VARCHAR}

Certainly there's a way.  :-)  You make a good argument, and I think we can support it.  I'll
try to get it in for the next Beta.

4) It would be nice to have a more straight forward way to get access to Connection
       sqlSession.getConfiguration().getEnvironment().getDataSource().getConnection();
       vs sqlSession.getConnection();

I'll think about that one.  My gut tells me we probably won't support that.  While it would
save some typing, we want to discourage it.  The challenge is that sometimes iBATIS can be
configured without a datasource (although we also want to discourage that if you want to use
lazy loading). Maybe this is something best left to a quick little utility method.

5)  ... I get a "Casting Exception". Apparently a Long is returned instead of a Boolean. I
am running on a mysql database. As you know, mysql deals with booleans as bits (1's or 0's).
Oddly enough this works fine in the ibatis 2.x versions.

iBATIS 3 is more strict in the typing.   JDBC has a get/setBoolean method pair, so be sure
to define your result type as boolean, then this should work.  Otherwise you're literally
trying to cast an integer to a boolean.  Note that this relies on the driver's support for
translating the 1/0 during the call to get/setBoolean.  Otherwise you'll need to create a
DB specific type handler.

6) Not sure if this will be of any use to anyone, but I've written a CalendarTypeHandler.
On the surface, it seems to be working fine

I'll create a section on the wiki for contributed type handlers.... once our wiki is back
up!  Ticket submitted to atlassian...

7) Picky user guide stuff
The User guide is overall very clean, complete, and clear. Great job!!!

a)"....There are two TransactionManager types (i.e. type="?????") that are in...". What is
the ???? suppose to be?
b) An explanation about the Enum type handler would be nice (like what's persisted, code or
index. Is it configurable?)
c) "The iBATIS XML configuration file is contains settings and properties that have a dramatic
effect on how..." Get rid of "is"

All addressed... thanks for keeping these notes.

8) What .selectOne() is isn't clear. Maybe a note that an exception will be thrown if either
a list or a null is returned?

I added a bit to the doc to hopefully clear this up.




On Sat, Aug 15, 2009 at 7:31 PM, I L<isster@hotmail.com<mailto:isster@hotmail.com>>
wrote:
> Hi,
>
> Awesome product renovation.
>
> Heres some things I found that might have already been discussed:
>
> 1) http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd
> Getting error if I try to add either <typeAliases> or <typeAlias> in a
> mapper xml file. Works only in a Configuration.xml file.
>
> 2) session.select
> I am able to invoke the three param .select(arg0, arg1, arg2) but not
> .select(id, param). The id/param select isn't available.
>
> There is no examples in the pdf on how to use the three param select.
>
> 3) Is there anyway we can keep the colon syntax for defining jdbcType. It
> could be in addition to the comma seperated diffinations. Just looks cleaner
> and is much shorter:
> e.g. #{timeZone,jdbcType=VARCHAR} vs #{timeZone:VARCHAR}
>
> e.g.
>    count != #{usercount,jdbcType=BIGINT} vs count != #{usercount:BIGINT}
>
>
> 4) It would be nice to have a more straight forward way to get access to
> Connection
>
> sqlSession.getConfiguration().getEnvironment().getDataSource().getConnection();
>        vs
>        sqlSession.getConnection();
>
> 5)
>     <select id="isUniqueUsername"  parameterType="map"
> resultType="boolean">
>         SELECT (count(*) = 0)
>         FROM user Where 1=0
>     </select>
>
> If I access this select the old fashion way:
>        ((Boolean) getSession().selectOne("User.isUniqueUsername",
> map)).booleanValue();
>
> ... I get a "Casting Exception". Apparently a Long is returned instead of a
> Boolean. I am running on a mysql database. As you know, mysql deals with
> booleans as bits (1's or 0's). Oddly enough this works fine in the ibatis
> 2.x versions.
>
> 6) Not sure if this will be of any use to anyone, but I've written a
> CalendarTypeHandler. On the surface, it seems to be working fine
>
>
> public class CalendarTypeHandler extends BaseTypeHandler {
>
>     public void setNonNullParameter(PreparedStatement ps, int i, Object
> parameter, JdbcType jdbcType) throws SQLException {
>         Calendar calendar = (Calendar) parameter;
>         ps.setTimestamp(i, (new Timestamp(calendar.getTimeInMillis())));
>     }
>
>     public Object getNullableResult(ResultSet rs, String columnName) throws
> SQLException {
>         java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName);
>         if (sqlTimestamp != null) {
>             return new java.util.Date(sqlTimestamp.getTime());
>         }
>         return null;
>     }
>
>     public Object getNullableResult(CallableStatement cs, int columnIndex)
> throws SQLException {
>         java.sql.Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);
>         if (sqlTimestamp != null) {
>             return new java.util.Date(sqlTimestamp.getTime());
>         }
>         return null;
>     }
>
> }
>
> 7) Picky user guide stuff
> The User guide is overall very clean, complete, and clear. Great job!!!
>
> a)"....There are two TransactionManager types (i.e. type="?????") that are in...".
> What is the ???? suppose to be?
> b) An explanation about the Enum type handler would be nice (like what's
> persisted, code or index. Is it configurable?)
> c)
> "The iBATIS XML configuration file is contains settings and properties that have a dramatic
effect on how..."
> Get rid of "is"
>
> 8) What .selectOne() is isn't clear. Maybe a note that an exception will be
> thrown if either a list or a null is returned?
>
>
> Thats all I have found so far. Cheers!
>
>
> ________________________________
> Windows Live(tm): Keep your life in sync. Check it out.


Mime
View raw message