您的位置:首页 > 编程语言 > Java开发

新Java运动:测试驱动开发3---用户注册3

2013-03-08 10:20 337 查看
直到目前为止,我们还没有接触到用户注册的实质性问题,即向数据库中添加用户。我们现在来处理这个需求。

首先需要确定数据库访问所用的技术,这里可以选择Hibernate、JPA或JDBC。相信绝大多数应用都是采用Hibernate来作为数据库访问技术,另外一部分人可能会选择JPA,但是我们在这里选择JDBC。原因比较简单,底层的东西看上去好像比较复杂,但是一旦掌握,由于它的内容少,相对来讲更容易精通。而这种O-R映射模型,添加了许多抽象概念和细节,我们通常只看这些架构冰山的一角,而如果想掌握冰山下面的东西,难度比直接掌握JDBC难上几个数量级。

另外,由于我们测试驱动开发的架构,我们想要转换为其他架构,可以对现有代码进行重构,在测试用例的保证下,我们可以放心地对代码进行修改。

好了,我们首先用DAO模式,定义数据库访问接口类UserDao,代码如下所示:

public interface UserDao {
	public long registerUser(Map<String, Object> userInfo);
}


一般来讲,我们使用Mysql数据库,所以定义Dao的实现类UserMysqlDao,代码如下所示:

public class UserMysqlDao implements UserDao {
	@Override
	public long registerUser(Map<String, Object> userInfo) {
		// TODO Auto-generated method stub
		return 0;
	}


我们当然不希望使用者来确定所用的数据库,然后实例化对应的实现类,为此我们需要采用工厂模式,引入DaoFactory类,代码如下:

public class DaoFactory {
	public static UserDao getUserDao() {
		UserDao dao = null;
		switch (dbms) {
		case "mysql":
			dao = new UserMysqlDao();
			break;
		}
		return dao;
	}
	
	public static String getDbms() {
		return dbms;
	}

	public static void setDbms(String dbms) {
		DaoFactory.dbms = dbms;
	}

	private static String dbms = "mysql";
}


由上面的代码可以看出,调用者只需调用DaoFactory.getUserDao()即可获取实现类了。

下面就是数据库连接的问题,我们希望在Jboss等应用服务器上运行时采用数据库连接池,而在单元测试中使用DriverManager,所以需要定义一个DataSource的封装类JdbcDs来处理上述情况,代码如下所示:

public class JdbcDs {	
	public static Connection getConnection() throws SQLException {
		Connection conn = null;
		if (iDebug <= 0) {
			conn = appDs.getConnection();
		} else {
			try {
				Class.forName("com.mysql.jdbc.Driver").newInstance();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Properties connectionProps = new Properties();
		    connectionProps.put("user", "root");
		    connectionProps.put("password", "yantao");
		    conn = DriverManager.getConnection(
	                   "jdbc:" + "mysql" + "://" +
	                   "localhost" +
	                   ":" + 3306 + "/XrcjDb",
	                   connectionProps);
		}
		return conn;
	}

	public static int iDebug = 1;
	public final static String APP_DS = "java:jboss/datasources/XcgDS";
	private static DataSource appDs = null; 
	static{
		if (null == appDs) {
			Properties env = new Properties();
			try {
				InitialContext ictx = new InitialContext(env);
				appDs = (DataSource)ictx.lookup(APP_DS);
			} catch (NamingException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
	
}


当进行单元测试时,只需将iDebug置为1即可。否则会使用数据库连接池。

做完所有的准备工作,下面就可以正式进行数据库功能开发了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: