Java实现连接数据库验证登录和注册(附详细知识点讲解) |
您所在的位置:网站首页 › 网页登录系统 › Java实现连接数据库验证登录和注册(附详细知识点讲解) |
文章目录
1、前言1.1、为什么要写这篇文章1.2、使用的软件1.3、导航1.4、讲解视频
2、JDBC2.1、简介2.2、导入jar包2.3、创建第一个JDBC程序2.3.5、JDBC程序完整代码2.4、JDBC工具类2.4.5、JdbcUtils工具类完整代码2.5、TestInsert类:增2.6、TestDelete类:删2.7、 TestUpdate类:改2.8、TestSelect类:查
3、SQL注入3.1、问题引入3.2、PreparedStatement对象3.3、PreTestSelect类:查3.4、PreTestInsert类:增3.5、PreTestDelete类:删3.6、PreTestUpdate类:改
4、IDEA连接数据库4.1、建立连接
5、事务5.1、ACID原则5.2 、模拟银行账户
6、数据库连接池6.1、问题引入6.2、简介6.3、开源数据库连接池6.4、Druid下载jar包6.5、配置6.6、DruidUtils类:工具6.7、DruidTest类:测试
7、用户登录验证实现7.1、创建数据库建表7.2、登录按钮监听7.3、代码实现7.4、界面优化7.5、补充说明
8、用户注册功能实现8.1、loginFrame修改8.2、RgsterFrame类:注册8.2、设置约束8.3、运行结果
1、前言
1.1、为什么要写这篇文章
学完Java基础后,一般会做个项目练手(上一篇博客有讲到 Java在线聊天室课程设计 ) 当中肯定会涉及到登录验证,但没学过数据库 😅,不知道如何操作;只能把用户账户密码预存在一个txt文本当中,然后通过IO流读取验证 ⭐最后去搜相应的资料和网课进行学习,现在问题已解决,给大家做分享⭐ 1.2、使用的软件IDEA:编写Java代码,eclipse也可 Navicat:图形化操作数据库,当然IDEA里面也有内置的DataBase,不过社区版只能下载相应的插件。除此,在Navicat内可以进行SQL语句编写 1.3、导航如标题所说,想要简单实现连接数据库去验证登录 👉 请直接跳转 7、用户登录验证实现 😆 ,其余内容为对应需补充的知识点 1.4、讲解视频B站:十分钟上手JDBC 2、JDBC 2.1、简介JDBC(Java DataBase Connectivity):是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。 2.2、导入jar包下载地址:mysql_JDBC_jar包 2.3、创建第一个JDBC程序新建测试类 JdbcFirstDemo ,以下是固定写法 1、加载驱动 2、 用户信息和url jdbc_test 这里是数据库的名称,改成自己的就行了 没有表的话,在navicat当中先去建个表 3、连接成功 4、statement 执行SQL的对象 5、执行SQL语句,返回结果集 SQL语句可以现在Navicat中编写,再复制到IDEA里面: 6、释放连接 运行结果: 2.3.5、JDBC程序完整代码完整代码如下: //第一个JDBC例子 public class JdbcFirstDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1、加载驱动 // DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动 //2、用户信息和url String url="jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&useCharacter=utf8" + "&userSSL=false&serverTimezone=GMT%2B8"; String username="root"; //下面一句应该为密码的英文,写博客的时候给我爆风险警告了 //String 密码 ="123456"; //3、连接成功,数据库对象 Connection 代表数据库 Connection connection = DriverManager.getConnection(url, username, password); //4、执行sql的对象 statement Statement statement = connection.createStatement(); //5、执行sql的对象 去执行sql,可能存在结果,返回结果 String sql="select * from player"; ResultSet resultSet = statement.executeQuery(sql); //查看输出数据 while(resultSet.next()){ System.out.println("name = "+resultSet.getObject("name")); System.out.println("number = "+resultSet.getObject("number")); System.out.println(" 密码 = "+resultSet.getObject("password")); }//写博客说这里写password有风险,我就改成中文了 //6、释放连接 resultSet.close(); statement.close(); connection.close(); } } 2.4、JDBC工具类思想:加载驱动、获取连接、释放连接不变,变的只有sql语句 这里可能有同学不清楚反射,但是没关系,可以先跟着写一遍 可以不用 db.properties 这个文件,按照 2.3.5 那种方式编写 ☹️ 2.4.5、JdbcUtils工具类完整代码 public class JdbcUtils { private static String driver=null; private static String url=null; private static String username=null; private static String password=null; static { try{ InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(is); driver=properties.getProperty("driver"); url=properties.getProperty("url"); username=properties.getProperty("username"); password=properties.getProperty("password"); //驱动只加载一次 Class.forName(driver); }catch(Exception e){ e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } //释放连接 public static void release(Connection cnn, Statement stmt, ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(stmt!=null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(cnn!=null){ try { cnn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } 2.5、TestInsert类:增编写数据库增加数据测试类: 2.6、TestDelete类:删编写数据库删除数据测试类: 2.7、 TestUpdate类:改编写数据库修改数据测试类: 2.8、TestSelect类:查编写数据库查找数据测试类: 查找相对于增、删、改来说是要容易一些的 😋
大家可能注意到了这里rs.getString(),如果你知道是返回的是String类型就用这个,那么同理返回的int类型就用 rs.getInt();如果不知道用啥就用rs.getObject() 3、SQL注入 3.1、问题引入接着上面的查询,我们现在想根据账号和密码进行信息查询 🧐 简单模拟一个登陆业务: 运行结果: 如果这个时候更改一下输入的账号和密码,不走寻常路: 可以看到,所有的数据均符合,都被查找出来(rs.next()一直为true) 3.2、PreparedStatement对象可以防止SQL注入!!! 3.3、PreTestSelect类:查我们可以对之前编写的TestSelect类进行一些变化: 3.4、PreTestInsert类:增 3.5、PreTestDelete类:删 3.6、PreTestUpdate类:改 4、IDEA连接数据库其实IDEA内也可以查看数据库的表,对数据进行增删改查的操作 😋 4.1、建立连接如果用的不是企业版,是社区版的话,就没有database这个选项 解决办法:下载插件,使用DB Browser 新建连接: 界面如下: 不过有几次我明明对数据进行了操作,刷新IDEA里的表,数据一直没有更新;跑到Navicat里面去看数据已经进行了更新 😅 5、事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 5.1、ACID原则 5.2 、模拟银行账户 6、数据库连接池 6.1、问题引入 6.2、简介 6.3、开源数据库连接池 6.4、Druid下载jar包提供1.2.12版本jar包的下载地址:druid-1.2.12.jar下载 6.5、配置导入lib目录,我的IDEA自动解压了;大家若没有自动解压,需要手动Add as Library 根据后面要使用到的DruidDataSourceFactory的源码,应该对properties文件的属性进行修改 6.6、DruidUtils类:工具重写工具类,不过整体和之前的JdbcUtils差不多 6.7、DruidTest类:测试可以看到,基本上换汤不换药,依然正常运行 😜 7、用户登录验证实现 7.1、创建数据库建表首先我们得在数据库里面有一张对应验证登录的表 7.2、登录按钮监听我们利用JFrame制作一个简单的登录界面 这个时候是有登录按钮的,按钮绑定监听事件来验证登录是否正确 7.3、代码实现 public class LoginFrame extends JFrame { private static final Integer WIDTH=600; private static final Integer HEIGHT=400; public LoginFrame(){ setTitle("登录界面"); setSize(WIDTH,HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); JLabel jblBg = new JLabel();//可插入背景图片 jblBg.setBounds(0,0,WIDTH,HEIGHT); jblBg.setLayout(null); this.add(jblBg); //账号 JLabel uid = new JLabel("账号"); uid.setBounds(170,120,50,30); jblBg.add(uid); //账号输入框 JTextField uidInput = new JTextField(); uidInput.setBounds(240, 120, 160, 30); jblBg.add(uidInput); //密码 JLabel upwd=new JLabel("密码"); upwd.setBounds(170, 180, 50, 30); jblBg.add(upwd); //密码输入框 JPasswordField upwdInput = new JPasswordField(); upwdInput.setBounds(240, 180, 160, 30); jblBg.add(upwdInput); //登录按钮 JButton btnLogin=new JButton("登录"); btnLogin.setBounds(260, 250, 100, 30); btnLogin.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String getInputUid=uidInput.getText(); String getInputUpwd=upwdInput.getText(); Connection conn=null; PreparedStatement pstmt=null; ResultSet rs=null; try { conn=JdbcUtils.getConnection(); String sql="SELECT * FROM userinfo WHERE UID =? AND UPWD =?"; pstmt=conn.prepareStatement(sql); pstmt.setString(1,getInputUid); pstmt.setString(2,getInputUpwd); rs= pstmt.executeQuery(); //创建弹窗 JDialog dialog = new JDialog(); dialog.setLocationRelativeTo(null); dialog.setSize(200,200); if(rs.next()){ dialog.add(new JLabel("登录成功!")); }else{ dialog.add(new JLabel("登录失败!")); } dialog.setVisible(true); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { JdbcUtils.release(conn,pstmt,rs); } } }); jblBg.add(btnLogin); setVisible(true); } //主函数只需运行loginFrame即可 public static void main(String[] args) { new LoginFrame(); } }登录成功: 登录失败: 7.4、界面优化我们可以对界面稍稍优化一下 加入背景图片,调整字体、按钮颜色 🥰 代码更新: public class LoginFrame_new extends JFrame { private static final Integer WIDTH=600; private static final Integer HEIGHT=400; public LoginFrame_new(){ setTitle("登录界面"); setSize(WIDTH,HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); ImageIcon imgBg= new ImageIcon("src/images/JRbg.jpg"); JLabel jblBg = new JLabel(imgBg);//可插入背景图片 jblBg.setBounds(0,0,WIDTH,HEIGHT); jblBg.setLayout(null); this.add(jblBg); //账号 JLabel uid = new JLabel("Account:"); uid.setBounds(150, 120, 110, 30); uid.setFont(new Font("PingFang SC", Font.BOLD, 17)); uid.setForeground(Color.BLACK); jblBg.add(uid); //账号输入框 JTextField uidInput = new JTextField(); uidInput.setBounds(260, 120, 180, 30); jblBg.add(uidInput); //密码 JLabel upwd=new JLabel("Password:"); upwd.setBounds(150, 180, 110, 30); upwd.setFont(new Font("PingFang SC", Font.BOLD, 17)); upwd.setForeground(Color.BLACK); jblBg.add(upwd); //密码输入框 JPasswordField upwdInput = new JPasswordField(); upwdInput.setBounds(260, 180, 180, 30); jblBg.add(upwdInput); //登录按钮 JButton btnLogin=new JButton("Login"); btnLogin.setBounds(270, 250, 110, 40); btnLogin.setBackground(Color.PINK); btnLogin.setForeground(Color.WHITE); btnLogin.setFont(new Font("PingFang SC", Font.BOLD, 17)); btnLogin.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String getInputUid=uidInput.getText(); String getInputUpwd=upwdInput.getText(); Connection conn=null; PreparedStatement pstmt=null; ResultSet rs=null; try { conn= JdbcUtils.getConnection(); String sql="SELECT * FROM userinfo WHERE UID =? AND UPWD =?"; pstmt=conn.prepareStatement(sql); pstmt.setString(1,getInputUid); pstmt.setString(2,getInputUpwd); rs= pstmt.executeQuery(); //创建弹窗 JDialog dialog = new JDialog(); dialog.setLocationRelativeTo(null); dialog.setSize(200,200); if(rs.next()){ dialog.add(new JLabel("登录成功!")); }else{ dialog.add(new JLabel("登录失败!")); } dialog.setVisible(true); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { JdbcUtils.release(conn,pstmt,rs); } } }); jblBg.add(btnLogin); setVisible(true); } //主函数只需运行loginFrame即可 public static void main(String[] args) { new LoginFrame_new(); } } 7.5、补充说明😅 因为数据库连接池是后来加上去的 所以该验证登录程序未做相应的优化 😕 8、用户注册功能实现和上面的登录换汤不换药,完全可以用上面登录界面的模板 加上一个注册按钮,点击打开注册界面,去验证注册是否成功 🤤 8.1、loginFrame修改 8.2、RgsterFrame类:注册8.2、设置约束 8.3、运行结果 注册成功 注册失败 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |