首页 > 其他分享 >JDBC2 - 六步骤模拟登录(详细)

JDBC2 - 六步骤模拟登录(详细)

时间:2023-01-11 15:35:50浏览次数:42  
标签:JDBC2 jdbc String 登录 -- 步骤 Driver resultSet mysql

JDBC六步骤详细信息 - 模拟登录

package com.atguigu.api.statement;

import com.mysql.cj.jdbc.Driver;

import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * TODO
 *  1.明确jdbc的使用流程 和 详细讲解内部设计api方法
 *  2.发现问题,引出preparedStatement
 *
 *  输入账号密码
 *  进行数据库查询
 *  反馈登录成功或失败
 *
 *  1.键盘输入事件,收集账号、密码信息
 *  2.注册驱动
 *  3.获取链接
 *  4.创建statement
 *  5.发送查询SQL语句,并获取返回结果
 *  6.结果判断,显示登录成功或失败
 *  7.关闭资源
 */

public class StatementLoginPart {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        //1.获取用户信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String account = scanner.nextLine();

        System.out.println("请输入密码:");
        String password = scanner.nextLine();

        //2.注册驱动
        /**
         *  方法1:
         *     DriverManager.registerDriver(new com.cj.jdbc.sql.Driver());
         *     注意:8+ com.cj.jdbc.sql.Driver()
         *          5+ com.jdbc.sql.Driver
         *     问题:注册两次驱动
         *          1.DriverManager.registerDriver() 方法本身会注册一次
         *          2.Driver.statcic{ DriverManager.registerDriver() } 静态代码块,也会注册一次
         *     解决:只想注册一次
         *          只触发静态代码块即可!Driver
         *     触发静态代码块:
         *          类加载机制:类加载的时刻,会触发静态代码块
         *                    加载 [class文件 -> jvm虚拟机的class对象]
         *                    连接 [验证(检查文件类型) -> 准备(静态变量默认值)-> 解析(触发静态代码块)]
         *                    初始化(静态属性赋真实值)
         *     触发类加载:
         *          1.new 关键字
         *          2.调用静态方法
         *          3.调用静态属性
         *          4.接口 1.8 default默认实现
         *          5.反射
         *          6.子类触发父类
         *          7.程序入口main
         */

        //方案1 两次注册
        //DriverManager.registerDriver(new Driver());

        //方案2.1 使用mysql新版本的驱动 | 如果换成其他驱动如Oracle,需要修改代码,不灵活
        //new Driver();

        //方案2.2 使用反射 触发类加载从而触发静态代码块的调用
        //字符串 -> 提取到外部的配置文件 -- 可以在不改变代码的情况下,完成数据库驱动的切换
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取数据库连接
        /**
         * getConnection(1,2,3) 方法,是一个重载方法
         * 运行开发者,用不同的形式传入数据库连接的核心参数
         *
         * 核心属性:
         *      1.数据库软件所在的主机的ip地址:localhost | 127.0.0.1
         *      2.数据库软件所在的主机的端口号:3306
         *      3.连接具体库名: atguigu
         *      4.连接的账户: root
         *      5.连接的密码: 123456
         *      6.可选信息 ...
         *
         * 三个参数:
         *      String url
         *              jdbc:数据库管理软件名称[mysql/oracle]://ip地址|主机名:port端口号/数据库名?key=value
         *              jdbc:mysql://127.0.0.1:3306/atguigu
         *              jdbc:mysql://localhost:3306/atguigu
         *              数据库软件在本机且端口号为3306 --> 可省略本机地址和3306端口号
         *              jdbc:mysql:///atguigu
         *      String user
         *      String password
         * 两个参数:
         *      String url
         *              和三个参数的url相同
         *      Properties info
         *              存储账号和密码
         *              Properties 类似于Map 只不过 key = value 都是字符串形式
         * 一个参数:
         *      String url
         *              前面部分和三个参数相同,后面在url的可选信息中传入user和password等其他信息
         *              携带固定的参数名 user password -- 规定
         *      8.0.27其他可选信息:
         *              serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true
         *              8.0.25+ 自动识别时区 serverTimezone=Asia/Shanghai 不再添加
         *              8+ 默认使用utf8格式 useUnicode=true&characterEncoding=utf8&useSSL=true 都可以省略
         *              因此8.0.25+ 基本不需要添加其他可选信息
         */
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");

        Properties info = new Properties();
        info.put("user", "root");
        info.put("password", "123456");
        Connection connection1 = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu", info);

        Connection connection2 = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu?user=root&password=123456");

        //3.创建发生SQL语句的statement对象
        //statement 可以发生SQL语句到数据库,并且获取返回结果
        Statement statement = connection.createStatement();

        //4.发送SQL语句 编写+发送
        String sql = "select * from t_user where account = '" +account+ "' AND password = '" +password+ "'; ";
        ResultSet resultSet = statement.executeQuery(sql);

        /**
         * SQL分类:DDL(容器创建、修改、删除) DML(插入,修改,删除) DQL(查询) DCL(权限控制) TPL(事务控制语言)
         *
         * .executeUpdate(sql)
         * 参数:SQL 非DQL
         * 返回:int
         *          情况1:DML 返回影响的行数
         *          情况2:非DML return 0;
         *
         * .executeQuery(sql)
         * 参数:SQL DQL
         * 返回:resultSet 结果封装对象
         * ResultSet resultSet = statement.executeQuery(sql);
         */

        //5.查询结果集解析 resultSet
        /**
         * Java是一种面向对象的语言
         * 将结果返回的表,封装成resultSet对象,内部一定是有行有列的
         *
         * resultSet -> 逐行读取数据 -> 再获取记录的每一个字段(逐列)
         * 解析过程:
         *      1.移动游标指向数据行
         *      游标默认指向第一行数据之前
         *      因此要先判断是否有下一行再进行游标移动
         *      用next方法判断是否有下一行 --> while(next){获取列数据}
         *
         *      2.获取指定数据行的列数据
         *      get + 列数据类型 (String columnLabel) | (int columnIndex)
         *      getString(列名|别名 -- String类型)
         *      getString(列下标从1开始 -- int类型)
         */

//        while (resultSet.next()) {
//            int id = resultSet.getInt(1);
//            String account1 = resultSet.getString("account");
//            String password1 = resultSet.getString(3);
//            String nickname = resultSet.getString("nickname");
//            System.out.println(id + "--" + account1 + "--" + password1 + "--" +nickname);
//        }

        //只要有一行数据返回,说明登录成功
        if(resultSet.next()) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

        //6.释放资源
        resultSet.close();
        statement.close();
        connection.close();
        connection1.close();
        connection2.close();
    }
}

标签:JDBC2,jdbc,String,登录,--,步骤,Driver,resultSet,mysql
From: https://www.cnblogs.com/Ashen-/p/17043886.html

相关文章