For the record, this recommendation is far better than using a LabelValueBean in iBATIS SqlMaps ... I still do it, because its easy, but Clinton's suggestion is far superior :)
On Mon, 24 Jan 2005 14:04:42 -0700, Clinton Begin <[EMAIL PROTECTED]> wrote: > Pascal, > > Another approach is to use a wrapper class at your presentation layer. > After all, this is a presentation layer problem, that is probably > best solved in the presentation layer -- not in the persistence layer. > > By aliasing your columns to ID and Value, you've made a change to your > persistence for the sake of a presentation requirement. > > Here's my recommendation: > > 1) Use a real domain model. Avoid Maps. Create a real class that > represents your domain. In this case it looks like a Product class or > something (with properties such as SKU, Description etc.) > > 2) Map that class with iBATIS properly, using a real parameter class > and result class, with columns mapped to the JavaBean properties. > > 3) Use that domain object throughout your application. When a > requirement such as a droplist manifests itself, use a wrapper class > to manage special behavior. For example, given a Product class, you > could have a ProductDropListItem that knows how to provide the > appropriate identifier and value to the drop list. > > Don't worry about having to make a matching DropListItem for each > class. It's very easy to make a generic one that will work with any > domain class (passed into the constructor). E.g. new DropListItem > (aProduct). > > This keeps presentation layer problems out of the persistence layer. > It's also pretty easy to implement. > > Cheers, > Clinton > > On Mon, 24 Jan 2005 12:44:27 -0800 (PST), Prashanth Sukumaran > <[EMAIL PROTECTED]> wrote: > > Hi Pascal, > > > > I think i understand what Brandon is trying to say. He is talking about > > using the right pattern > > for the kind of job you are trying to achieve. > > > > If my guess is right. Looks like you trying to do this for your dropdowns. > > I do it this way and i > > feel it is much cleaner this way. > > > > public interface ValueObject{ > > > > /** > > * Gets the iD attribute of the KeyValueObject object > > * > > * @return The iD value > > */ > > String getID(); > > > > /** > > * Gets the value attribute of the KeyValueObject object > > * > > * @return The value value > > */ > > String getValue(); > > > > /** > > * This method returns sort field > > * > > * > > * @return value of sort field > > */ > > public Object getSortFieldValue(); > > } > > > > All Objects that you are using for Dropdowns will extend the ValueObject, > > and they will implement > > the three methods. In your case getID() will return SKU, getValue will > > return Description. and > > for the getSortFieldValue() have an empty implementation. This way the > > bean can be used for other > > things and also used for dropdowns. > > > > For the dropdowns have a common method that handles them or even struts has > > the LabelValue bean. > > > > Rgds > > Prashanth. > > > > > > --- Pascal DeMilly <[EMAIL PROTECTED]> wrote: > > > > > Well. It seems logical to me. Why would iBatis go into great length at > > > trying to map result in the SqlMap file then if it was not to limit the > > > knowledge of your database to that XML file. The dependency have to stop > > > somewhere and it seems to me the SqlMap file is the place where it > > > should stop. The DAO implementation classes should only know about the > > > iBatis map id and its expected POJO results not how your database > > > columns are named or it seems to me. > > > > > > Anyway, in my case while this solve one of my problem, queryForMap is > > > still not as efficient as it could be since it relies on queryForList. > > > So basically it is building two list. One with each element being a Map > > > of column name/value, then another map of only values. Would it be more > > > efficient to rewrite queryForMap to use a RowHandler? > > > > > > > > > > > > On Mon, 2005-01-24 at 10:15, Brandon Goodin wrote: > > > > Why is it a problem to have a code dependency in an "implementation" > > > > class? It is suppossed to be aware of IBatis SQLMap semantics. You > > > > interface over your DAO class should hide the specifics of your > > > > implementation code within your Dao. > > > > > > > > Brandon > > > > > > > > > > > > > > > > > > > > On Mon, 24 Jan 2005 09:22:49 -0800, Pascal DeMilly > > > > <[EMAIL PROTECTED]> wrote: > > > > > Thanks Larry, > > > > > > > > > > I tried it and it works. However this still leave some dependencies in > > > > > my DAO code as I have to specify the column names there as in: > > > > > > > > > > return getSqlMapClientTemplate().queryForMap("getItemNameMap", null, > > > > > "SKU", "Description"); > > > > > > > > > > How will you do about moving that code into the SqlMap. Should I > > > > > create > > > > > a custom resultMap with key/value as properties and refer to it in my > > > > > DAO code? > > > > > > > > > > I am going to give it a try and see what happened. > > > > > > > > > > Thanks for you help. > > > > > > > > > > Pascal > > > > > > > > > > On Mon, 2005-01-24 at 08:44, Larry Meadors wrote: > > > > > > Try executeQueryForMap() instead. > > > > > > > > > > > > > > > > > > On Mon, 24 Jan 2005 08:42:25 -0800, Pascal DeMilly > > > > > > <[EMAIL PROTECTED]> wrote: > > > > > > > Hi, > > > > > > > > > > > > > > I would like to retrieve a Map with whose key is the 1st column > > > > > > > of my > > > > > > > query and the value is the 2nd column. For example right now I do: > > > > > > > > > > > > > > <select id="getItemNameMap" resultClass="java.util.HashMap"> > > > > > > > select SKU, Description from Items > > > > > > > </select> > > > > > > > > > > > > > > However this returns a list of maps with the key being the column > > > > > > > name > > > > > > > and the value the column value which seems wasteful in term of > > > > > > > space (I > > > > > > > am using remoting to retrieve that info). > > > > > > > > > > > > > > I currently solve it by using a custom rowHandler in my DAO as > > > > > > > follow: > > > > > > > > > > > > > > public Map getItemNames () throws DataAccessException { > > > > > > > final KeyValueHandler rowHandler = new KeyValueHandler (); > > > > > > > > > > > > > > getSqlMapClientTemplate().queryWithRowHandler("getItemNameMap", > > > > > > > null, > > > rowHandler); > > > > > > > return rowHandler.getMap(); > > > > > > > } > > > > > > > > > > > > > > private class KeyValueHandler implements RowHandler { > > > > > > > final Map map = new HashMap (); > > > > > > > > > > > > > > public void handleRow(Object valueObject) { > > > > > > > final Map row = (Map) valueObject; > > > > > > > map.put (row.get("SKU"), row.get("Description")); > > > > > > > } > > > > > > > > > > > > > > public Map getMap () { > > > > > > > return map; > > > > > > > } > > > > > > > > > > > > > > } > > > > > > > > > > > > > > But I would like to move possibly that code out of my DAO code > > > > > > > and into > > > > > > > iBatis SqlMap file. > > > > > > > > > > > > > > How could I do that > > > > > > > > > > > > > > TIA > > > > > > > > > > > > > > Pascal > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > __________________________________________________ > > Do You Yahoo!? > > Tired of spam? Yahoo! Mail has the best spam protection around > > http://mail.yahoo.com > > >