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

相关推荐
2301_812539671 小时前
Tailwind CSS如何设置不同断点的内边距_使用p-4 md-p-8类.txt
jvm·数据库·python
m0_596749091 小时前
CSS实现动态悬浮菜单位置_JS计算配合CSS绝对定位
jvm·数据库·python
乐hh1 小时前
DM8配置SSL
数据库·docker·ssl
江南十四行1 小时前
Python上下文管理器与with语句——资源管理的艺术
java·jvm·数据库
书源丶1 小时前
四十五、函数式接口与 Lambda 表达式
java·开发语言
2301_812539671 小时前
golang如何实现最小堆定时器_golang最小堆定时器实现总结
jvm·数据库·python
直奔標竿1 小时前
MySQL与Redis数据一致性实战方案(避坑指南)
java·数据库·spring boot·redis·mysql·spring·缓存
java1234_小锋1 小时前
Java进程突然挂了如何排查?
java·开发语言
乐hh1 小时前
KingbaseV8R6配置SSL
数据库·ssl