对于JDBC的简单使用


JDBC

数据库驱动

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


什么是JDBC

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


除​​java.sql​​​和​​javax.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接口