Day19-JDBC

Posted 2月2日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day19-JDBC相关的知识,希望对你有一定的参考价值。

JDBC

数据库驱动

由数据库厂商提供,连接应用程序和数据库,如同显卡需要安装驱动

image-20210615204342411

什么是JDBC

sun公司为了简化开发人员对于数据库的操作 ,提供了一个java操作数据库的规范,俗称JDBC

image-20210615205300764

java.sqljavax.sql还需要导入一个数据库连接包,需要和数据库版本相同

Java使用JDBC

六个步骤:

  • 加载驱动

    • Class.forName("com.mysql.cj.jdbc.Driver");
  • 连接数据库DriverManager

    • Connection connection = DriverManager.getConnection(url,userName,password);
  • 获得执行sql的对象

    • statement.executeQuery() //查询语句
    • statement.executeUpdate() //修改更新删除
  • 获得返回的结果集

    • 该结果集为一个链表,拥有链表的所有功能
  • 释放连接

package com.JDBC.Test1;

import java.sql.*;

public class JdbcFirstDeMO {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8";
        String userName="root";
        String password="cwt123456";

        //3.创建数据库连接
        Connection connection = DriverManager.getConnection(url,userName,password);

        //4.创建sql执行对象
        Statement statement = connection.createStatement();

        //5.执行语句
        String sql = "SELECT * FROM users";
        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            System.out.println(resultSet.getObject("id"));
        }

        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();

    }
}

statement对象

用于向数据库发送sql语句,完成对数据库的增删改查

查询

Statement statement = connection.createStatement();
String sql = "SELECT * FROM users";
        ResultSet resultSet = statement.executeQuery(sql);

修改、更新、删除

Statement statement = connection.createStatement();
String sql = "delete fr";
        ResultSet resultSet = statement.executeQuery(sql);

sql注入

web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

Preparedstament

继承了statement类,遇到转移字符时会自动进行忽略,安全性较高,跟statement的不同点:对sql语句进行预编译,再进行赋值

package com.JDBC.Test2;

import com.JDBC.Test2.utils.jdbcUtils;

import java.sql.*;

public class PreparedTest {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Connection connection = null;
        PreparedStatement preparedStatement =null;
        ResultSet resultSet = null;
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8";
        String user = "root";
        String password="cwt123456";

        Class.forName(driver);
        connection= DriverManager.getConnection(url,user,password);

        String sql = "select * from users where `id` = ?";
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,1);
        resultSet=preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println("查询成功");
        }
    }
}

数据库连接池

连接释放操作十分消耗资源

池化技术

预备一些池连接,客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并标记为忙,如果没有空闲连接,则新建连接,使用完毕后,此连接返回池内,并可再次使用

原理

获取的是connection的代理对象,使用完毕后,释放该对象、

实现方案

实现DataSource接口

使用开源数据

DBCP

C3P0

Druid

使用数据库池连接之后,可以不写数据库连接代码,但无论使用什么数据源都需要实现DataSource接口

以上是关于Day19-JDBC的主要内容,如果未能解决你的问题,请参考以下文章

day06-jsp

19-JDBC代码优化

[code] PTA 胡凡算法笔记 DAY039

无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3

19JDBC初体验

oracle 19c jdbc之Reactive Streams Ingestion (RSI) Library