在Service里直接玩iBATIS,为iBATIS添个贴吧
以前使用iBATIS时,都是参考了iBATIS官网上的JPetStore做的。不过这个JPetStore似乎太老了,以致于我们参照后,所写的DB层又难看又繁琐。看了看我的DAO类,需要先定义一个接口,再定义一个Impl类,然后,每个方法里差不多都是一两句话的事。现在,我把DAO直接干掉了,完全用iBATIS来充当DAO,借助于Spring的注解,将iBATIS的DB操作对象直接注入Service中,而且什么也不用继承和实现,单纯的Java类一个。如果使用的是Struts2,一个Action一个Service就可以了,都是单纯的Java类,什么都不继承,什么也不实现。
具体如下:
1、在applicationContext.xml中,添点东西。
① beans标签中增加【xmlns:context="http://www.springframework.org/schema/context"】声明。
② 增加annotation自动注册Bean的声明。
<!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 -->
<context:component-scan base-package="需要自动注册的包名" />
③ iBATIS部分的配置
注:①②,可以Google下;③是关键,这样就搞出一个被注好的sqlMapClientTemplate对象,可以用它来操作数据库了。
2、Service类,什么也不用继承或实现。
代码截段如下:QMap(Object... parameters)QList(Object... parameters)List list = getIbatisTemplate().queryForList("queryStr", new QMap("name", "名字", "age", 18));
哈哈,这个很酷 27 楼 lcllcl987 2009-04-14 public class BaseDao extends SqlMapClientDaoSupport implements Dao
BaseDao扩展自spring的SqlMapClientDaoSupport
这个是AppFuse的用法, 我用这个。 28 楼 matt.u 2009-04-15 ispring 写道楼主不是开玩笑吧,在很久以前是没有DAO层的概念的,多年后有人总结出来了,现在你又要改回去?有句话叫“存在即合理”,楼主你太片面了
虽然有人把DAO这种概念总结出来了,但你也要看适用的环境,DAO全名是Data Access Object,主要是封装操作繁琐(说操作繁琐主要是因为要处理数据库异常、事务等等操作)的数据库操作,以便将低级别的数据访问逻辑与高级别的业务逻辑分离,同时通过使用DAO接口,便于在对业务逻辑不产生大的影响的情况下,实现在不同数据库上的迁移(当然在不同数据库上需要重新开发DAO实现)。
说白了,DAO的作用就是:1、解耦;2、便于跨数据库
但是由于现在各种开发思想的进步,特别是Spring、Hibernate、iBATIS等开源框架的流行,很多需要开发的地方都已经大大简化。比如Spring提供事务容器和异常处理机制,不需要你自己去编代码处理异常和控制事务;Hibernate作为ORM框架,直接提供跨数据库特性;iBATIS虽然是SqlMapper框架,不直接跨数据库,但也可以通过配置不同的sql文件,达到跨不同的数据库的目的。
综上,DAO的存在感是越来越小,当然如果你的DAO有足够复杂,或者你的项目会有更换持久框架的风险,那你也可以考虑保留。这完全需要根据项目的特点来进行取舍。 29 楼 bergman 2009-07-27 看了楼上使用map的方式,学习了,不过,能不能不用map呢?
全部使用domain对象如何?就是说parameterClass和resultClass都用同一个domain,全部统一起来,如下:
User user=new User();
user.setAge(18);
user.setName("名字");
List list = getIbatisTemplate().queryForList("queryStr", user);
可以吗?好不好?有何问题吗?