IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java+Swing+sqlServer学生成绩管理系统(DAY 10)连接数据库登录 -> 正文阅读

[大数据]Java+Swing+sqlServer学生成绩管理系统(DAY 10)连接数据库登录

Java+Swing+sqlServer学生成绩管理系统(DAY 10)连接数据库登录

1.准备工作

  1. 数据库配置参考教程eclipse连接sqlServer

  2. jdbc驱动下载

  3. 建立好数据库(示例数据库可能不规范,因为只作为测试登录与查询)

    create database StudentGrade
    
    create table manager
    		(id int
    		constraint c1 not null
    		constraint man_UK unique ,
    
    		usename varchar(10)
    		constraint c2 not null,
    
    		pwd varchar(20)
    		constraint c3 not null,
    
    		constraint managerPK primary key(id),
    		)
    insert into manager values (1,'陆离','lx0411');
    create table student
    		(id int
    		constraint c1 not null
    		constraint UK unique,
    
    		sname varchar(10)
    		constraint c2 not null,
    
    		sno varchar(10),
    
    		homeTown varchar(10),
    
    		cnScore int ,
    		enScore int ,
    		mathScore int ,
    		totalScore int ,
    		
    		constraint student_PK primary key(sno),
    
    		)
    insert into student values(1,'张三',
    '202001','长沙',97,98,99,294)
    
    

2.问题引入

  1. 连接数据库需要实现的类有哪些
  2. 如何获取数据库中的表中的信息,与用户输入的登录名和密码信息匹配,实现登录页面验证登录

3.遇到的问题

  1. 无法打开登录所请求的数据库 “StudentGrade”。登录失败。

    win+R——》输入cmd——》在cmd窗口输入sqlcmd——》select name from master.dbo.sysdatabases

    查看数据库是否存在,如果不存在说明数据库没有创建

    image-20211204185212146

  2. 创建表的pwd的列属性时,使用的时char类型,验证登录时总会报密码错误,因为用getString()从数据库中获取密码时会自动补齐空格,可以在创建属性时避免用char类型,或者在验证登录时切割掉自动补齐的那部分空格(具体操作详见代码注释中)

2.代码实现

DBUtil

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/*
 * 获取数据库连接和关闭各种资源的工具类
 */
public class DBUtil {
	
	private static final String URL="jdbc:sqlserver://localhost:1433;DataBaseName=StudentGrade";
	private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private static final String USER="sa";
	private static final String PWD="lxloveth0411";
	
