精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-06-02
主要是sql statement需要处理一下。
|
|
返回顶楼 | |
发表时间:2006-06-02
dwangel 写道 主要是sql statement需要处理一下。
?不明白。详细说说 |
|
返回顶楼 | |
发表时间:2006-06-05
Hi suntoe,
很不错的想法,我用Spring提供的代码库写了一个非常简化的Hibernate DAO Zero 其实就写了一个类: public class GenericInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation); throws Throwable { HibernateDaoSupport dao = (HibernateDaoSupport); invocation.getThis();; String methodName = invocation.getMethod();.getName();; Object[] arguments = invocation.getArguments();; if (methodName.startsWith("find");); { return dao.getHibernateTemplate();.findByNamedQuery(methodName, arguments);; } else if (methodName.startsWith("create");); { return dao.getHibernateTemplate();.save(arguments[0]);; } else if (methodName.startsWith("update");); { dao.getHibernateTemplate();.update(arguments[0]);; return null; } else if (methodName.startsWith("delete");); { dao.getHibernateTemplate();.delete(arguments[0]);; return null; } return invocation.proceed();; } } 配置文件: <bean id="abstractDao" class="daozero.dao.GenericHibernateDao"> <property name="sessionFactory"><ref local="sessionFactory"></ref></property> </bean> <bean id="genericInterceptor" class="daozero.aop.GenericInterceptor"/> <bean id="accountDao" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"><value>daozero.sample.dao.AccountDao</value></property> <property name="target"><ref local="abstractDao"></ref></property> <property name="interceptorNames"> <list> <value>genericInterceptor</value> </list> </property> </bean> 测试代码: public void test(); { ApplicationContext context = new ClassPathXmlApplicationContext("daozero/sample/application_context.xml");; AccountDao dao = (AccountDao); context.getBean("accountDao");; Account account = new Account();; account.setUserName("quake");; account.setPassword("123456");; account.setEmail("quake_wang@iteye.com");; dao.createAccount(account);; assertNotNull(account.getId(););; account.setPassword("111111");; dao.updateAccount(account);; Account loaded = (Account); dao.findAccountsByName("quake");.get(0);; assertEquals("111111", loaded.getPassword(););; assertEquals("quake_wang@iteye.com", loaded.getEmail(););; } 还没有仔细看过你的代码,但是觉得也可以像这个简单的例子,用spring提供的SqlMapSupport和interceptor一样搞定,不需要像你的代码里面写那么多,附件是源代码和测试例子,抛砖了... |
|
返回顶楼 | |
发表时间:2006-06-05
很棒啊,我也考虑着怎么支持hibernate,好像用ibatis的人和hibernate比实在不成比例。
解释一下daozero(for ibatis)的做法,现在的实现也可以用spring interceptor做,之所以自己直接去使用cglib/jdk proxy,有那么1000多行代码,目的是为了简化配置,也就是说把这种可以固定下来的aop配置写死在代码里了,这样就不需要使用者去理解spring aop(我实在不满意spring aop那种绕来绕去的配置方法)。 讨论下把你的东东放进daozero怎么样(强烈期待)? |
|
返回顶楼 | |
发表时间:2006-06-12
Quake Wang 写道 Hi suntoe,
很不错的想法,我用Spring提供的代码库写了一个非常简化的Hibernate DAO Zero 其实就写了一个类: public class GenericInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation); throws Throwable { HibernateDaoSupport dao = (HibernateDaoSupport); invocation.getThis();; 配置文件: <bean id="abstractDao" class="daozero.dao.GenericHibernateDao"> <property name="sessionFactory"><ref local="sessionFactory"></ref></property> </bean> <bean id="genericInterceptor" class="daozero.aop.GenericInterceptor"/> ... public class GenericInterceptor implements MethodInterceptor { private String C_METHOD = "create"; private String R_METHOD = "find"; private String U_METHOD = "update"; private String D_METHOD = "delete"; <bean id="genericInterceptor" class="daozero.aop.GenericInterceptor"> <property name="C_METHOD" value="create" /> <property name="R_METHOD" value="find" /> <property name="U_METHOD" value="update" /> <property name="D_METHOD" value="delete" /> |
|
返回顶楼 | |
发表时间:2006-06-13
挺点建议,
可以判断一下返回值,如果是数组的话可以把 queryforlist的结果转成强类型的数组, 另外,parameterMap的长度和args的长度一样也挺不爽的,部分情况下不能满足需求, 看到32版本的代码风格有些变化,赞一个,呵呵(个人不太喜欢用c的命名风格写java程序) |
|
返回顶楼 | |
发表时间:2006-06-14
heaven 写道 挺点建议,
可以判断一下返回值,如果是数组的话可以把 queryforlist的结果转成强类型的数组, 很棒的想法,下个版本争取加进去。 heaven 写道 另外,parameterMap的长度和args的长度一样也挺不爽的,部分情况下不能满足需求, 这个......按目前的思路恐怕难做,因为除非代码是debug编译,否则得不到method的argument的名字,没法按名字将argument和parameterMap的某个parameter对应起来。 不过,也可以按以下3个方法依次试,尽量取: 1.如果是debug模式编译的,就用method的argument的名字作为parameterMap的某个parameter的名字; 2.如果1不行,再加段XML,即要求手工配置argument的名字(缺点是使用复杂化了) 3.如果2也不行,就看annotation里是否定义了argument的名字(缺点是虽然比2要简单,但还不够) heaven 写道 看到32版本的代码风格有些变化,赞一个,呵呵(个人不太喜欢用c的命名风格写java程序) .3.2的代码风格没变化呀?“c的命名风格“是指什么? |
|
返回顶楼 | |
发表时间:2006-06-14
引用 不过,也可以按以下3个方法依次试,尽量取:
1.如果是debug模式编译的,就用method的argument的名字作为parameterMap的某个parameter的名字; 2.如果1不行,再加段XML,即要求手工配置argument的名字(缺点是使用复杂化了) 3.如果2也不行,就看annotation里是否定义了argument的名字(缺点是虽然比2要简单,但还不够) 2 着实麻烦了点,3不错,能利用的资源也就这么多了... 引用 “c的命名风格“是指什么?
这个.... 就是变量名有好多下划线的,AutoProxy里是有些变化的, 我有代码洁癖,表见怪,hehe |
|
返回顶楼 | |
发表时间:2006-06-14
heaven 写道 suntoe 写道 不过,也可以按以下3个方法依次试,尽量取:
1.如果是debug模式编译的,就用method的argument的名字作为parameterMap的某个parameter的名字; 2.如果1不行,再加段XML,即要求手工配置argument的名字(缺点是使用复杂化了) 3.如果2也不行,就看annotation里是否定义了argument的名字(缺点是虽然比2要简单,但还不够) 2 着实麻烦了点,3不错,能利用的资源也就这么多了... 补充一点,用了3就不支持jdk1.4了 heaven 写道 suntoe 写道 “c的命名风格“是指什么?
这个.... 就是变量名有好多下划线的,AutoProxy里是有些变化的, 我有代码洁癖,表见怪,hehe 惭愧,那些有好变化的却不是我写的,是squall贡献的代码 |
|
返回顶楼 | |
发表时间:2006-06-14
突然发觉做的这个东西的查询部分有那么点CMP EJB的finder的味道:
(1)EJB QL <--> SQL in iBatis XML; (2)EJB finder <--> interface,finder也无需写实现类! |
|
返回顶楼 | |