论坛首页 Java企业应用论坛

在Service里直接玩iBATIS,为iBATIS添个贴吧

浏览 11067 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-09  
如果持久层换了,LZ会怎么更,难道是在service层逐个改?
0 请登录后投票
   发表时间:2009-04-09  
我实际上只是给出一种做法,给个启示。
如果真要考虑持久层变更,可以做一个模板类。例子中的程序用的是Spring的SqlMapClientTemplate,我们完全可以封装一个自己的模板类,在需要变更持久层时,只要通过Spring注入一个新的模板类就好了。
我感觉,即使保留DAO,实际开发中的持久层变更所带来的工作量和问题也不会少。
0 请登录后投票
   发表时间: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;
	}
}
0 请登录后投票
   发表时间: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]);
		}
	}

}


0 请登录后投票
   发表时间: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]);
			}
		}
	}
0 请登录后投票
   发表时间: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]);
			}
		}
	}


这个写法有些麻烦,你好好看看我转的那个代码,应该不会出现奇数问题吧。
0 请登录后投票
   发表时间:2009-04-10  
QuakeWang 写道
longrui 写道

老要包装Map是比较烦人,可以通过实现自己的查询模板或写自己的数据结构实现:

可以用varargs来做简化,还有List也是比较常用:
QMap(Object... parameters)
QList(Object... parameters)

List list = getIbatisTemplate().queryForList("queryStr", new QMap("name", "名字", "age", 18));

哈哈,这个很酷
0 请登录后投票
   发表时间:2009-04-14  
public class BaseDao extends SqlMapClientDaoSupport implements Dao

BaseDao扩展自spring的SqlMapClientDaoSupport
这个是AppFuse的用法, 我用这个。
0 请登录后投票
   发表时间: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有足够复杂,或者你的项目会有更换持久框架的风险,那你也可以考虑保留。这完全需要根据项目的特点来进行取舍。
0 请登录后投票
   发表时间:2009-07-27  
看了楼上使用map的方式,学习了,不过,能不能不用map呢?
全部使用domain对象如何?就是说parameterClass和resultClass都用同一个domain,全部统一起来,如下:
User user=new User();
user.setAge(18);
user.setName("名字");
List list = getIbatisTemplate().queryForList("queryStr", user);

可以吗?好不好?有何问题吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics