欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  Java

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

程序员文章站 2022-04-27 22:01:52
...
直到目前为止,我们还没有接触到用户注册的实质性问题,即向数据库中添加用户。我们现在来处理这个需求。

首先需要确定数据库访问所用的技术,这里可以选择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即可。否则会使用数据库连接池。

做完所有的准备工作,下面就可以正式进行数据库功能开发了。

以上就是新Java运动:测试驱动开发3---用户注册3的内容,更多相关内容请关注PHP中文网(www.php.cn)!