精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-09
如果持久层换了,LZ会怎么更,难道是在service层逐个改?
|
|
返回顶楼 | |
发表时间:2009-04-09
我实际上只是给出一种做法,给个启示。
如果真要考虑持久层变更,可以做一个模板类。例子中的程序用的是Spring的SqlMapClientTemplate,我们完全可以封装一个自己的模板类,在需要变更持久层时,只要通过Spring注入一个新的模板类就好了。 我感觉,即使保留DAO,实际开发中的持久层变更所带来的工作量和问题也不会少。 |
|
返回顶楼 | |
发表时间:2009-04-09
综合一下各位的方案,这样就方便了。
import java.util.LinkedHashMap; public class Param extends LinkedHashMap<String, Object> { private static final long serialVersionUID = -7612295332686546171L; public Param() { } public Param(Object... params) { int j = params.length; if (j % 2 != 0) { j--; } for (int i = 0; i < j; i += 2) { if (i != params.length) { this.put((String) params[i], params[i + 1]); } } } public Param add(String key, Object val) { this.put(key, val); return this; } } |
|
返回顶楼 | |
发表时间:2009-04-09
mikewang 写道 综合一下各位的方案,这样就方便了。
import java.util.LinkedHashMap; public class Param extends LinkedHashMap<String, Object> { private static final long serialVersionUID = -7612295332686546171L; public Param() { } public Param(Object... params) { int j = params.length; if (j % 2 != 0) { j--; } for (int i = 0; i < j; i += 2) { if (i != params.length) { this.put((String) params[i], params[i + 1]); } } } public Param add(String key, Object val) { this.put(key, val); return this; } } 以前有人写过这么个Map,忘记了是谁,下面转一下。侵权了,不好意思。 /** * 通用Map类,支持构造函数构造Map对象. <br /> * * @author XXXX * @version 1.00 */ import java.sql.Timestamp; import java.util.HashMap; /** * 通用Map类.<br /> * * @author XXXX * @version 1.00 */ public class QMap extends HashMap<String, Object> { /** 序列化专用版本号 */ private static final long serialVersionUID = 5157946144469842504L; public QMap() { } /** 构造函数 */ public QMap(Object... args) { put(args); } /** * 取得int型的对象 * * @param key * @return */ public int getInt(Object key) { return getInt(key, 0); } /** * 取得int型的对象.<br /> * 取得为null时,返回默认值.<br /> * * @param key * @param defaultInt * 默认值 * @return */ public int getInt(Object key, int defaultInt) { Integer i = (Integer) get(key); return i == null ? defaultInt : i; } /** * 取得String型的对象.<br /> * * @param key * @return */ public String getString(Object key) { return (String) get(key); } /** * 取得String型的对象.<br /> * 取得为null时,返回默认值.<br /> * * @param key * @param defaultValue * 默认值 * @return */ public String getString(Object key, String defaultValue) { String value = (String) get(key); return value == null ? defaultValue : value; } /** * 取得Timestamp型的对象.<br /> * * @param key * @return */ public Timestamp getTimestamp(Object key) { return (Timestamp) get(key); } /** * 存入对象.<br /> * 按照【key, value, key, value, key, value, ..., ...】的结构.<br /> * * @param args */ public void put(Object... args) { for (int i = 1; i < args.length; i += 2) { put(String.valueOf(args[i - 1]), args[i]); } } } |
|
返回顶楼 | |
发表时间:2009-04-09
你这个稍微有点问题。
1 , 没有对java bean 进行处理 2 , put 方法有bug , 当参数不为偶数的时候, 会出问题。 对java bean 进行处理, 用到了cglib 引用 @SuppressWarnings("unchecked") public Param(Object o) { if (o instanceof Map) { putAll((Map) o); } else { Map m = BeanMap.create(o); putAll(m); } } 修复 put 的 bug public void put(Object... params) { // 必须先判断一下参数个数是否为偶数 int j = params.length; if (j % 2 != 0) { j--; } for (int i = 0; i < j; i += 2) { if (i != params.length) { this.put((String) params[i], params[i + 1]); } } } |
|
返回顶楼 | |
发表时间:2009-04-09
mikewang 写道 你这个稍微有点问题。
1 , 没有对java bean 进行处理 2 , put 方法有bug , 当参数不为偶数的时候, 会出问题。 对java bean 进行处理, 用到了cglib 引用 @SuppressWarnings("unchecked") public Param(Object o) { if (o instanceof Map) { putAll((Map) o); } else { Map m = BeanMap.create(o); putAll(m); } } 这个有道理。 mikewang 写道 修复 put 的 bug public void put(Object... params) { // 必须先判断一下参数个数是否为偶数 int j = params.length; if (j % 2 != 0) { j--; } for (int i = 0; i < j; i += 2) { if (i != params.length) { this.put((String) params[i], params[i + 1]); } } } 这个写法有些麻烦,你好好看看我转的那个代码,应该不会出现奇数问题吧。 |
|
返回顶楼 | |
发表时间:2009-04-10
QuakeWang 写道 longrui 写道 老要包装Map是比较烦人,可以通过实现自己的查询模板或写自己的数据结构实现: 可以用varargs来做简化,还有List也是比较常用: QMap(Object... parameters) QList(Object... parameters) List list = getIbatisTemplate().queryForList("queryStr", new QMap("name", "名字", "age", 18)); 哈哈,这个很酷 |
|
返回顶楼 | |
发表时间:2009-04-14
public class BaseDao extends SqlMapClientDaoSupport implements Dao
BaseDao扩展自spring的SqlMapClientDaoSupport 这个是AppFuse的用法, 我用这个。 |
|
返回顶楼 | |
发表时间: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有足够复杂,或者你的项目会有更换持久框架的风险,那你也可以考虑保留。这完全需要根据项目的特点来进行取舍。 |
|
返回顶楼 | |
发表时间:2009-07-27
看了楼上使用map的方式,学习了,不过,能不能不用map呢?
全部使用domain对象如何?就是说parameterClass和resultClass都用同一个domain,全部统一起来,如下: User user=new User(); user.setAge(18); user.setName("名字"); List list = getIbatisTemplate().queryForList("queryStr", user); 可以吗?好不好?有何问题吗? |
|
返回顶楼 | |