一直在想着寫點特別點的東西,讓有興趣學編程的人確實能學到點乾貨,今天就來隨意寫寫。java
你們在網上查找資料看到最多的demo估計就是登陸功能的演示了,爲什麼你們偏心拿登陸來作demo呢?由於行業應用類程序的核心就是爲了讓用戶能與數據進行交互,對於一個高級DBA來講的話,他與數據的交互能夠直接與數據庫進行打交道,而對於小白用戶來講的話就須要很是友好的UI與數據進行交互,那麼就須要各類編程語言工具來實現這個過程了。而咱們開發一個應用類軟件,主要要對需求業務充分了解以後才能進行開發,好比開發一個財務類軟件,若是你不懂財務,談何開發。而登陸功能是你們接觸最多,也不用解釋業務的功能,所以做爲demo講解天然是最合適的。下面就以Java的學習進行講解登陸demo,從最開始的helloword模式一直演化到SSM框架模式,演示過程當中穿插講解各個學習階段涉及到的基礎知識點。mysql
這裏編程工具採用eclipse,首先創建一個普通的java工程,寫咱們的第一個程序sql
package com.xdw; /** * @author xiadewang *2018年1月14日 */ public class LoginTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("歡迎您登陸"); } }
很簡單,是否是就是helloword? main方法是程序的入口方法。數據庫
好下面對上面的程序一步步擴展,想到登陸就是對用戶名和密碼進行判斷,那麼修改代碼以下:編程
public static void main(String[] args) { // TODO Auto-generated method stub // System.out.println("歡迎您登陸"); String username = "xdw",password="123456"; if(username=="xdw" && password=="123456") { System.out.println("xdw用戶登陸成功"); }else { System.out.println("登陸失敗"); } }
這裏就引入到了java基礎知識的變量的聲明、定義與賦值,變量類型,註釋,比較運算符,if..else邏輯語句。這些基礎就再也不囉嗦了框架
這樣改寫以後,發現只對用戶xdw進行了登陸的判斷,若是每次更換一個用戶名或者密碼,就都要改動上面整個的代碼,那麼這個時候就該函數(Java裏面又叫方法)出場了。eclipse
將用戶名和密碼做爲方法的形參,將判斷結果做爲返回值。代碼以下jsp
package com.xdw; /** * @author xiadewang *2018年1月13日 */ public class LoginTest { public static void main(String[] args) { // TODO Auto-generated method stub // System.out.println("歡迎您登陸"); /* String username = "xdw",password="123456"; if(username=="xdw" && password=="123456") { System.out.println("xdw用戶登陸成功"); }else { System.out.println("登陸失敗"); }*/ LoginTest login=new LoginTest(); if(login.checkLogin("xdw","123")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } if(login.checkLogin("xxx","1234")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } } public boolean checkLogin(String username,String password) { if(username=="xdw" && password=="123") { return true; } else { return false; } } }
上面把最開始main函數裏面的邏輯判斷封裝到了checkLogin函數之中,因爲這裏沒有UI界面,咱們就把print打印看作是實際業務處理,那面checkLogin方法就是作的純粹邏輯處理,編程語言
具體的業務咱們仍是放在main方法中作,那麼就將checkLogin方法的返回值設置爲boolean,而不是void。此時有點邏輯與業務分離的味道了。。函數
順便囉嗦下方法如何定義,首先是修飾符(public或者private和protected,這個知識點主要就是了解它們的做用域,還不清楚的同窗趕忙去複習下),而後是返回類型(若是是void,則在函數體中不須要return,其餘則須要retrun。),接下來是函數名稱(命名規範通常是首字母小寫,駝峯命名),下面就是形參(命名規範也是首字母小寫,駝峯命名)。
那麼此時方法定義好了,咱們該如何在main中調用它呢?首先main方法是static的,而咱們如今定義的方法是非static的,在同一個類中,static的方法裏面是不能直接調用該類中的其餘非static的方法的,須要先new一個該類的對象出來,而後經過該對象進行方法的調用,如代碼中所示。還有一個辦法就是將checkLogin方法改爲staic的方法,則在main中就不用new了,直接調用該方法。看下面的代碼
package com.xdw; /** * @author xiadewang *2018年1月13日 */ public class LoginTest { public static void main(String[] args) { // TODO Auto-generated method stub // System.out.println("歡迎您登陸"); /* String username = "xdw",password="123456"; if(username=="xdw" && password=="123456") { System.out.println("xdw用戶登陸成功"); }else { System.out.println("登陸失敗"); }*/ if(checkLogin()) { System.out.println("遊客登陸"); } LoginTest login=new LoginTest(); if(login.checkLogin("xdw","123")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } if(login.checkLogin("xxx","1234")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } } public boolean checkLogin(String username,String password) { if(username=="xdw" && password=="123") { return true; } else { return false; } } public static boolean checkLogin() { return true; } }
你們能夠看到在main中直接調用了checkLogin(),這個函數沒有傳遞用戶名和密碼,就至關於遊客模式登陸,同時這裏又引入了一個知識點重載。什麼是重載?重載的兩個要素就是函數名相同,參數不一樣(參數不一樣是指的參數個數不同,或者參數的類型不同,不是說的參數名稱不一樣,形參的名稱是能夠隨意命名的)。重載的做用是什麼呢?徹底能夠給上面的checkLogin方法從新取個別的名字啊。是滴,取別的名字一點問題也沒有,重載的主要做用是增長程序的可讀性,咱們在閱讀API文檔的時候好多時候經過函數的名稱就大概知道它是幹什麼用的。咱們在調用的時候,就不須要記那麼多的方法名稱,而是知道了方法的功能就能夠直接的給他傳遞不一樣的參數,編譯器會明確的知道咱們調用了哪個方法。
寫到這裏,咱們全部的用戶數據都是本身在代碼中寫死的虛構出來的數據,實際業務中,用戶數據確定不可能寫在代碼中,那麼這個時候就輪到數據庫出場了。實際開發中,用戶數據都是存儲在數據庫之中,此時判斷用戶登陸的簡單邏輯以下,咱們傳遞用戶名和密碼參數給checkLogin方法,而後該方法中去查詢數據庫,看該用戶名和密碼是否匹配,若是匹配則表明登陸成功,反之失敗。java中如何鏈接數據庫進行操做呢?這時就須要JDBC了,這裏以mysql爲例,簡單講解下jdbc的操做流程。
咱們在以前的代碼中加入下面的一個方法checkLoginByJdbc,此時就不能再用checkLogin這個名字了,由於形參相同。
package com.xdw; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @author xiadewang *2018年1月13日 */ public class LoginTest { private Connection connection=null; private ResultSet resultSet=null; public static void main(String[] args) { // TODO Auto-generated method stub // System.out.println("歡迎您登陸"); /* String username = "xdw",password="123456"; if(username=="xdw" && password=="123456") { System.out.println("xdw用戶登陸成功"); }else { System.out.println("登陸失敗"); }*/ if(checkLogin()) { System.out.println("遊客登陸"); } LoginTest login=new LoginTest(); if(login.checkLogin("xdw","123")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } if(login.checkLogin("xxx","1234")) { System.out.println("登陸成功"); }else { System.out.println("登陸失敗"); } if(login.checkLoginByJdbc("xdw","123456")) { System.out.println("xdw經過jdbc登陸成功"); }else { System.out.println("登陸失敗"); } } public boolean checkLogin(String username,String password) { if(username=="xdw" && password=="123") { return true; } else { return false; } } public static boolean checkLogin() { return true; } public boolean checkLoginByJdbc(String username,String password) { try { //經過反射獲取數據庫鏈接驅動 Class.forName("com.mysql.jdbc.Driver"); try { //獲取數據庫鏈接對象 connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1/jsplogintest","root","root"); //構建sql語句,?表明須要綁定的參數 String sql="select * from user where username=? and password=?"; //獲取PreparedStatement對象 PreparedStatement preparedStatement=connection.prepareStatement(sql); //綁定參數 preparedStatement.setString(1, username); preparedStatement.setString(2, password); //執行sql語句,這裏是查詢語句,因此調用executeQuery返回結果集 resultSet=preparedStatement.executeQuery(); //獲取結果集以後數據庫的操做就結束了,後面是要根據結果集來處理咱們的業務邏輯 if(resultSet.next()) { //結果集不爲空,則能夠表示用戶存在,即登陸成功 resultSet.close(); connection.close(); return true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } }
數據表結構以下
jdbc的操做流程上面註釋也寫的比較清楚了,之後就是照葫蘆畫瓢了,jdbc操做很簡單,重要的技能仍是要對sql玩的牛才行。
這裏代碼的複用性太差,沒寫一個方法的時候,都去寫一堆的jdbc的鏈接與關閉操做顯然不現實,因而咱們須要把它們封裝到一個工具類當中,以下面的DBHelper
package com.xdw; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /** * @author xiadewang *2018年1月13日 */ public class DBHelper { public static final String url = "jdbc:mysql://127.0.0.1/jsplogintest"; public static final String name = "com.mysql.jdbc.Driver"; public static final String user = "root"; public static final String password = "root"; public Connection conn = null; public PreparedStatement pst = null; public DBHelper(String sql) { try { Class.forName(name);//指定鏈接類型 conn = DriverManager.getConnection(url, user, password);//獲取鏈接 pst = conn.prepareStatement(sql);//準備執行語句 } catch (Exception e) { e.printStackTrace(); } } public void close() { try { this.conn.close(); this.pst.close(); } catch (SQLException e) { e.printStackTrace(); } } }
而後改寫checkLoginByJdbc方法,以下
public boolean checkLoginByJdbc(String username, String password) { try { String sql = "select * from user where username= ? and password= ?";// SQL語句 DBHelper db1 = new DBHelper(sql);// 建立DBHelper對象 db1.pst.setString(1, username); db1.pst.setString(2, password); ResultSet ret = db1.pst.executeQuery();// 執行語句,獲得結果集 if(ret.next()) { return true; } ret.close(); db1.close();// 關閉鏈接 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; }
第一階段先就到這裏吧,至此咱們都是用面向過程的方法去實現該功能的,直接想實現登陸功能,就在處理業務的主入口main中去開始編碼了,下面引入接口的概念,從設計層面上去講下如何實現登陸功能,即面向接口編程。