Java课程设计---实现登录(2)

  前面已经完成了登录界面的设计,单击确认按钮可以获取输入的用户名和密码,下面来将演示实现真实的登录(输入值和数据库的比对)

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();
				}
			}
		});

截图

  用户名错误

  密码错误

   

  登录成功

  

猜你喜欢

转载自www.cnblogs.com/daxiang2008/p/9172277.html
今日推荐