前面已经完成了登录界面的设计,单击确认按钮可以获取输入的用户名和密码,下面来将演示实现真实的登录(输入值和数据库的比对)
1、设计“登录服务”
通常我们根据业务关系,对相应的操作人员提供对外的各种服务,下面创建一个管理员服务类AdminService
AdminService.java(定义服务,方法实现下面补充)
package com.demo.service; /* * 项目名称: * * 文件名称为:AdminService.java * 文件创建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午10:04:15 * @copyright daxiang */ public class AdminService { /** * 登录服务 * * @param id * @param pwd * @return 1、成功 2、用户名错误 3、密码错误 */ public int login(String id, String pwd) { return 0; } /** * 修改密码服务 * * @param id * @param pwd * @param newpwd * @return false 修改失败 true 修改成功 */ public boolean changePwd(String id, String pwd, String newpwd) { return false; } }
2、为登录服务提供数据库查询操作
在第一节中为管理员提供了两种服务1、登录 2、修改密码,但并未实现具体过程,下面来完成登录服务的具体过程。
要判断用户是否能成功登录需要两步
(1)根据输入的用户名查询数据库中是否有该用户
(2)如存在该用户则比对输入的密码是否和数据库中存储的密码相同
接下来看看传统的查询方式(一个完整的查询)
package com.java.mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * <p> * Title: db.java * </p> * * @author daxiang * @version 1.0 创建时间:2018年5月22日 上午8:00:22 */ public class DB { public static void main(String[] args) { Connection con;// 声明Connection对象 String driver = "com.mysql.jdbc.Driver";// 驱动程序名 String url = "jdbc:mysql://localhost:3306/db_student";// URL指向要访问的数据库名db_student String user = "root";// MySQL配置时的用户名 String password = "123";// MySQL配置时的密码 try { Class.forName(driver);// 加载驱动程序 con = DriverManager.getConnection(url, user, password);// 使用getConnection()方法,连接MySQL数据库!! if (!con.isClosed()) System.out.println("成功连接mysql数据库"); // 2.创建statement类对象,用来执行SQL语句!! Statement statement = con.createStatement(); // 要执行的SQL语句 String sql = "select * from admin"; // 3.ResultSet类,用来存放获取的结果集!! ResultSet rs = statement.executeQuery(sql); System.out.println("-----------------"); System.out.println("执行结果如下所示:"); System.out.println("-----------------"); System.out.println("id" + "\t" + "admin" + "\t" + "password"); System.out.println("-----------------"); // 遍历查询结果集 while (rs.next()) { String id = rs.getString(1);// 获取第一列数据 String username = rs.getString(2); // 获取第二列数据 String pwd= rs.getString(3); // 获取第三列数据 System.out.println(id + "\t" + username + "\t" + pwd);// 输出结果 } rs.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("无法加载驱动"); e.printStackTrace();// 数据库驱动类异常处理 } catch (SQLException e) { e.printStackTrace();// 数据库连接失败异常处理 } catch (Exception e) { e.printStackTrace(); } } }
上面完成了对db_student数据库中admin表的查询,而且得到了结果
但是这样的并没有实现代码复用,当别的实体需要查询或者其他操作时,还需要重复的连接等过程,所以我们对常用操作进行封装,将数据库的基本“增、删、查、改”封装到一个类里面
DbUtil.java(数据库操作工具类)
package com.demo.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /* * 项目名称: * * 文件名称为:DbUtil.java * 文件创建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午7:56:46 * @copyright daxiang */ public class DbUtil { // 定义连接对象 private Connection connection; // 定义操作对象 private Statement statement; /** * * @throws Exception */ public DbUtil() throws Exception { this.connection = getCon(); this.statement = connection.createStatement(); } /** * 获取数据库连接 * * @return 数据库连接Connection * @throws Exception */ public Connection getCon() throws Exception { // 说明AppConstants类中已经将一些参数作为静态常量存储 Class.forName(AppConstants.JDBC_DRIVER); Connection con = DriverManager.getConnection(AppConstants.JDBC_URL, AppConstants.JDBC_USERNAME, AppConstants.JDBC_PASSWORD); return con; } /** * 关闭数据库连接 * * @param con * @throws SQLException */ public void closeCon(Connection con) throws SQLException { if (con != null) { con.close(); } } /** * 赠、删、改 * * @param sql * @return * @throws SQLException */ public boolean execute(String sql) throws SQLException { return statement.execute(sql); } /** * 查询 * * @param sql * @return * @throws SQLException */ public ResultSet query(String sql) throws SQLException { return statement.executeQuery(sql); } }
AppConstants .java(常量参数类)
package com.demo.util; /* * 项目名称: * * 文件名称为:AppConstants.java * 文件创建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午7:57:10 * @copyright daxiang */ public class AppConstants { // jdbc public static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/db_student?useUnicode=true&characterEncodeing=UTF-8"; public static final String JDBC_USERNAME = "root"; public static final String JDBC_PASSWORD = "123"; public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; }
这样封装后我们就可以简化服务类中的代码,请看
新建一个Admin实体数据库操作类,利用dbutil工具实现查询
AdminDao.java
package com.demo.dao; import java.sql.ResultSet; import com.demo.model.Admin; import com.demo.util.DbUtil; /* * 项目名称: * * 文件名称为:AdminDao.java * 文件创建人:daxiang * * 修改记录: * 修改人 修改日期 备注 * * * * @author daxiang * @version * @time 2018年6月13日 下午10:25:06 * @copyright daxiang */ public class AdminDao { public Admin query(String username) throws Exception { // 实例化操作类 DbUtil dbUtil = new DbUtil(); // 查询语句,由于username是字符串,所以需要username='" + username+"'"这样拼接 String sql = "select * from admin where username='" + username+"'"; // 执行查询 ResultSet rs = dbUtil.query(sql); // 创建null的admin对象 Admin admin = null; // 判断是否有结果,并循环 while (rs.next()) { // new一个新对象赋值给admin admin = new Admin(); // 给对象赋值 admin.setId(rs.getInt("id")); admin.setUsername(rs.getString("username")); admin.setPassword(rs.getString("password")); } // 返回查询结果 return admin; } }
下面完善AdminService中的登录服务
package com.demo.service; import com.demo.dao.AdminDao; import com.demo.model.Admin; /* * 项目名称: * * 文件名称为:AdminService.java * 文件创建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午10:04:15 * @copyright daxiang */ public class AdminService { /** * 登录服务 * * @param id * @param pwd * @return 1、成功 2、用户名错误 3、密码错误 * @throws Exception */ public int login(String username, String pwd) throws Exception { // 新建admin数据库操作对象 AdminDao adminDao = new AdminDao(); // 1、根据输入的用户名查询数据库中是否有该用户 Admin admin = adminDao.query(username); // 判断查询出的用户是否存在 if (admin != null) { //2、比对输入的密码是否和数据库中存储的密码相同 if (admin.getPassword().equals(pwd)) { // 返回成功的代码 return 1; } // 返回密码错误的代码 return 3; } // 返回用户名错误的代码 return 2; } /** * 修改密码服务 * * @param id * @param pwd * @param newpwd * @return false 修改失败 true 修改成功 */ public boolean changePwd(String id, String pwd, String newpwd) { return false; } }
修改LoginView中的处理
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { // 获取管理员操作服务 AdminService adminService = new AdminService(); // 处理登录 int i = adminService.login(textField.getText(), new String( passwordField.getPassword())); //显示各种结果 switch (i) { case 1: JOptionPane.showMessageDialog(null, "登录成功"); // 释放屏幕资源 dispose(); // 打开主界面 new MainView(); break; case 2: JOptionPane.showMessageDialog(null, "用户名错误!"); break; case 3: JOptionPane.showMessageDialog(null, "密码错误!"); break; default: break; } } catch (Exception e1) { e1.printStackTrace(); } } });
截图
用户名错误
密码错误
登录成功