ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeff Butler <jeffgbut...@gmail.com>
Subject Re: Need support for Dynamic procedure invocation
Date Tue, 25 May 2010 13:43:35 GMT
This would be a great time to switch to mybatis and usa a
@SelectProvider to write the query exactly as you need it. I think
that the dynamic SQL tags won't work in this case.

Jeff Butler


On 5/25/10, Nicky Jha <nicky.jha@jpmchase.com> wrote:
> Hi
>
> Is there a way I can modify {call $procedureName$ <iterate property="params"
> open="(" close=")"
>  conjunction=",">#params[]#</iterate> } to include jdbc types also, so that
> I can pass null value to database?
>
> Thanks
> Nicky
>
>
>
> -----Original Message-----
> From: Nicky Jha
> Sent: Tuesday, May 25, 2010 11:12 AM
> To: 'user-java@ibatis.apache.org'
> Subject: RE: Need support for Dynamic procedure invocation
>
> Joe/Jeff
> Please help.
>
> this class is not part of framework, this is approach, we have used in case
> our procedure changes at runtime, so will its parameter.For that we using
>
> public class DynamicProcedureParams {
>>>   private String procedureName;
>>>   private List<Object> params = new ArrayList<Object>();
>>>
>>>   // getters and setters here
>>> }
>>>
>>> <procedure id="executeCopyProcs"
>>> parameterClass="path.to.DynamicProcedureParams">
>>> {call $procedureName$ <iterate property="params" open="(" close=")"
>>> conjunction=",">#params[]#</iterate> }
>>> </procedure>
>>>
>
> Thanks
> Nicky
>
>
>
>
> -----Original Message-----
> From: Clinton Begin [mailto:clinton.begin@gmail.com]
> Sent: Tuesday, May 25, 2010 11:07 AM
> To: user-java@ibatis.apache.org
> Subject: Re: Need support for Dynamic procedure invocation
>
> I'm not familiar with that class, as it's not part of the framework
> (maybe post it here).  Short story is that JDBC requires nullable
> column types to be specified.  Ibatis allows for this in the parameter
> map (crack open the user guide and search for "jdbcType" for more).
>
> Cheers,
> Clinton
>
>
>
> On 2010-05-24, Nicky Jha <nicky.jha@jpmchase.com> wrote:
>> Hi
>>
>> I am using parameter class DynamicProcedureParams(as sugessted by Joe
>> Gooch
>> ), as my requirement was to build paramaters at run time, so with this
>> approach where can I set jdbcType?
>>
>> Nicky
>>
>> From: Clinton Begin [mailto:clinton.begin@gmail.com]
>> Sent: Tuesday, May 25, 2010 10:39 AM
>> To: user-java@ibatis.apache.org
>> Subject: Re: Need support for Dynamic procedure invocation
>>
>> Are you setting the jdbcType in your parameter map for all nullable
>> columns?
>>
>> Clinton
>> On Mon, May 24, 2010 at 11:03 PM, Nicky Jha
>> <nicky.jha@jpmchase.com<mailto:nicky.jha@jpmchase.com>> wrote:
>>
>> Hi
>>
>> with approach mentioned below(DynamicProcedureParams) , I want to also
>> pass
>> some of parameter as null((private List<Object> params = new
>> ArrayList<Object>(); params.add(null))), but when I pass string value as
>> null , it executes parametes procedure as
>>
>> call procname(?,?,?,?,?)
>> Parameters: [#IMNT_RISK_SENSITIVITY, IMNT_RISK_SENSITIVITY, null, null, 0]
>> Types: [java.lang.String, java.lang.String, null, null, java.lang.Byte]
>>
>> I want type to be java.lang.String instead of null(as with null, I am
>> getting Unsupported SQL type 0 )
>>
>> If I pass blank string "" in place of null in (private List<Object> params
>> =
>> new ArrayList<Object>(); params.add("")), Types become java.lang.String,
>> but
>> then I think it no more considers it as null.
>>
>> Please help
>>
>> Thanks
>> Nicky
>>
>>
>>
>> -----Original Message-----
>> From: Nicky Jha
>> Sent: Friday, May 14, 2010 8:46 PM
>> To: 'user-java@ibatis.apache.org<mailto:user-java@ibatis.apache.org>'
>> Subject: RE: Need support for Dynamic procedure invocation
>>
>> Joe/Jeff
>>
>> This worked with your suggestion.Thank you so much!!!
>>
>> Nicky
>>
>> -----Original Message-----
>> From: Jeff Butler
>> [mailto:jeffgbutler@gmail.com<mailto:jeffgbutler@gmail.com>]
>> Sent: Friday, May 14, 2010 6:31 PM
>> To: user-java@ibatis.apache.org<mailto:user-java@ibatis.apache.org>
>> Subject: Re: Need support for Dynamic procedure invocation
>>
>> Yes - this the best approach.
>>
>> Jeff Butler
>>
>>
>> On 5/14/10, Joe Gooch
>> <mrwizard@k12system.com<mailto:mrwizard@k12system.com>> wrote:
>>> I suggest going with a dynamic SQL approach in the mapped statement.
>>>
>>> public class DynamicProcedureParams {
>>>   private String procedureName;
>>>   private List<Object> params = new ArrayList<Object>();
>>>
>>>   // getters and setters here
>>> }
>>>
>>> <procedure id="executeCopyProcs"
>>> parameterClass="path.to.DynamicProcedureParams">
>>> {call $procedureName$ <iterate property="params" open="(" close=")"
>>> conjunction=",">#params[]#</iterate> }
>>> </procedure>
>>>
>>>
>>>
>>> Joe
>>>
>>> Confidentiality Notice:
>>> This e-mail transmission may contain confidential and legally privileged
>>> information that is intended only for the individual named in the e-mail
>>> address. If you are not the intended recipient, you are hereby notified
>>> that
>>> any disclosure, copying, distribution, or reliance upon the contents of
>>> this
>>> e-mail message is strictly prohibited. If you have received this e-mail
>>> transmission in error, please reply to the sender, so that proper
>>> delivery
>>> can be arranged, and please delete the message from your mail box.
>>>
>>>> -----Original Message-----
>>>> From: Nicky Jha
>>>> [mailto:nicky.jha@jpmchase.com<mailto:nicky.jha@jpmchase.com>]
>>>> Sent: Friday, May 14, 2010 7:38 AM
>>>> To: user-java@ibatis.apache.org<mailto:user-java@ibatis.apache.org>
>>>> Subject: RE: Need support for Dynamic procedure invocation
>>>>
>>>> Hi Jeff,
>>>>
>>>> Thanks for this, if I was to do as suggested and compose the entire
>>>> string with parameter values, how will the parameter types (e.g. date,
>>>> smallint etc) be handled?
>>>>
>>>> Nicky!
>>>>
>>>> -----Original Message-----
>>>> From: Jeff Butler
>>>> [mailto:jeffgbutler@gmail.com<mailto:jeffgbutler@gmail.com>]
>>>> Sent: Friday, May 14, 2010 4:53 PM
>>>> To: user-java@ibatis.apache.org<mailto:user-java@ibatis.apache.org>
>>>> Subject: Re: Need support for Dynamic procedure invocation
>>>>
>>>> This won't work (as you've discovered).  iBATIS 2.x does not reparse
>>>> the string for variables after string substitution.  You'll need to do
>>>> this with the dynamic tags, or you'll need to compose the entire
>>>> string (including parameter values - like {call myproc('fred')}).
>>>>
>>>> Jeff Butler
>>>>
>>>>
>>>> On Fri, May 14, 2010 at 4:12 AM, Nicky Jha
>>>> <nicky.jha@jpmchase.com<mailto:nicky.jha@jpmchase.com>>
>>>> wrote:
>>>> > Hi Team,
>>>> >
>>>> >
>>>> >
>>>> > I am having hard time resolving following issue.Please help.
>>>> >
>>>> > We are using Ibatis 2.X.
>>>> >
>>>> > In our application we want capability to invoke stored procedure by
>>>> reading
>>>> > it from property xml file.We provide procedure name parameters,
>>>> parameters
>>>> > type to  property xml file.
>>>> >
>>>> > Now from this xml file I have created one dynamic procedure string
>>>> like
>>>> >
>>>> procedureName(#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal
>>>> 1#).
>>>> >
>>>> > Now I want to call this procedure from Ibatis SQL mapping XML like
>>>> this
>>>> >
>>>> >
>>>> >
>>>> > <procedure id="executeCopyProcs"
>>>> >
>>>> parameterClass="com.jpmorgan.pyramid.pyrsyst.configure.ProcParameterMap
>>>> per">
>>>> >
>>>> > {call $procedureName$ }
>>>> >
>>>> >
>>>> >
>>>> > </procedure>
>>>> >
>>>> >
>>>> >
>>>> > Please refer below for ProcParameterMapper class. Now as soon as
>>>> iBatis sees
>>>> >  $procedureName$, it replaces it with say
>>>> > (#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal1#) but it
>>>> does
>>>> > not replace the placeHolder(#), it passes on this as it is.Which is
a
>>>> issue.
>>>> >
>>>> >
>>>> >
>>>> > If we type
>>>> >
>>>> procedureName(#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal
>>>> 1)
>>>> > directly into SQL mapping XML, it replaces place holder, but with
>>>> string
>>>> > substitution , it does not work.We can't type directly into mapping
>>>> xML, as
>>>> > this string is composed at run time.Also dynamic tags are not of
>>>> help, as
>>>> > logic to create
>>>> > (#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal1#) complex
>>>> > procedure with different types of parameter can't be written in
>>>> mapping
>>>> > XML.At least I am unable to do.
>>>> >
>>>> >
>>>> >
>>>> > I am really struck.Please suggest us the best way to deal with it.
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> > package com.jpmorgan.pyramid.pyrsyst.configure;
>>>> >
>>>> >
>>>> >
>>>> > import java.lang.reflect.Field;
>>>> >
>>>> >
>>>> >
>>>> > public class ProcParameterMapper {
>>>> >
>>>> >
>>>> >
>>>> >       StringBuffer procedureName = new StringBuffer("");
>>>> >
>>>> >       boolean firstParam = true;
>>>> >
>>>> >       boolean lastParam = false;
>>>> >
>>>> >
>>>> >
>>>> >       String stringVal1;
>>>> >
>>>> >       String stringVal2;
>>>> >
>>>> >       String stringVal3;
>>>> >
>>>> >       String stringVal4;
>>>> >
>>>> >       String stringVal5;
>>>> >
>>>> >       String stringVal6;
>>>> >
>>>> >       String stringVal7;
>>>> >
>>>> >       String stringVal8;
>>>> >
>>>> >       String stringVal9;
>>>> >
>>>> >       String stringVal10;
>>>> >
>>>> >
>>>> >
>>>> >       int intVal1;
>>>> >
>>>> >       int intVal2;
>>>> >
>>>> >       int intVal3;
>>>> >
>>>> >       int intVal4;
>>>> >
>>>> >       int intVal5;
>>>> >
>>>> >       int intVal6;
>>>> >
>>>> >       int intVal7;
>>>> >
>>>> >       int intVal8;
>>>> >
>>>> >       int intVal9;
>>>> >
>>>> >       int intVal10;
>>>> >
>>>> >
>>>> >
>>>> >       byte byteVal1;
>>>> >
>>>> >       byte byteVal2;
>>>> >
>>>> >       byte byteVal3;
>>>> >
>>>> >       byte byteVal4;
>>>> >
>>>> >       byte byteVal5;
>>>> >
>>>> >
>>>> >
>>>> >       public void setStringVal(String value, int count,String
>>>> jdbcType)
>>>> > throws ConfigureException {
>>>> >
>>>> >
>>>> >
>>>> >             Field[] field =
>>>> ProcParameterMapper.class.getDeclaredFields();
>>>> >
>>>> >
>>>> >
>>>> >             for (int i = 0; i < field.length; i++) {
>>>> >
>>>> >                   try {
>>>> >
>>>> >                         if
>>>> > (field[i].getName().endsWith(String.valueOf(count))
>>>> >
>>>> >                                     && ("String")
>>>> >
>>>> >
>>>> > .equals(field[i].getType().getSimpleName())) {
>>>> >
>>>> >                               field[i].set(this, value);
>>>> >
>>>> >                               if (firstParam) {
>>>> >
>>>> >                                     procedureName.append("(#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                                     firstParam = false;
>>>> >
>>>> >                               } else if (lastParam) {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName() +"#)");
>>>> >
>>>> >                               } else {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                               }
>>>> >
>>>> >                               break;
>>>> >
>>>> >
>>>> >
>>>> >                         }
>>>> >
>>>> >                   } catch (Exception e) {
>>>> >
>>>> >                         throw new ConfigureException(
>>>> >
>>>> >                                     "Exception setting String value
>>>> in
>>>> > paramMapper"
>>>> >
>>>> >                                                 + e.getStackTrace());
>>>> >
>>>> >                   }
>>>> >
>>>> >
>>>> >
>>>> >             }
>>>> >
>>>> >
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> >       public void setIntVal(int value, int count,String jdbcType)
>>>> throws
>>>> > ConfigureException {
>>>> >
>>>> >
>>>> >
>>>> >             Field[] field =
>>>> ProcParameterMapper.class.getDeclaredFields();
>>>> >
>>>> >
>>>> >
>>>> >             for (int i = 0; i < field.length; i++) {
>>>> >
>>>> >                   try {
>>>> >
>>>> >                         if
>>>> > (field[i].getName().endsWith(String.valueOf(count))
>>>> >
>>>> >                                     &&
>>>> > ("int").equals(field[i].getType().getSimpleName())) {
>>>> >
>>>> >
>>>> >
>>>> >                               field[i].set(this, value);
>>>> >
>>>> >                               if (firstParam) {
>>>> >
>>>> >                                     procedureName.append("(#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                                     firstParam = false;
>>>> >
>>>> >                               } else if (lastParam) {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName() +"#)");
>>>> >
>>>> >                               } else {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                               }
>>>> >
>>>> >                               break;
>>>> >
>>>> >                         }
>>>> >
>>>> >                   } catch (Exception e) {
>>>> >
>>>> >                         throw new ConfigureException(
>>>> >
>>>> >                                     "Exception setting int value in
>>>> > paramMapper"
>>>> >
>>>> >                                                 + e.getStackTrace());
>>>> >
>>>> >                   }
>>>> >
>>>> >
>>>> >
>>>> >             }
>>>> >
>>>> >
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> >       public void setByteVal(Byte value, int count,String jdbcType)
>>>> throws
>>>> > ConfigureException {
>>>> >
>>>> >
>>>> >
>>>> >             Field[] field =
>>>> ProcParameterMapper.class.getDeclaredFields();
>>>> >
>>>> >
>>>> >
>>>> >             for (int i = 0; i < field.length; i++) {
>>>> >
>>>> >                   try {
>>>> >
>>>> >                         if
>>>> > (field[i].getName().endsWith(String.valueOf(count))
>>>> >
>>>> >                                     &&
>>>> > ("byte").equals(field[i].getType().getSimpleName())) {
>>>> >
>>>> >
>>>> >
>>>> >                               field[i].set(this, value);
>>>> >
>>>> >                               if (firstParam) {
>>>> >
>>>> >                                     procedureName.append("(#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                                     firstParam = false;
>>>> >
>>>> >                               } else if (lastParam) {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName() + "#)");
>>>> >
>>>> >                               } else {
>>>> >
>>>> >                                     procedureName.append(",#" +
>>>> > field[i].getName()+"#");
>>>> >
>>>> >                               }
>>>> >
>>>> >                               break;
>>>> >
>>>> >                         }
>>>> >
>>>> >                   } catch (Exception e) {
>>>> >
>>>> >                         throw new ConfigureException(
>>>> >
>>>> >                                     "Exception setting byte value in
>>>> > paramMapper"
>>>> >
>>>> >                                                 + e.getStackTrace());
>>>> >
>>>> >                   }
>>>> >
>>>> >
>>>> >
>>>> >             }
>>>> >
>>>> >
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> >       public String toString() {
>>>> >
>>>> >
>>>> >
>>>> >             return new String("stringVal1 is" + stringVal1 +
>>>> "stringVal2 is"
>>>> >
>>>> >                         + stringVal2 + "stringVal3 is" + stringVal3
+
>>>> > "intVal1 is"
>>>> >
>>>> >                         + intVal1 + "intVal2 is" + intVal2 + "intVal3
>>>> is" +
>>>> > intVal3);
>>>> >
>>>> >
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> >       public void setProcedure(String procName) {
>>>> >
>>>> >             procedureName.append(procName);
>>>> >
>>>> >
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> >       public String getProcedure(){
>>>> >
>>>> >             return procedureName.toString();
>>>> >
>>>> >       }
>>>> >
>>>> >
>>>> >
>>>> > }
>>>> >
>>>> >
>>>> >
>>>> > May thanks in advance
>>>> >
>>>> > Waiting for reply
>>>> >
>>>> > Nicky Jha
>>>> >
>>>> >
>>>> >
>>>> > This communication is for informational purposes only. It is not
>>>> intended as
>>>> > an offer or solicitation for the purchase or sale of any financial
>>>> > instrument or as an official confirmation of any transaction. All
>>>> market
>>>> > prices, data and other information are not warranted as to
>>>> completeness or
>>>> > accuracy and are subject to change without notice. Any comments or
>>>> > statements made herein do not necessarily reflect those of JPMorgan
>>>> Chase &
>>>> > Co., its subsidiaries and affiliates. This transmission may contain
>>>> > information that is privileged, confidential, legally privileged,
>>>> and/or
>>>> > exempt from disclosure under applicable law. If you are not the
>>>> intended
>>>> > recipient, you are hereby notified that any disclosure, copying,
>>>> > distribution, or use of the information contained herein (including
>>>> any
>>>> > reliance thereon) is STRICTLY PROHIBITED. Although this transmission
>>>> and any
>>>> > attachments are believed to be free of any virus or other defect that
>>>> might
>>>> > affect any computer system into which it is received and opened, it
>>>> is the
>>>> > responsibility of the recipient to ensure that it is virus free and
>>>> no
>>>> > responsibility is accepted by JPMorgan Chase & Co., its subsidiaries
>>>> and
>>>> > affiliates, as applicable, for any loss or damage arising in any way
>>>> from
>>>> > its use. If you received this transmission in error, please
>>>> immediately
>>>> > contact the sender and destroy the material in its entirety, whether
>>>> in
>>>> > electronic or hard copy format. Thank you. Please refer to
>>>> > http://www.jpmorgan.com/pages/disclosures for disclosures relating to
>>>> > European legal entities.
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail:
>>>> user-java-unsubscribe@ibatis.apache.org<mailto:user-java-unsubscribe@ibatis.apache.org>
>>>> For additional commands, e-mail:
>>>> user-java-help@ibatis.apache.org<mailto:user-java-help@ibatis.apache.org>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail:
>>> user-java-unsubscribe@ibatis.apache.org<mailto:user-java-unsubscribe@ibatis.apache.org>
>>> For additional commands, e-mail:
>>> user-java-help@ibatis.apache.org<mailto:user-java-help@ibatis.apache.org>
>>>
>>>
>>
>> --
>> Sent from my mobile device
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail:
>> user-java-unsubscribe@ibatis.apache.org<mailto:user-java-unsubscribe@ibatis.apache.org>
>> For additional commands, e-mail:
>> user-java-help@ibatis.apache.org<mailto:user-java-help@ibatis.apache.org>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail:
>> user-java-unsubscribe@ibatis.apache.org<mailto:user-java-unsubscribe@ibatis.apache.org>
>> For additional commands, e-mail:
>> user-java-help@ibatis.apache.org<mailto:user-java-help@ibatis.apache.org>
>>
>>
>>
>
> --
> Sent from my mobile device
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org
> For additional commands, e-mail: user-java-help@ibatis.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org
> For additional commands, e-mail: user-java-help@ibatis.apache.org
>
>

-- 
Sent from my mobile device

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org
For additional commands, e-mail: user-java-help@ibatis.apache.org


Mime
View raw message