【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),然后把这份计划缓存在内存中。

相关推荐
东北小狐狸-Hellxz4 分钟前
Redis 哨兵搭建+ACL权限控制
数据库·redis
xingke6 分钟前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
戮漠summer1 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
jinyishu_1 小时前
C++ string使用方法
开发语言·c++
EW Frontier1 小时前
三级跳突破864维动作空间——QMIX-Hierarchical多无人机协同通信方法全解析【附python代码】
开发语言·python·无人机·强化学习·通信资源分配
名字还没想好☜1 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
研究员子楚1 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
乐观勇敢坚强的老彭1 小时前
C++浮点数使用注意事项
开发语言·c++
wuyk5551 小时前
38.什么是C语言?从语法到工程落地的工程师视角解读
c语言·开发语言·stm32·单片机·mcu·51单片机