论坛首页 Java企业应用论坛

关于jdk5范型写的dao的疑问

浏览 4393 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-09-25  
jdk5出来很久了。但是一直没有用过。最近,公司要求新的项目转到jdk5上来。这时候,看到了jdk5的范型。于是,以测试的方式写了简单一个dao。
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapSession;

public class Dao<E extends java.io.Serializable>
{
	/**
	 * 添加一个po
	 * @param optionId
	 * @param obj
	 * @throws IOException
	 * @throws SQLException
	 */
	public void add(String optionId, E obj) throws IOException, SQLException
	{
		SqlMapClient sqlMap = SqlMapUtil.getInstance().buildSqlMap();
		sqlMap.startTransaction();
		sqlMap.insert("insertUser", obj);
		sqlMap.commitTransaction();
		sqlMap.endTransaction();
	}
	
	/**
	 * 根据id,删除一个po
	 * @param optionId
	 * @param id
	 * @throws IOException
	 * @throws SQLException
	 */
	public void removeById(String optionId, int id) throws IOException, SQLException
	{
		SqlMapClient sqlMap = SqlMapUtil.getInstance().buildSqlMap();
		SqlMapSession session = sqlMap.openSession();
		session.startTransaction();
		session.delete("deleteUserById", id);
		session.commitTransaction();
		try
		{
			session.endTransaction();
		} catch (Exception e)
		{
		} finally
		{
			session.close();
		}
	}
	
	/**
	 * 修改po
	 * @param optionId
	 * @param obj
	 * @throws IOException
	 * @throws SQLException
	 */
	public void modify(String optionId, E obj) throws IOException, SQLException
	{
		SqlMapClient sqlMap = SqlMapUtil.getInstance().buildSqlMap();
		SqlMapSession session = sqlMap.openSession();
		session.startTransaction();
		session.update("updateUser", obj);
		session.commitTransaction();
		try
		{
			session.endTransaction();
		} catch (Exception e)
		{
		} finally
		{
			session.close();
		}
	}
	
	/**
	 * 查询所有po
	 * @param optionId
	 * @return
	 * @throws IOException
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public List<E> findAll(String optionId) throws IOException, SQLException
	{
		List<E> result = new ArrayList<E>();
		SqlMapClient sqlMap = SqlMapUtil.getInstance().buildSqlMap();
		result = sqlMap.queryForList(optionId, null);
		return result;
	}
	
	/**
	 * 根据id查询po
	 * @param optionId
	 * @param id
	 * @return
	 * @throws IOException
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public E findById(String optionId, int id) throws IOException, SQLException
	{
		SqlMapClient sqlMap = SqlMapUtil.getInstance().buildSqlMap();
		return (E) sqlMap.queryForObject(optionId, id);
	}
}


采用了ibatis做数据库操作。测试倒是通过了。当然也仅仅是一个简单的测试而已。
对于以前,我可能是一个Dao接口,然后针对每个不同的po有不同的 PoDao 类。
public Dao {...}
public UserDao implements Da {...}
...

现在采用了范型,觉得代码量是少了。但是不知道这种写法有没有什么问题。或者有没有什么更好的建议。
   发表时间:2006-09-26  
sqlMap.insert("insertUser", obj);

insertUser 这样的写死了,这个Dao怎么通用啊?
0 请登录后投票
   发表时间:2006-09-26  
在代码的add方法里面的

sqlMap.insert("insertUser", obj);

应该改为
sqlMap.insert(optionId, obj);


removeById方法里面的
session.delete("deleteUserById", id);

应该改为
session.delete(optionId, id);


modify方法里面的
session.update("updateUser", obj);

session.update(optionId, obj);


这个是写错了。但是,在运行的时候确实是通过了。没有出错。
顺便把SqlMapUtil的代码贴上

import java.io.IOException;
import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class SqlMapUtil
{
	private static SqlMapUtil smUtil = null;

	public static SqlMapUtil getInstance()
	{
		if (smUtil == null)
			smUtil = new SqlMapUtil();
		return smUtil;
	}

	public SqlMapClient buildSqlMap() throws IOException
	{
		String resource = "../SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(resource);
		return SqlMapClientBuilder.buildSqlMapClient(reader);
	}
}

上面代码的resource是配置文件的路径
0 请登录后投票
   发表时间:2006-09-26  
如果能够根据对象的类名和操作找到要使用的sql语句,那就不需要optionId参数了。
0 请登录后投票
   发表时间:2006-09-26  
BirdGu 写道
如果能够根据对象的类名和操作找到要使用的sql语句,那就不需要optionId参数了。
说的有道理.我想是行得通的.
0 请登录后投票
   发表时间:2006-09-27  
可以参考springside项目中的那个范型dao的设计.基本上copy过来就用了.不过要说声谢谢.呵呵
0 请登录后投票
   发表时间:2006-09-27  
iBatis似乎没有显式的关闭数据连接的方法,那么什么时候会关闭连接呢?
0 请登录后投票
   发表时间:2006-10-10  
其实有没有必要想这么多

现在做通用的dao,也只能完成数据基本的增删改查操作,其中查询操作几乎只能支持PK查询(为了通用),其实完成这部分的功能,自己稍微抽象一下就可以了
就这点而言,我觉得JDK5的唯一的优势就是用户在继承dao的时候可以看到操作的po的类型,除此以外我确实没有看到比jdk14好的地方(至于是真的泛型我不关心)

其实,我们做应用对于对象的操作远远不止这些,更多的时候是各种复杂的查询,这种至少我没有想到有1个比较通用的东西可以代劳的(当然如果可以做到的话,那么应用开发估计比VB、Delphi的开发更简洁了,:))。
0 请登录后投票
论坛首页 Java企业应用版

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