一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写。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中去开始编码了,下面引入接口的概念,从设计层面上去讲下如何实现登陆功能,即面向接口编程。