|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
DB portability for iBatis 3 MappersHey iBatis team, The feature in iBatis 3 to use getMapper() to obtain a
dynamic implementation of the DAO interface is extremely cool. However,
there is one serious shortcoming – mapped statement implementations that
are DB product specific/variant are not currently supported by this. For example, say I have a couple of vendor-specific SELECT
statements that represent the same query. The way one can address this
situation is described in the following blog posting by Jeff Hair (who happens
to be a colleague of mine): http://jshair.blogspot.com/
(scroll down to the iBatis entry) As you can see, Jeff describes adding a base DAO class that
extends Spring’s SqlMapClientDaoSupport. Inside this base class the
checkMappedStatement() method manipulates the statement name to be DB product
specific (based on the db metadata obtained from the db connection) and
attempts to look up a mapped statement based on that name. If that fails,
the original/default name is used to find the mapped statement. What I have done is basically push a variant of the
implementation that Jeff describes down into your DefaultSqlSession class to
provide the capability for your dynamic mapper methods to execute overloaded,
vendor-specific SQL statements - all transparent to the DAO client. (see
attached – I put the new work just after your constructor) I built the iBatis project locally and deployed it to my
environment and it seems to work fine. There is one kink that still needs
to be worked out – I did not put this mapped SQL overload into your
MapperMethod.determineCommandType() method and as a result, the xml mapper
still requires that a non-db-specific SELECT statement exists. For
example, consider the following: For argument’s sake I have
getAll-Oracle and getAll-HSQL mapped SELECT statements representing some SELECT
statements that are, for one reason or another, vendor-specific. But, I
also have to provide an undesired getAll implementation to prevent an exception
in the determineCommandType() method. <mapper
namespace="com.acme.banking.persistence.dao.ITransactionTypeDao"> <resultMap
id="get-transactionType-result"
type="TransactionType"> <result
property="code" column="code"/> <result property="title"
column="title"/> </resultMap> <select id="getAll-HSQL"
resultType="TransactionType"> SELECT code,
title FROM
transaction_type </select> <select id="getAll-Oracle"
resultType="TransactionType"> SELECT title,
code FROM
transaction_type </select> <select id="getAll"
resultType="TransactionType"> SELECT title,
code FROM
transaction_type </select> </mapper> It would be great if you could eliminate this problem/requirement
if you decide to use this implementation/idea. Also, this evening was the first time I’ve looked at
your source code and I didn’t spend a lot of time with it so I just
wedged this solution in where it would work – it may not fit with your
overall design/architecture and I’m sure it will have to be refactored. Thanks and keep up the great work. Please let me know
if I can clarify anything or be of further assistance. I do hope to
provide some feedback on your iBatis 3 user guide in the not too distant
future. Thanks again. Russ Jackson Accenture Sr. Consultant (417) 626-6524 This message is for the designated recipient only and may contain privileged, proprietary, or otherwise private information. If you have received it in error, please notify the sender immediately and delete the original. Any other use of the email by you is prohibited. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@... For additional commands, e-mail: dev-help@... |
|
|
Re: DB portability for iBatis 3 MappersBest thing to do for this is create a Jira feature request ticket.
Clinton
On Tue, Sep 22, 2009 at 10:34 AM, <russ.jackson@...> wrote:
|
|
|
RE: DB portability for iBatis 3 MappersOK. Thanks Russ From: Clinton Begin
[mailto:clinton.begin@...] Best thing to do for this is create a Jira feature request
ticket. On Tue, Sep 22, 2009 at 10:34 AM, <russ.jackson@...>
wrote: Hey
iBatis team, The
feature in iBatis 3 to use getMapper() to obtain a dynamic implementation of
the DAO interface is extremely cool. However, there is one serious
shortcoming – mapped statement implementations that are DB product
specific/variant are not currently supported by this. For
example, say I have a couple of vendor-specific SELECT statements that
represent the same query. The way one can address this situation is
described in the following blog posting by Jeff Hair (who happens to be a
colleague of mine): http://jshair.blogspot.com/
(scroll down to the iBatis entry) As
you can see, Jeff describes adding a base DAO class that extends Spring’s
SqlMapClientDaoSupport. Inside this base class the checkMappedStatement()
method manipulates the statement name to be DB product specific (based on the
db metadata obtained from the db connection) and attempts to look up a mapped
statement based on that name. If that fails, the original/default name is
used to find the mapped statement. What
I have done is basically push a variant of the implementation that Jeff
describes down into your DefaultSqlSession class to provide the capability for
your dynamic mapper methods to execute overloaded, vendor-specific SQL statements
- all transparent to the DAO client. (see attached – I put the new work
just after your constructor) I
built the iBatis project locally and deployed it to my environment and it seems
to work fine. There is one kink that still needs to be worked out – I did
not put this mapped SQL overload into your MapperMethod.determineCommandType()
method and as a result, the xml mapper still requires that a non-db-specific
SELECT statement exists. For example, consider the following: For
argument’s sake I have getAll-Oracle and getAll-HSQL mapped SELECT statements
representing some SELECT statements that are, for one reason or another,
vendor-specific. But, I also have to provide an undesired getAll
implementation to prevent an exception in the determineCommandType() method. <mapper
namespace="com.acme.banking.persistence.dao.ITransactionTypeDao">
<resultMap id="get-transactionType-result"
type="TransactionType">
<result property="code" column="code"/>
<result property="title" column="title"/>
</resultMap>
<select id="getAll-HSQL"
resultType="TransactionType">
SELECT code, title
FROM transaction_type
</select>
<select id="getAll-Oracle"
resultType="TransactionType">
SELECT title, code
FROM transaction_type
</select>
<select id="getAll" resultType="TransactionType">
SELECT title, code
FROM transaction_type
</select> </mapper> It
would be great if you could eliminate this problem/requirement if you decide to
use this implementation/idea. Also,
this evening was the first time I’ve looked at your source code and I didn’t
spend a lot of time with it so I just wedged this solution in where it would
work – it may not fit with your overall design/architecture and I’m sure it
will have to be refactored. Thanks
and keep up the great work. Please let me know if I can clarify anything
or be of further assistance. I do hope to provide some feedback on your
iBatis 3 user guide in the not too distant future. Thanks
again. Russ Jackson Accenture Sr.
Consultant (417)
626-6524 This
message is for the designated recipient only and may contain privileged,
proprietary, or otherwise private information. If you have received it in
error, please notify the sender immediately and delete the original. Any other
use of the email by you is prohibited.
This message is for the designated recipient only and may contain privileged, proprietary, or otherwise private information. If you have received it in error, please notify the sender immediately and delete the original. Any other use of the email by you is prohibited. |
| Free embeddable forum powered by Nabble | Forum Help |