前言
在講解Web開發模式的時候,曾經寫過XML版的用戶登陸注冊案例!現在在原有的項目上,使用數據庫版來完成用戶的登陸注冊!如果不了解的朋友,可以看看我Web開發模式的博文!
本來使用的是XML文件作為小型數據庫,現在使用Mysql數據庫,代碼究竟要改多少呢?我們拭目以待!
使用C3P0數據庫連接池 導入C3P0的開發包和導入配置文件開發包導入的是這個:c3p0-0.9.2-pre1和mchange-commons-0.2.jar.
C3P0不僅性能好,而且配置文件可以使用XML文檔來配置!
類似的配置文件可以在官方文檔上找得到!
我們來改造一下:
寫獲取連接的工具類com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/zhongfucheng root root 5 10 5 20 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/zhongfucheng root root 5 10 5 20 oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@//localhost:1521/事例名... 用戶名 密碼 5 10 5 20
public class DBUtils { private static ComboPooledDataSource comboPooledDataSource = null; static { //它會自動尋找配置文件,節點為mysql的數據庫【如果沒有指定,就使用默認的!】 comboPooledDataSource = new ComboPooledDataSource("mysql"); } public static DataSource getDataSource() { return comboPooledDataSource ; } public static Connection getConnection() { try { return comboPooledDataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("數據庫初始化失敗了!"); } } }設計數據庫表
非常簡單,根據實體表來設計就好了!
CREATE TABLE user ( id VARCHAR(20) PRIMARY KEY, username VARCHAR(20) UNIQUE NOT NULL, password VARCHAR(20) NOT NULL, email VARCHAR(20), birthday DATE );寫一個操作數據庫的Dao實現
public class UserImplDataBase implements UserDao { @Override public User find(String username, String password) { return null; } @Override public void register(User user) { } }
下面我們就直接使用DBUtils框架了
導入DBUtils的開發包
具體的代碼如下
@Override public User find(String username, String password) { QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); String sql = "SELECT * FROM user WHERE username=? AND password=?"; try { User user = (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{username, password}); return user == null ? null : user; } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("登陸失敗了!"); } } @Override public void register(User user) { QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); String sql = "INSERT INTO user (id, username, password, email,birthday) VALUES (?,?,?,?,?);"; String id = user.getId(); String username = user.getUsername(); String password = user.getPassword(); String email = user.getEmail(); Date date = user.getBirthday(); try { queryRunner.update(sql, new Object[]{id, username, password, email,date}); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("注冊失敗了"); } } }開發DaoFactory
我們的Dao實現已經有了XML版和JDBC版的,BusinessService調用Dao層方法的時候還是要new出具體的Dao實現,也就是以下的代碼:
UserDao userDao = new UserImplXML(); //或者 UserDao userDao= new UserImplDataBase();
這樣做有點不夠靈活,也就有點不夠專業!下面我們來說一下為什么需要DaoFactory?
為什么需要DaoFactory?參考博文:http://blog.sina.com.cn/s/blog_4ca34d0501008tpc.html
摘抄重點:
優點:
透明化:商業對象可以在完全不知道數據源如何具體實現的情況下來使用數據源. 訪問數據源是透明的,因為實現細節已經被隱藏進了DAO.
遷移簡單化:DAO 層的出現,使得應用程序向不同的數據庫實現進行遷移變的容易.商業對象可以對底層數據實現一無所知.這樣,遷移只涉及到了對DAO層的修改. 另外,如果使用工廠策略,則使為每一種底層數據實現提供一個具體的工廠實現成為可能.在這種情況下,遷移到一種不同的數據實現,其實就相當于為這個應用程序再提供一個新的工廠實現.
減少在商業對象中的編程難度:由于DAO管理著所有的數據訪問細節,因而大大簡化了在商業對象和其他使用DAO的數據客戶端里的代碼.所有的實現細節相關的代碼比如(SQL 語句)都包含在DAO而不在商業對象中. 這樣使得代碼變的更加健壯而且大大提高了開發效率.
將所有的數據訪問都多帶帶集中到一層中去: 因為所有的數據訪問操作現在都已經被DAO所代理,所以這個多帶帶的數據訪問層可以被看作可以是將數據訪問實現和其余應用程序相互隔離的一層. 這樣的集中,使得應用程序可以更加容易的來維護和管理.
缺點:
增加了多余的層:由于DAO在數據客戶端和數據源之外多創建了一層對象,因而,需要對他進行設計和實現,來均衡這個設計模式的利弊. 但是,一般來說,采用此設計模式還是利大于弊的.
需要對類的相互繼承關系進行設計:當使用工廠策略的時候,具體工廠類的繼承關系和由這些工廠類生成的產品需要進行設計和實現. 我們需要仔細考慮這些多付出的工作是否真的可以產生出來更高的靈活性. 使用這個策略會使設計變的更加復雜,然而,你可以先從工廠方法模式開始來實現這個策略,然后在需要的情況下再轉向抽象工廠
設計DaoFactory首先,我們把DaoFactory設計成單例的【工廠有一個就夠了!】
public class DaoFactory { private DaoFactory() { } private static final DaoFactory DAO_FACTORY = new DaoFactory(); //暴露公開方法獲取工廠對象 public static DaoFactory newInstance() { return DAO_FACTORY; } }
目前我們操作的是User,所以工廠造UserDao對象,而UserDao對象是JDBC版呢,還是XML版呢,我們通過配置文件來定(這樣就更靈活了)!
在src目錄下加入配置文件
注意:不要加""字符串的符號?。。。?!我就是這里搞了很久?。。?!
#class需要的是完整的對象名稱(包括包) #userClass=zhongfucheng.dao.impl.UserImplDataBase userClass=zhongfucheng.dao.impl.UserImplXML
讀取配置文件的信息,創建相對應的UserDao對象,直接在構造函數做就行了(其實就是個初始化的操作罷了)
private static UserDao userDao = null; private DaoFactory() { try { //讀取配置文件的信息 InputStream inputStream = DaoFactory.class.getClassLoader().getResourceAsStream("UserDao.properties"); Properties properties = new Properties(); properties.load(inputStream); String userClass = properties.getProperty("userClass"); //利用反射機制創建相對應的對象 userDao = (UserDao) Class.forName(userClass).newInstance(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("讀取文件失敗了!"); } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException("反射失敗了!"); } catch (InstantiationException e) { e.printStackTrace(); throw new RuntimeException("反射失敗了!"); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("反射失敗了!"); } } public static UserDao createUserDao() { return userDao; }在BusinessService層中用DaoFactory獲取UserDao對象
UserDao userDao = DaoFactory.newInstance().createUserDao();測試
如果我們的mysql驅動版本太低,就出現以下的異常!我們只需要下載新的mysql的jar包,導入項目即可!
java.sql.SQLException: Feature not implemented Query:insert into guestbook (id,name,email,url,title,content,time) value(?,?,?,?,?,?,?) Parameters: [1, qwq,wqwq,qwqw,qw,qw, 2010-09-13]
JDBC版的成功的效果如下:
XML版的成功效果如下:
總結由于我們的Service層可能有多種實現【jdbc,xml】,如果我們直接是使用new具體的Service,那么這耦合性就有點高了
于是我們有了工廠,工廠的目的就是解耦,我們通過配置文件來創建具體的對象。
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68532.html
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:需求通過異步刷新頁面驗證用戶輸入的賬號密碼是否在數據庫中存在。下面是下查詢的代碼查詢用戶名是否存在語句連接代碼關于類關于控制層獲取到輸入的用戶名調用中的查詢方法設置字符編碼關閉資源 需求 通過ajax異步刷新頁面驗證用戶輸入的賬號密碼是否在數據庫中存在。 技術棧 JSP+Servlet+Oracle 具體代碼 JSP部分: Insert title here fu...
摘要:安全框架是目前為止作為登錄注冊最常用的框架,因為它十分的強大簡單,提供了認證授權加密和會話管理等功能。本質上是一個特定安全的。當配置時,必須指定至少一個用來進行身份驗證和或授權。提供了多種可用的來獲取安全相關的數據。 web開發安全框架中的Apache Shiro的應用前階段就hadoop的分享了一些內容,希望對新手入門的朋友有點幫助吧!對于hadoop新手入門的,還是比較推薦大快搜索...
摘要:比如將建立連接的代碼放入工具類里面,工具類提供給外界一個獲取的方法,需要的時候直接調用方法即可。 在之前的這篇博客里面MySQL筆記 —— jdbc連接數據庫(增刪...
摘要:新建一個項目選擇自己的文件勾選項目構造如下設置項目配置快捷鍵選擇配置紅色框選擇時,運行成功會會自動運行下方的鏈接測試運行出現如下便創建成功編寫第一個代碼,測試環境是否設置成功第一個設置響應內容類型實際的邏輯是 新建一個servlet項目 Flies --> new --> project-->ProjectSDK選擇自己的JDK文件-->勾選Web Appliction -->Next...
閱讀 1926·2021-11-24 09:39
閱讀 3515·2021-09-28 09:36
閱讀 3282·2021-09-06 15:10
閱讀 3433·2019-08-30 15:44
閱讀 1154·2019-08-30 15:43
閱讀 1797·2019-08-30 14:20
閱讀 2712·2019-08-30 12:51
閱讀 2031·2019-08-30 11:04