You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Ilya Boyandin <Il...@fh-joanneum.at> on 2007/08/31 18:52:12 UTC
JavaBean and Map parameters
Hello all,
what should I prefer, this:
return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
Object() {
long getPersonId() { return personId; }
String getLang() { return lang; }
});
or this:
final Map<String, Object> params = new HashMap<String, Object>(2);
params.put("personId", personId);
params.put("lang", lang);
return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
params);
Thanks in advance
Ilya
FH JOANNEUM Gesellschaft mbH
Rechtsform/Legal form: GmbH
Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
Firmenbuchnummer/Company registration: FN 125888 f
DVR: 0813559
UID-Nr.: ATU 42361001
Re: JavaBean and Map parameters
Posted by Jiming Liu <ji...@gmail.com>.
I dont know how iBatis set the properties of a bean. In case it uses
reflection, it surely will slower than hashmap. But if it uses the
bean.set...(...) directly, i believe it is faster than hashmap.
Jiming
On 9/3/07, Larry Meadors <lm...@apache.org> wrote:
>
> I don't know about the performance - a hashmap is pretty fast for
> retrieval. (FYI: the constructor you use there will cause slower
> performance - the default would use more memory, but be faster - using
> 3 or 4 as the parameter might be better, read the javadocs on that
> one.)
>
> The parameter checking is an interesting idea - I'm just not sure that
> it makes it much less error prone - in both cases, you need to type
> (or paste) the names.
>
> Larry
>
>
> On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
> >
> > Thanks, Larry!
> >
> > but could you tell me why? I thought using an anonymous class has an
> > important advantage: it allows loading-time parameter check. Also I
> > think it should be faster than using HashMap. Isn't it true?
> >
> > Ilya
> >
> > Larry Meadors wrote:
> > > Well, they should both do the same thing...I'd use the map. :)
> > >
> > > Larry
> > >
> > >
> > > On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
> > >
> > >> Hello all,
> > >>
> > >> what should I prefer, this:
> > >>
> > >> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
> new
> > >> Object() {
> > >> long getPersonId() { return personId; }
> > >> String getLang() { return lang; }
> > >> });
> > >>
> > >> or this:
> > >>
> > >> final Map<String, Object> params = new HashMap<String, Object>(2);
> > >> params.put("personId", personId);
> > >> params.put("lang", lang);
> > >> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
> > >> params);
> > >>
> > >> Thanks in advance
> > >> Ilya
> > >>
> >
> >
> >
> > FH JOANNEUM Gesellschaft mbH
> > Rechtsform/Legal form: GmbH
> > Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
> > Firmenbuchnummer/Company registration: FN 125888 f
> > DVR: 0813559
> > UID-Nr.: ATU 42361001
> >
>
Re: JavaBean and Map parameters
Posted by Ilya Boyandin <Il...@fh-joanneum.at>.
Thank you, now everything is clear :)
Best regards
Ilya
Larry Meadors wrote:
> Heh, I think I wrote that part. :-)
>
> You can't reliably refer to an *anonymous* inner class by name (hence
> the anonymous part - IIRC, they are assigned names by location
> MyClass$1, MyClass$2, etc), so you can't safely put the name in your
> mapped statement, so iBATIS doesn't do that load time checking
> (because it doesn't know the parameter class name).
>
> For load time checking to work, the parameter class name has to be
> associated with the mapped statement (either as an explicit parameter
> map, or a parameterClass attribute).
>
> Larry
>
>
> On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
>> Hi Larry,
>>
>> Larry Meadors wrote:
>>
>>> I don't know about the performance - a hashmap is pretty fast for
>>> retrieval. (FYI: the constructor you use there will cause slower
>>> performance - the default would use more memory, but be faster - using
>>> 3 or 4 as the parameter might be better, read the javadocs on that
>>> one.)
>>>
>>>
>> Oh sure, I forgot about the .75 load factor. Thanks for telling me this!
>> I agree in this case it's better not to use the parameter at all.
>>
>>
>>> The parameter checking is an interesting idea - I'm just not sure that
>>> it makes it much less error prone - in both cases, you need to type
>>> (or paste) the names.
>>>
>>>
>> It's not my idea, actually. I found it in the section "JavaBean and Map
>> parameters" of "iBatis in Action". It sais:
>> "If you create a parameter map with a bean and attempt to refer to a
>> property that does not exist, you will get an immediate failure when the
>> parameter map is loaded." I tested it now with the anonymous parameter
>> class I cited before and it doesn't seem to work as described: the
>> "There is no READABLE property named" exception is thrown only when the
>> query is called, not when the map is loaded. I think I got something
>> wrong again :)
>>
>> Regards
>> Ilya
>>
>>
>>
>>> On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>>>
>>>
>>>> Thanks, Larry!
>>>>
>>>> but could you tell me why? I thought using an anonymous class has an
>>>> important advantage: it allows loading-time parameter check. Also I
>>>> think it should be faster than using HashMap. Isn't it true?
>>>>
>>>> Ilya
>>>>
>>>> Larry Meadors wrote:
>>>>
>>>>
>>>>> Well, they should both do the same thing...I'd use the map. :)
>>>>>
>>>>> Larry
>>>>>
>>>>>
>>>>> On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Hello all,
>>>>>>
>>>>>> what should I prefer, this:
>>>>>>
>>>>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
>>>>>> Object() {
>>>>>> long getPersonId() { return personId; }
>>>>>> String getLang() { return lang; }
>>>>>> });
>>>>>>
>>>>>> or this:
>>>>>>
>>>>>> final Map<String, Object> params = new HashMap<String, Object>(2);
>>>>>> params.put("personId", personId);
>>>>>> params.put("lang", lang);
>>>>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
>>>>>> params);
>>>>>>
>>>>>> Thanks in advance
>>>>>> Ilya
FH JOANNEUM Gesellschaft mbH
Rechtsform/Legal form: GmbH
Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
Firmenbuchnummer/Company registration: FN 125888 f
DVR: 0813559
UID-Nr.: ATU 42361001
Re: JavaBean and Map parameters
Posted by Larry Meadors <lm...@apache.org>.
Heh, I think I wrote that part. :-)
You can't reliably refer to an *anonymous* inner class by name (hence
the anonymous part - IIRC, they are assigned names by location
MyClass$1, MyClass$2, etc), so you can't safely put the name in your
mapped statement, so iBATIS doesn't do that load time checking
(because it doesn't know the parameter class name).
For load time checking to work, the parameter class name has to be
associated with the mapped statement (either as an explicit parameter
map, or a parameterClass attribute).
Larry
On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
> Hi Larry,
>
> Larry Meadors wrote:
> > I don't know about the performance - a hashmap is pretty fast for
> > retrieval. (FYI: the constructor you use there will cause slower
> > performance - the default would use more memory, but be faster - using
> > 3 or 4 as the parameter might be better, read the javadocs on that
> > one.)
> >
> Oh sure, I forgot about the .75 load factor. Thanks for telling me this!
> I agree in this case it's better not to use the parameter at all.
>
> > The parameter checking is an interesting idea - I'm just not sure that
> > it makes it much less error prone - in both cases, you need to type
> > (or paste) the names.
> >
> It's not my idea, actually. I found it in the section "JavaBean and Map
> parameters" of "iBatis in Action". It sais:
> "If you create a parameter map with a bean and attempt to refer to a
> property that does not exist, you will get an immediate failure when the
> parameter map is loaded." I tested it now with the anonymous parameter
> class I cited before and it doesn't seem to work as described: the
> "There is no READABLE property named" exception is thrown only when the
> query is called, not when the map is loaded. I think I got something
> wrong again :)
>
> Regards
> Ilya
>
>
> > On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
> >
> >> Thanks, Larry!
> >>
> >> but could you tell me why? I thought using an anonymous class has an
> >> important advantage: it allows loading-time parameter check. Also I
> >> think it should be faster than using HashMap. Isn't it true?
> >>
> >> Ilya
> >>
> >> Larry Meadors wrote:
> >>
> >>> Well, they should both do the same thing...I'd use the map. :)
> >>>
> >>> Larry
> >>>
> >>>
> >>> On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
> >>>
> >>>
> >>>> Hello all,
> >>>>
> >>>> what should I prefer, this:
> >>>>
> >>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
> >>>> Object() {
> >>>> long getPersonId() { return personId; }
> >>>> String getLang() { return lang; }
> >>>> });
> >>>>
> >>>> or this:
> >>>>
> >>>> final Map<String, Object> params = new HashMap<String, Object>(2);
> >>>> params.put("personId", personId);
> >>>> params.put("lang", lang);
> >>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
> >>>> params);
> >>>>
> >>>> Thanks in advance
> >>>> Ilya
> >>>>
> >>>>
>
>
>
> FH JOANNEUM Gesellschaft mbH
> Rechtsform/Legal form: GmbH
> Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
> Firmenbuchnummer/Company registration: FN 125888 f
> DVR: 0813559
> UID-Nr.: ATU 42361001
>
Re: JavaBean and Map parameters
Posted by Ilya Boyandin <Il...@fh-joanneum.at>.
Hi Larry,
Larry Meadors wrote:
> I don't know about the performance - a hashmap is pretty fast for
> retrieval. (FYI: the constructor you use there will cause slower
> performance - the default would use more memory, but be faster - using
> 3 or 4 as the parameter might be better, read the javadocs on that
> one.)
>
Oh sure, I forgot about the .75 load factor. Thanks for telling me this!
I agree in this case it's better not to use the parameter at all.
> The parameter checking is an interesting idea - I'm just not sure that
> it makes it much less error prone - in both cases, you need to type
> (or paste) the names.
>
It's not my idea, actually. I found it in the section "JavaBean and Map
parameters" of "iBatis in Action". It sais:
"If you create a parameter map with a bean and attempt to refer to a
property that does not exist, you will get an immediate failure when the
parameter map is loaded." I tested it now with the anonymous parameter
class I cited before and it doesn't seem to work as described: the
"There is no READABLE property named" exception is thrown only when the
query is called, not when the map is loaded. I think I got something
wrong again :)
Regards
Ilya
> On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
>> Thanks, Larry!
>>
>> but could you tell me why? I thought using an anonymous class has an
>> important advantage: it allows loading-time parameter check. Also I
>> think it should be faster than using HashMap. Isn't it true?
>>
>> Ilya
>>
>> Larry Meadors wrote:
>>
>>> Well, they should both do the same thing...I'd use the map. :)
>>>
>>> Larry
>>>
>>>
>>> On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>>>
>>>
>>>> Hello all,
>>>>
>>>> what should I prefer, this:
>>>>
>>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
>>>> Object() {
>>>> long getPersonId() { return personId; }
>>>> String getLang() { return lang; }
>>>> });
>>>>
>>>> or this:
>>>>
>>>> final Map<String, Object> params = new HashMap<String, Object>(2);
>>>> params.put("personId", personId);
>>>> params.put("lang", lang);
>>>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
>>>> params);
>>>>
>>>> Thanks in advance
>>>> Ilya
>>>>
>>>>
FH JOANNEUM Gesellschaft mbH
Rechtsform/Legal form: GmbH
Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
Firmenbuchnummer/Company registration: FN 125888 f
DVR: 0813559
UID-Nr.: ATU 42361001
Re: JavaBean and Map parameters
Posted by Larry Meadors <lm...@apache.org>.
I don't know about the performance - a hashmap is pretty fast for
retrieval. (FYI: the constructor you use there will cause slower
performance - the default would use more memory, but be faster - using
3 or 4 as the parameter might be better, read the javadocs on that
one.)
The parameter checking is an interesting idea - I'm just not sure that
it makes it much less error prone - in both cases, you need to type
(or paste) the names.
Larry
On 9/3/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
> Thanks, Larry!
>
> but could you tell me why? I thought using an anonymous class has an
> important advantage: it allows loading-time parameter check. Also I
> think it should be faster than using HashMap. Isn't it true?
>
> Ilya
>
> Larry Meadors wrote:
> > Well, they should both do the same thing...I'd use the map. :)
> >
> > Larry
> >
> >
> > On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
> >
> >> Hello all,
> >>
> >> what should I prefer, this:
> >>
> >> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
> >> Object() {
> >> long getPersonId() { return personId; }
> >> String getLang() { return lang; }
> >> });
> >>
> >> or this:
> >>
> >> final Map<String, Object> params = new HashMap<String, Object>(2);
> >> params.put("personId", personId);
> >> params.put("lang", lang);
> >> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
> >> params);
> >>
> >> Thanks in advance
> >> Ilya
> >>
>
>
>
> FH JOANNEUM Gesellschaft mbH
> Rechtsform/Legal form: GmbH
> Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
> Firmenbuchnummer/Company registration: FN 125888 f
> DVR: 0813559
> UID-Nr.: ATU 42361001
>
Re: JavaBean and Map parameters
Posted by Ilya Boyandin <Il...@fh-joanneum.at>.
Thanks, Larry!
but could you tell me why? I thought using an anonymous class has an
important advantage: it allows loading-time parameter check. Also I
think it should be faster than using HashMap. Isn't it true?
Ilya
Larry Meadors wrote:
> Well, they should both do the same thing...I'd use the map. :)
>
> Larry
>
>
> On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
>> Hello all,
>>
>> what should I prefer, this:
>>
>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
>> Object() {
>> long getPersonId() { return personId; }
>> String getLang() { return lang; }
>> });
>>
>> or this:
>>
>> final Map<String, Object> params = new HashMap<String, Object>(2);
>> params.put("personId", personId);
>> params.put("lang", lang);
>> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
>> params);
>>
>> Thanks in advance
>> Ilya
>>
FH JOANNEUM Gesellschaft mbH
Rechtsform/Legal form: GmbH
Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
Firmenbuchnummer/Company registration: FN 125888 f
DVR: 0813559
UID-Nr.: ATU 42361001
Re: JavaBean and Map parameters
Posted by Larry Meadors <lm...@apache.org>.
Well, they should both do the same thing...I'd use the map. :)
Larry
On 8/31/07, Ilya Boyandin <Il...@fh-joanneum.at> wrote:
>
> Hello all,
>
> what should I prefer, this:
>
> return getSqlMapClientTemplate().queryForList("listEvaluationPlans", new
> Object() {
> long getPersonId() { return personId; }
> String getLang() { return lang; }
> });
>
> or this:
>
> final Map<String, Object> params = new HashMap<String, Object>(2);
> params.put("personId", personId);
> params.put("lang", lang);
> return getSqlMapClientTemplate().queryForList("listEvaluationPlans",
> params);
>
> Thanks in advance
> Ilya
>
>
>
>
> FH JOANNEUM Gesellschaft mbH
> Rechtsform/Legal form: GmbH
> Firmenbuchgericht/Court of registry: Landesgericht für ZRS Graz
> Firmenbuchnummer/Company registration: FN 125888 f
> DVR: 0813559
> UID-Nr.: ATU 42361001
>