ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ron Chan <rc...@i-tao.com>
Subject Re: Interface binding
Date Tue, 09 Sep 2008 21:06:50 GMT

Here's a quick and dirty DynamicMapper I created

MyDao myDao = dynamicMapper.daoProxy(MyDao.class)
creates the proxy implementation

I use Guice for DI and have a Guice provider for this and that makes it even
simpler

public class DynamicMapper {
	private SqlMapClient sqlMap;
	
	public void setSqlMap(SqlMapClient sqlMap) {
		this.sqlMap = sqlMap;
	}

	public <T> T daoProxy(Class<T> clazz) {
		InvocationHandler handler = new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				Class<?> resultClazz = method.getReturnType();
				String methodName = method.getName();
				
				Object param = null ;
				if (args!=null) param = args[0];
				
				if (methodName.startsWith("insert")) {
					return sqlMap.insert(methodName, param);
				}
				else if (methodName.startsWith("update")) {
					return sqlMap.update(methodName, param);
				}
				else if (methodName.startsWith("delete")) {
					return sqlMap.delete(methodName, param);
				}
				else if (java.util.List.class.isAssignableFrom(resultClazz)) {
					return sqlMap.queryForList(methodName, param);
				}
				else if (java.util.Map.class.isAssignableFrom(resultClazz)) {
					String key;
					if (args.length==1) {
						param = null;
						key = (String)args[0];
					}
					else {
						key = (String)args[1];
					}
					return sqlMap.queryForMap(methodName, param, key);
				}
				else {
					return sqlMap.queryForObject(methodName, param);
				}
			}
		};
		
		return (T)Proxy.newProxyInstance(clazz.getClassLoader(), 
                					     new Class[] {clazz},
                					     handler);
	}

}



Ronald Borman wrote:
> 
> I got started with iBATIS this week. I bought 'iBATIS in Action'
> (finishing the last chapter tomorrow), did some tests and browsed through
> the mailing lists. It looks like a compact, comprehensible and fun to use
> framework. Kudos to the team!
> 
> On the incubator mailing list I found a May 2005 announcement which caught
> my attention: interface binding
> (http://www.mail-archive.com/ibatis-user-java@incubator.apache.org/msg02403.html).
> It reminded me of an IBM DeveloperWorks article about Generic DAOs and I
> was eager to try it out. Unfortunately SqlMapClientImpl.getMapper() hasn't
> survived (although it is still listed in the online dev Javadoc).
> 
> The 2.1.7 source code only calls the static method
> MapperProxy.newMapperProxy(), so perhaps I could compile/externalize the
> missing classes. Is this feasable?
> 
> The 3.0 whiteboard discussion also mentions interface binding. Is it
> likely that this functionality will return in a future version?
> 
> Thanks
> 
> 
> Ronald
> 
> 

-- 
View this message in context: http://www.nabble.com/Interface-binding-tp19352392p19401342.html
Sent from the iBATIS - User - Java mailing list archive at Nabble.com.


Mime
View raw message