	//加载驱动,写成静态代码块1
	static {
		try {
		    //加载JDBC驱动程序	Class.forName()方法
			Class.forName(DRIVER);
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//建立与数据库的连接 DriverManager.getConnection()方法
	public static Connection getConn() {
		try {
			return DriverManager.getConnection(URL,USER,PWD);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//关闭数据库连接
	public static void closeConn(Connection connection) {
		if(connection!=null) {
			try {
				connection.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	//关闭PreparedStatement
	public static void closePs(PreparedStatement ps) {
		if(ps!=null) {
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//关闭ResultSet
	public static void closeRs(ResultSet rs) {
		if(rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//
		
	}

}

AdminDo

package entity;

import java.util.Objects;

/*
 * 一个管理员信息的实体类
 *属性对应数据库中的各个属性,建议定义变量名与数据库中的相同
 * 在实体类中与数据库中的表对应
 */
public class AdminDO {
	

	//数据库中的表中的属性
	private Integer id;
	private String usename;
	private String pwd;
	
	
	public Integer getId() {
		return id;
	}


	public void setId(Integer id) {
		this.id = id;
	}


	public String getUsename() {
		return usename;
	}


	public void setUsename(String usename) {
		this.usename = usename;
	}


	public String getPwd() {
		return pwd;
	}


	public void setPwd(String pwd) {
		this.pwd = pwd;
	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

AdminService

/*
*自定义一个验证管理登录的接口
*
*/

package service;

import entity.AdminDO;

public interface AdminService {

	boolean validataAdmin(AdminDO adminDO);
	

}

AdminServiceImpl

/*
*使用接口AdminService
*实现接口,重写判断校验的方法
*
*/
package service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


import entity.AdminDO;
import util.DBUtil;
/*
 * 实现接口,重写判断校验的方法
 */
public class AdminServiceImpl implements AdminService{


	@Override
	public boolean validataAdmin(AdminDO adminDO) {
		
		String sql="select pwd from Manager where usename=?";
		
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		
		try {
			//连接数据库,获取数据库连接,getConn()方法已经提前在DBUtil中写好
			conn = DBUtil.getConn();
			System.out.println("数据库成功");
			//如果连接失败,则返回false
			if(conn==null) {
				return false;
			}
			
			ps = conn.prepareStatement(sql);
			//System.out.println(sql);
			//System.out.println(ps);
			ps.setString(1, adminDO.getUsename());
			
			rs = ps.executeQuery();
			
			//查询遍历
			while(rs.next()) {
				String pwd = rs.getString(1);
				/*因为我的数据库建表是pwd这一列是用char(20)
				 * 直接获取会把密码后的空格也获取到,不足20个字符,它会自动补齐
				 * 所以在验证登录的时候,equals会一直出错,需要先截取
				 * 这里也得到一个心得,字符属性列尽量使用除char的其他类型
				 */
				
				pwd = pwd.substring(0,pwd.indexOf(" "));
				System.out.println("pwd:"+pwd.length()+":"+pwd);
				System.out.println(adminDO.getPwd().length());
				if(adminDO.getPwd().equals(pwd)) {
					System.out.println("equals");
					return true;
				}else {
					System.out.println("not equals");
					return false;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			DBUtil.closeRs(rs);
			DBUtil.closeConn(conn);
			DBUtil.closePs(ps);
		}
		
		return false;
	}

}

StudentService(下一节实现)

package service;

public interface StudentService {

	

}

StudentServiceImpl(下一节实现)


LoginHandler

package handler;

import view.*;

import javax.swing.*;

import entity.AdminDO;
import service.AdminService;
import service.AdminServiceImpl;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class LoginHandler extends KeyAdapter implements ActionListener{

    private LoginView loginView;
    public LoginHandler(LoginView loginView){
        this.loginView=loginView;
    }


    @Override
    public void actionPerformed(ActionEvent e){
        JButton jButton=(JButton) e.getSource();
        String text=jButton.getText();
        if("重置".equals(text)){
            loginView.getNameTxd().setText("");//获取NameTxd上的用户名并置空
            loginView.getPwdFiled().setText("");//获取PwdFiled上的密码并置空
        }else if("登录".equals(text)){
            login();
        }
    }


    private void login() {
        String user=loginView.getNameTxd().getText();//获取NameTxd上的用户名
        char []chars=loginView.getPwdFiled().getPassword();//获取PwdFiled上的密码
        
        //验证用户名不能为空,且密码要正确
        if(user==null||"".equals(user.trim())||chars==null) {
        	JOptionPane.showMessageDialog(loginView,"用户名密码必填!");
        	return ;
        }
        String pwd=new String(chars);//转为字符串型
        System.out.println(user+":"+pwd);

        //查询database,验证
    	AdminService adminService=new AdminServiceImpl();
    	AdminDO adminDO =new AdminDO();
    	//将用户名和密码传到AdminDO中
    	adminDO.setUsename(user);
    	adminDO.setPwd(pwd);
    	
        boolean flag=adminService.validataAdmin(adminDO);
        
        System.out.println("boolean:"+flag);
        if(flag){
        	//如果登录成功在这里进入主界面并销毁登录界面
        	new MainView();
        	loginView.dispose();

        }else{
            JOptionPane.showMessageDialog(loginView,"用户名密码错误");
        }
    }

    @Override
    //键盘监听,按下回车键
    public void keyPressed(KeyEvent e) {
        if(KeyEvent.VK_ENTER==e.getKeyCode()) {
            login();
        }
    }

}

ystem.out.println(“boolean:”+flag);
if(flag){
//如果登录成功在这里进入主界面并销毁登录界面
new MainView();
loginView.dispose();

    }else{
        JOptionPane.showMessageDialog(loginView,"用户名密码错误");
    }
}

@Override
//键盘监听,按下回车键
public void keyPressed(KeyEvent e) {
    if(KeyEvent.VK_ENTER==e.getKeyCode()) {
        login();
    }
}

}


  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:06:24  更:2021-12-05 12:07:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:51:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码