新Java运动:测试驱动开发3

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

首先需要确定数据库访问所用的技术,这里可以选择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 {@Overridepublic long registerUser(Map<String, Object> userInfo) {// TODO Auto-generated method stubreturn 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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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 blocke1.printStackTrace();}}}}

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

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

我要准备好行李启程了,谢谢关心我的家人和朋友,

新Java运动:测试驱动开发3

相关文章:

你感兴趣的文章:

标签云: