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 Rob Butler <cr...@yahoo.com> on 2005/05/24 01:27:40 UTC

Feature Request

Hello,

I am building an application that will need to
dynamically build an SQL statement at run time, and
then populate the statement's fields from a map. 
Sounds perfect for iBatis, right.  That's what I
thought, but I don't think iBatis does quite what I
need.  Normally iBatis can dynamically change it's SQL
but you need to know things like the number, name &
type of columns in advance when the SqlMap is created.

Unfortunately in my application, the SQL statement
that is built at runtime is completely dynamic.  The
name of the columns, their data types and the number
of columns will only be known at run time.  So what I
would like to do is dynamically instantiate an
SqlMapClient from a String, which contains the SqlMap
that is dynamically generated at run time.  Then let
iBatis do the work of converting the map's values into
the correct data types and populating the SQL's field
values.  It would be nice if the table name could be
passed as a property instead of in the map of data.

This looks like it would be possible with the
SqlMapClientBuilder, but I don't think that is going
to work.  The problem is it wants to read an
SqlMapConfig, which then of course points to an SqlMap
file.  However, the SqlMap file obviously won't exist
anywhere but as a string in ram, and it's not possible
(as far as I know) to directly load an SqlMap using
SqlMapClientBuilder, nor is it possible to load a
single "file" (string in ram) that is a combined
SqlMapConfig & SqlMap.

I could probably cobble something together using the
internal non-user exposed classes within iBatis, but
then if those classes change from one release to the
next I would have to make the appropriate changes to
my code, and I would prefer to use something that is
part of iBatis.

So, I would like to request a feature to make
dynamically building the SqlMap at runtime possible. 
I suppose this could be done by developing a class
like SqlMapClientBuilder that accepted a String, and
didn't need an SqlMapConfig, just a SqlMap XML. 
Alternately, a fixed API could be exposed to users to
manually construct a SqlClientMap.

Thoughts?  Is there a better approach that works now? 
Did I miss something obvious?

Thanks, and iBatis rocks!
Rob


		
__________________________________ 
Do you Yahoo!? 
Yahoo! Small Business - Try our new Resources site
http://smallbusiness.yahoo.com/resources/

Re: Feature Request

Posted by j-lists <ja...@gmail.com>.
I've solved this one before by generating a temp file, grabbing the
absolute path, turning it into a url, assigning that to a property
with the key "MAP_FILE" and then putting this in my main config:
<sqlMap url="${MAP_FILE}"/>

Which resolves to:
<sqlMap url="file://localhost/tmp/ibatis345875.xml"/>

Or some such thing (the localhost bit seems to be required for windows
but not for Unix flavours).

Nice thing about this is that the generated file on disk is easy to
debug, just log out the temp file location after generating it.

Re: Feature Request

Posted by Brandon Goodin <br...@gmail.com>.
SqlMapClientBuilder takes a reader. If you have a String in memory
then why couldn't you use a StringReader?

Brandon

On 5/23/05, Rob Butler <cr...@yahoo.com> wrote:
> Hello,
> 
> I am building an application that will need to
> dynamically build an SQL statement at run time, and
> then populate the statement's fields from a map.
> Sounds perfect for iBatis, right.  That's what I
> thought, but I don't think iBatis does quite what I
> need.  Normally iBatis can dynamically change it's SQL
> but you need to know things like the number, name &
> type of columns in advance when the SqlMap is created.
> 
> Unfortunately in my application, the SQL statement
> that is built at runtime is completely dynamic.  The
> name of the columns, their data types and the number
> of columns will only be known at run time.  So what I
> would like to do is dynamically instantiate an
> SqlMapClient from a String, which contains the SqlMap
> that is dynamically generated at run time.  Then let
> iBatis do the work of converting the map's values into
> the correct data types and populating the SQL's field
> values.  It would be nice if the table name could be
> passed as a property instead of in the map of data.
> 
> This looks like it would be possible with the
> SqlMapClientBuilder, but I don't think that is going
> to work.  The problem is it wants to read an
> SqlMapConfig, which then of course points to an SqlMap
> file.  However, the SqlMap file obviously won't exist
> anywhere but as a string in ram, and it's not possible
> (as far as I know) to directly load an SqlMap using
> SqlMapClientBuilder, nor is it possible to load a
> single "file" (string in ram) that is a combined
> SqlMapConfig & SqlMap.
> 
> I could probably cobble something together using the
> internal non-user exposed classes within iBatis, but
> then if those classes change from one release to the
> next I would have to make the appropriate changes to
> my code, and I would prefer to use something that is
> part of iBatis.
> 
> So, I would like to request a feature to make
> dynamically building the SqlMap at runtime possible.
> I suppose this could be done by developing a class
> like SqlMapClientBuilder that accepted a String, and
> didn't need an SqlMapConfig, just a SqlMap XML.
> Alternately, a fixed API could be exposed to users to
> manually construct a SqlClientMap.
> 
> Thoughts?  Is there a better approach that works now?
> Did I miss something obvious?
> 
> Thanks, and iBatis rocks!
> Rob
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! Small Business - Try our new Resources site
> http://smallbusiness.yahoo.com/resources/
>