JDBC2 - 六步骤模拟登录(详细)
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();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析