JDBC的使用

JDBC

JDBC:连接Java程序和数据库

1.JDBC使用步骤

  1. 注册驱动,依赖的jar包,进行安装
  2. 建立连接connection
  3. 创建发送SQL语句的对象statement
  4. statement对象,发送SQL语句到数据库,并且获取返回结果,resultset结果对象
  5. 解析结果集,拆resultset结果对象
  6. 销毁资源,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();
posted @   盐酸氟西汀  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示