【JavaWeb | 第五篇】JDBC

目录

一、什么是JDBC?

[1.1 JDBC入门程序](#1.1 JDBC入门程序)

二、JDBC-查询数据

三、预编译SQL

[3.1 SQL注入](#3.1 SQL注入)

[3.2 预编译SQL的优势](#3.2 预编译SQL的优势)


一、什么是JDBC?

JDBC:(J ava D ataB ase Connectivity),就是使用Java语言操作关系型数据库的一套API。

本质:

  • sun公司官方定义的一套操作所有关系型数据库的规范,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

MySQL驱动jar包:

XML 复制代码
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>
</dependency>

1.1 JDBC入门程序

需求:基于JDBC程序,执行update语句。

基于JDBC操作数据库的五步:

  1. 注册驱动
  2. 获取数据库的连接
  3. 获取SQL语句的执行对象
  4. 执行SQL语句
  5. 释放资源
java 复制代码
public class JdbcTest {

    @Test
    public void testUpdate() throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取数据库的连接
        String url = "jdbc:mysql://localhost:3306/web01";
        String username = "root";
        String password = "123456";
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.获取SQL语句执行对象
        Statement statement = connection.createStatement();
        //4.执行SQL语句
        int i = statement.executeUpdate("update user set age = 25 where id = 1");
        System.out.println("SQL执行完毕影响到的记录数为:" + i);
        //5.释放资源
        statement.close();
        connection.close();

    }
}

二、JDBC-查询数据

需求:基于JDBC执行如下select语句,将查询结果封装到User对象中。
SQL: select * from user where username = 'daqiao' and password = '123456'

java 复制代码
@Test
    public void testSelect() throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取数据库连接
        String url = "jdbc:mysql://localhost:3306/web01";
        String dbUsername = "root";
        String dbPassword = "123456";
        Connection connection = DriverManager.getConnection(url, dbUsername, dbPassword);

        //3.定义SQL语句(使用占位符)
        String sql = "select id,username,password,name,age from user where username = ? and password = ?";

        //4.获取预编译SQL语句执行对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //5.设置参数
        preparedStatement.setString(1, "daqiao");
        preparedStatement.setString(2, "123456");

        //6.执行SQL查询语句
        ResultSet resultSet = preparedStatement.executeQuery();

        //7.处理结果集
        while (resultSet.next()) {
            //获取每一列的数据
            Integer id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String name = resultSet.getString("name");
            Integer age = resultSet.getInt("age");

            //封装到User对象中
            User user = new User(id, username, password, name, age);

            //输出到控制台
            System.out.println(user);
        }

        //8.释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

运行结果:

三、预编译SQL

我们在上一个执行查询语句时,使用了预编译的SQL语句,使参数动态传递

java 复制代码
//3.定义SQL语句(使用占位符)
        String sql = "select id,username,password,name,age from user where username = ? and password = ?";

        //4.获取预编译SQL语句执行对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //5.设置参数
        preparedStatement.setString(1, "daqiao");
        preparedStatement.setString(2, "123456");

3.1 SQL注入

简单来说,SQL 注入就是用户把恶意的 SQL 代码伪装成普通的数据,提交给后台。后台如果没有防备,直接把它拼接到 SQL 语句中去执行,就会导致数据库执行了黑客的指令。

正常情况: 用户输入:张三,密码:123 数据库执行:

sql 复制代码
SELECT * FROM users WHERE username = '张三' AND password = '123';

账号密码匹配,登录成功。

黑客攻击(SQL 注入): 黑客在用户名输入框里输入:' OR '1'='1 在密码框里随便输入:123

数据库执行的语句变成了这样:

sql 复制代码
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '123';

也成功登录了。

3.2 预编译SQL的优势

优势一:更安全,防止SQL注入

当使用预编译时,数据库已经提前解析了 SQL 的语法树。之后传过来的参数,只会被当做纯粹的"字符串"处理,绝对不会被当作 SQL 关键字去执行

优势二性能更高

你先发给数据库一个模板:SELECT * FROM users WHERE age = ?。 数据库收到后,立刻进行 解析、优化、编译 (步骤 1、2、3),然后把这份计划缓存在内存中。

相关推荐
zhanghaha13144 分钟前
HTML系列教程:14_HTML 表单与输入框 <form>、<input> 零基础详解
java·前端·javascript
傻啦嘿哟5 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670795 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
yxlalm5 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风6 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
天衍四九-6 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
尚久龙6 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql
医疗信息化王工6 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
实心儿儿6 小时前
MySQL 的安装
数据库·mysql·adb