JDBC的使用
JDBC
JDBC:连接Java程序和数据库
1.JDBC使用步骤
- 注册驱动,依赖的jar包,进行安装
- 建立连接connection
- 创建发送SQL语句的对象statement
- statement对象,发送SQL语句到数据库,并且获取返回结果,resultset结果对象
- 解析结果集,拆resultset结果对象
- 销毁资源,connection,statement,resultset释放
2.具体代码
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;
/**
* @author mhw
* @create 2023/3/2 13:15
* @email 480738950@qq.com
*
* 模拟用户登录
* 1.键盘输入事件,收集账号和密码信息
* 2.注册驱动
* 3.获取连接
* 4.创建statement
* 5.发送查询SQL语句,并获取返回结果
* 6.结果判断,显示登录成功还是失败
* 7.关闭资源
*/
public class StatementUserLoginPart {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.键盘输入事件,收集账号和密码信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入账号:");
String account=scanner.nextLine();
System.out.println("请输入密码:");
String password=scanner.nextLine();
//2.注册驱动
//使用反射触发类加载
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取连接
/**
* getConnection的重载
* 三个参数
*参数1:url
* jdbc:数据库厂商名://ip地址:port/数据库名
* jdbc:mysql://localhost:3306/atguigu
* 当IP地址是本机,且端口号是3306时,可以省略"ip地址:port" 直接 jdbc:mysql///atguigu
*参数2:账号 root
*参数3:密码 root
*
*二个参数:
* String url:此url和三个参数的url的作用一样!数据库ip ,端口号,具体的数据库和可选信息Properties info:存储账号和密码
* Properties类似于Map只不过key = value都是字符串形式的!
* key user :账号信息
* key password :密码信息
*
* 一个参数:
* 账号和密码放在url后面的可选信息上,具体的数据库名后加个? 如果有多对,用&连接
* jdbc:mysql://127.0.0.1:3306/atguigu?key=value&key=value
* jdbc:mysql///atguigu?user=root&password=root
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu","root","root");
/*
Properties info=new Properties();
info.put("user",account);
info.put("password",password);
Connection connection1 = DriverManager.getConnection("jdbc:mysql///atguigu", info);
Connection connection2 = DriverManager.getConnection("jdbc:mysql///atguigu?user=root&password=root");
*/
//一般直接选三个参数的方法。
//4.创建statement
Statement statement = connection.createStatement();
//5.发送查询SQL语句,并获取返回结果
/**
* SQL分类:DDL(容器创建,修改,删除〕DHL(插入,修改,删除〕DQL(查询)DCL(权限控制〕TPL(事务控制语言)
* 参数: sql 非DQL
* 返回: int
* 情况1∶DML 返回影响的行数,例如:删除了三条数据return 3;插入了两条return 2;修改了0条return 8;情况2:非DML return 0;
* int row = executeUpdate(sql)
*
*
* 参数: sql DQL
* 返回: resultSet 结果封装对象
* ResultSet resultSet = executeQuery(sql);
*/
String sql = "select * from t_user where account = '"+account+"' and password = '"+password+"'";
ResultSet resultSet = statement.executeQuery(sql);
/**
* 想要进行数据解析,我们需要进行两件事情:1.移动游标指定获取数据行⒉.获取指定数据行的列数据即可
* 1.游标移动问题
* resultset内部包含一个游标,指定当前行数据!默认游标指定的是第一行数据之前!
* 我们可以调用next方法向后移动一行游标!
* 如果我们有很多行数据,我们可以使用while(next){获取每一行的数据}
* boolean = next() true:有更多行数据,并且向下移动一行
* false:没有更多行数据,不一定!
* TOD0:移动光标的方法有很多,只需要记next即可,配合while循环获取全部数据!
*
* 2.获取列的数据问题
* resultSet.get类型(String columnLabel / int columnIndex);
* columnLabel:列名如果有别名写别名 select * / (id , account , password , nickname)
* select id as aid , account as ac from
* columnIndex:列的下角标获取 从左向右 从1开始
*/
/* 获取全部数据的方法
while(resultSet.next()){
int id = resultSet.getInt(1);
String account1 = resultSet.getString(2);
String password1 = resultSet.getString(3);
String nickname = resultSet.getString(4);\
System.out.println();
}
*/
//6.结果判断,显示登录成功还是失败
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//7.关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
使用statement的静态SQL路线,不能执行动态语句,且有注入攻击的风险(动态值充当SQL语句结构,影响力原有的查询结果)。
3.基于 preparedStatement 方式优化
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
/**
* @author mhw
* @create 2023/3/2 18:58
* @email 480738950@qq.com
*
*
*/
public class PSUserLoginPart {
public static void main(String[] args) throws Exception {
//1.键盘输入事件,收集账号和密码信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入账号:");
String account=scanner.nextLine();
System.out.println("请输入密码:");
String password=scanner.nextLine();
//2.注册驱动
//使用反射触发类加载
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu","root","root");
/**
* preparedstatement
* 1.编写SQL语句结果,不包含动态值部分的语句,动态值部分使用占位符 ? 替代,?智能替代动态值
* 2.创建preparedstatement,并且传入动态值。
* 3.动态值 占位符 单独赋值即可 ?
* 4.发送SQL语句即可,并获取返回结果
*/
//4.编写SQL语句
String sql="select * from t_user where account=? and password = ?;";
//5.创建preparedstatement
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//6.动态值 占位符 单独赋值即可?
/**
* 参数1:index 占位符的位置 从左向右数 从1开始
* 参数2:object 可以设置任何类型的数据
*/
preparedStatement.setObject(1,account);
preparedStatement.setObject(2,password);
//7.发送SQL语句即可,并获取返回结果
ResultSet resultSet=preparedStatement.executeQuery();
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//8.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
SQL语句分类
/**
* SQL分类:DDL(容器创建,修改,删除〕DHL(插入,修改,删除〕DQL(查询)DCL(权限控制〕TPL(事务控制语言)
* 参数: sql 非DQL
* 返回: int
* 情况1∶DML 返回影响的行数,例如:删除了三条数据return 3;插入了两条return 2;修改了0条return 8;情况2:非DML return 0;
* int row = executeUpdate(sql)
*
*
* 参数: sql DQL
* 返回: resultSet 结果封装对象
* ResultSet resultSet = executeQuery(sql);
*/
4.总结
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "root");
//3.编写SQL语句
String sql = "update t_user set nickname =? where id =?";
//4.创建preparedStatement.并且传入SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1,"三狗子");
preparedStatement.setObject(2,3);
//6.发送SQL语句,并且接受结果
int rows = preparedStatement.executeUpdate();
//7.解析结果
if(rows>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
**//8.关闭资源
preparedStatement.close();
connection.close();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!