新Java運動:測試驅動開發3—使用者註冊3

來源:互聯網
上載者:User

直到目前為止,我們還沒有接觸到使用者註冊的實質性問題,即向資料庫中添加使用者。我們現在來處理這個需求。

首先需要確定資料庫訪問所用的技術,這裡可以選擇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即可。否則會使用資料庫連接池。

做完所有的準備工作,下面就可以正式進行資料庫功能開發了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.