精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-23
最后修改:2009-03-23
具体如下: 1、在applicationContext.xml中,添点东西。 ① beans标签中增加【xmlns:context="http://www.springframework.org/schema/context"】声明。 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> ② 增加annotation自动注册Bean的声明。 <!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 --> <context:component-scan base-package="需要自动注册的包名" /> ③ iBATIS部分的配置 <!-- Spring的iBatis 配置 --> <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> <constructor-arg> <ref bean="sqlMapClient"></ref> </constructor-arg> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="WEB-INF/SqlMapConfig.xml" /> <property name="dataSource" ref="dataSource" /> </bean> 注:①②,可以Google下;③是关键,这样就搞出一个被注好的sqlMapClientTemplate对象,可以用它来操作数据库了。 2、Service类,什么也不用继承或实现。 代码截段如下: @Service public class BookmarkService { /** iBATIS的DB操作辅助类对象 */ @Autowired private SqlMapClientTemplate sqlMapClientTemplate; // 注:不需要set/get方法,自动注入 ..... /** * 查询基本书签.<br /> * * @param mapBean * @return */ public List searchBookmarkBaseList(Map mapBean) { return sqlMapClientTemplate.queryForList("Bookmark.searchBookmarkBaseList", mapBean); } } 通过上面的搞法,就完全可以不用再整出一个如:public class UserDaoImpl extends SqlMapClientDaoSupport implements UserDao {...}这样写法的Impl类了,当然也省了那个接口(这种接口总是想的挺好,往往鸡肋一堆),当然进行DB操作时,更不需要使用那个实在太别扭的:getSqlMapClientTemplate().queryForObject(...)写法了。 现在的作法,简单务实多了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-23
可惜目前iBATIS的SqlMapClientTemplate类不支持泛型,要不然,可能就更好一些了。
|
|
返回顶楼 | |
发表时间:2009-03-30
没有了dao层,lz你打算怎么写service的单元测试那?
|
|
返回顶楼 | |
发表时间:2009-03-31
您这么写如果有一天业务变化把原有的持久化策略从ibatis变为hibernate那您所有的service都要修改,因为所有的service都引用了spring 的ibatis的模板。
|
|
返回顶楼 | |
发表时间:2009-03-31
有了Hibernate/iBatis这些强大的ORM以后,确实不用再写一个DAO了,在Service里面直接用。
单元测试可以用内存数据库来直接做。 而说考虑到ibatis转化为hibernate,即便你用DAO,也要大范围的改动,service里面这点引用的改动可忽略不计了。 |
|
返回顶楼 | |
发表时间:2009-03-31
我一般还是保留dao,但是dao直接继承SqlMapClientTemplate,也省掉那完全不会使用的dao 接口。不过ibatis传多个参数老是要包装一个map出来挺烦人的
|
|
返回顶楼 | |
发表时间:2009-04-01
出差几天刚回来。
对于简单业务来讲,就是拿Service当Dao使;繁杂的,Mock加数据库一起用,不知道行不行。 说到iBATIS和Hibernate的切换,我想最多,再抽象出一个模板类取代Spring包中的SqlMapClientTemplate类。这样,如果要切换ORM的话,可以在我们的自定义的模板类的基础上进行切换。但是,如果在使用iBATIS时,并没考虑到还可能切换ORM的情况的话,将来在切换时,无论有没有DAO,我想Service的大变都难以避免。 |
|
返回顶楼 | |
发表时间:2009-04-01
wang19841229 写道 您这么写如果有一天业务变化把原有的持久化策略从ibatis变为hibernate那您所有的service都要修改,因为所有的service都引用了spring 的ibatis的模板。
可以在父类包装。 不过话又说回来,有多少项目没事在Hibernate/IBatis或Linux/Windows间切换? 简单和通用之间要做出取舍。 |
|
返回顶楼 | |
发表时间:2009-04-01
yishh 写道 我一般还是保留dao,但是dao直接继承SqlMapClientTemplate,也省掉那完全不会使用的dao 接口。不过ibatis传多个参数老是要包装一个map出来挺烦人的
老要包装Map是比较烦人,可以通过实现自己的查询模板或写自己的数据结构实现: 比如继承HashMap,添加自己的方法: public class SimpleMap extends HashMap{ public SimpleMap add(Object key, Object value) { this.put(key, value); return this; } } List list = getIbatisTemplate().queryForList("queryStr", new SimpleMap() .add("name", "名字") .add("age", 18) ); |
|
返回顶楼 | |
发表时间:2009-04-01
longrui 写道 老要包装Map是比较烦人,可以通过实现自己的查询模板或写自己的数据结构实现: 可以用varargs来做简化,还有List也是比较常用: QMap(Object... parameters) QList(Object... parameters) List list = getIbatisTemplate().queryForList("queryStr", new QMap("name", "名字", "age", 18)); |
|
返回顶楼 | |