1. 程式人生 > >【J2EE】【2.JDBC】JDBC連線資料庫(MariaDB,Mysql)(繼續之前jee的登陸例子)

【J2EE】【2.JDBC】JDBC連線資料庫(MariaDB,Mysql)(繼續之前jee的登陸例子)

零,名詞解釋

JDBC

JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式。

DAO

DAO(Data Access Object)是一個數據訪問介面,資料訪問:顧名思義就是與資料庫打交道。夾在業務邏輯與資料庫資源中間。

JavaBean

JavaBean 是一種JAVA語言寫成的可重用元件。使用者可以使用JavaBean將功能、處理、值、資料庫訪問和其他任何可以用java程式碼創造的物件進行打包,並且其他的開發者可以通過內部的JSP頁面、Servlet、其他JavaBean、applet程式或者應用來使用這些物件。這個概念太抽象,簡單一點:

主要負責處理事務(如資料運算,操縱資料庫)的JavaBean。JSP通常訪問的是後一種JavaBean。這個還是太高階,在簡單一點->只是資料打包,提供get set方法:

POJO(Plain Ordinary Java Object)簡單的Java物件,實際就是普通JavaBeans。有時候也叫做:VO(value -object)或dto(Data Transform Object)

原文再續,書接上回

登陸例子的程式碼:http://pan.baidu.com/s/1c0ldR5e

一,JDBC操作資料庫的一般步驟

註冊驅動 (只做一次) 建立連線(Connection) 建立執行SQL的語句(Statement) 執行語句 處理執行結果(ResultSet) 釋放資源


二,簡單實現資料庫連線類

        1,建立eva.dao包,新建MariaDBConn用於連結MariaDB的管理類
        2,老規矩,貼程式碼再解釋
public class MariaDBConn {
	final String DBDRIVER = "org.mariadb.jdbc.Driver";
	final String DBURL = "jdbc:mariadb://localhost:3306/test";
	//final String DBDRIVER = "com.mysql.jdbc.Driver"; //if you use mysql
	//final String DBURL = "jdbc:mysql://localhost:3306/test";//if you use mysql
	final String DBUSER = "root";
	final String DBPWD = "123";
	Connection conn = null;//資料庫連線

	public MariaDBConn() {
		try {
			Class.forName(DBDRIVER);// load the Connecting class
			conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);			
		}catch (ClassNotFoundException | SQLException e){
			e.printStackTrace();
		}
	}
	//another version to initialize with new parameters but not defautl parameters
	public MariaDBConn(String dbUrl, String dbUser, String dbPwd) {
		try {
			Class.forName(DBDRIVER);
			conn = DriverManager.getConnection(dbUrl, dbUrl, dbPwd);
		}catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Connection getConn() {
		return conn;
	}
	public void setConn(Connection conn) {
		this.conn = conn;
	}
	public void closeConn(){
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

          前面的final是說在程式碼中不可以在更改變數的值。因為是常量字串,所以全大寫。先定義連線資料庫需要的資料,在具體實現還可以從配置檔案中讀取。
          連線過程:註冊驅動就是這裡的載入類,建立連線就是getConnection那句
          有兩個版本建構函式,方便使用預設版或者手動輸入函式。注意如果使用的是Mariadb,要注意類名。
          這個類只是封裝了獲取連線和關閉連線部分,具體語句執行應該在Servlet中寫。
        3,但是還沒有聯結器啊,去mariaDB(mysql)官網下載jdbc聯結器


                     http://dev.mysql.com/downloads/connector/j/      or   https://downloads.mariadb.org/
        4,可以放在專案中 WebContent/WEB-INF/lib中,這個目錄eclipse會自動掃描。如果放在別處目錄需要在build path中加入


三,修改CheckAccount,在那裡呼叫查詢資料庫

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
		String pwd = request.getParameter("password");
		String username = request.getParameter("username");
		MariaDBConn db = new MariaDBConn();//例項化資料庫連線類
		Connection conn = db.getConn();//獲取連結
		String sql = "select password from user where username=?";//預設查詢語句
		PreparedStatement pstmt = null;//預查詢語句
		String rightPwd = "";
		try {
			pstmt = conn.prepareStatement(sql);//告訴連線,準備使用這個語句
			pstmt.setString(1, username);//往這個語句的第一個問好填入引數
			ResultSet rs = pstmt.executeQuery();//執行查詢。如果是執行更新應該用executeUpdate
			while(rs.next()) {//典型ResultSet處理方法
				rightPwd = rs.getString("password");//此時rs指向的是結果集中的一行,取列名為password的值
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(!pwd.isEmpty() && rightPwd.equals(pwd)){//僅有equals成立無法應對此種情況:如果沒輸入密碼,然後使用者名稱不存在
			try {
				request.getRequestDispatcher("jsp/logSuccess.jsp").forward(request, response);
			} catch (ServletException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			System.out.println("password is wrong!");
			response.sendRedirect("");
		}
		db.closeConn();
	}
          3.1在try塊中,將PreparedStatement繫結到對應的conn,然後設定引數,執行查詢,迴圈取結果集,可以通過列名或列的序號取得該行的具體值。
          3.2具體的業務邏輯沒變,只是在上一個版本的基礎上添加了查詢資料庫,確認密碼的功能。
          3.3這時候有人就要問了:Statement和preparedStatement有什麼區別,execute,executeQuery,executeUpdate有什麼區別。
            簡單地說,pstmt是經過預編譯的,會比stmt快,安全性好一點,要填引數;stmt是原始的語句,sql字串要自己拼接好。
                                executeQuery是查詢的;executeUpdate是增加/更改/刪除的。
          3.4最後要關閉連線。資料庫連線的開關是很昂貴的(消耗資源和時間的),可以考慮使用資料來源技術提升效能。(一兩個使用者的demo程式不需要)

四,ajax引例

       這個時候應該有人發現了,我不小心輸錯密碼,頁面跳回讓我重新登陸可以理解,為什麼要刷掉我的使用者名稱呢?打錯密碼要連帶重新輸入名字,這簡直就是反人類設計!!
       但,submit之後就是跳轉了,回來的時候是一個新的登陸頁面。
       現有的知識好像沒有辦法,那麼就引入我們下一節,ajax技術
       簡要的說,就是在頁面hold住不動,就將資訊傳送到伺服器檢驗使用者名稱密碼,如果成功,直接跳轉到歡迎頁面;如果失敗,留在原頁面,不做人和動作,不跳轉。


EvaDemo_2_jdbc.zip
最終程式碼:http://pan.baidu.com/s/1c0rP2jY

最後專案結構圖:


參考資料:
【J2EE】JDBC
http://blog.csdn.net/robinjwong/article/details/23605775
J2EE--JDBC
http://blog.csdn.net/han_yankun2009/article/details/21552853