JDBC 是什么?

  • JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语言编程中与数据库连接的API

JDBC库中所包含的API通常与数据库使用于:
1.连接到数据库
2.创建SQL或MySQL语句
3.在数据库中执行SQL或MySQL查询
4.查看和修改数据库中的数据记录

常见的JDBC组件
JDBC API提供以下接口和类:

  • DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。
  • Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
  • Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
  • Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。
  • ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。
  • SQLException:此类处理数据库应用程序中发生的任何错误。

创建JDBC应用程序
1.导包
如果使用IDE,可将上面代码可放在IDE(如:Eclipse/Netbeans)中加入mysql-connector-java-5.1.37-bin.jar 库并执行,jar包放在\libs 目录中。
在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import java.sql.* 就足够了,

//STEP 1. Import required packages
import java.sql.*;

2.注册JDBC驱动程序
需要初始化驱动程序,这样就可以打开与数据库的通信。

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

3.创建数据库连接对象
使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接

//STEP 3: Open a connection
//Database credentials
//DB_URL: 数据库连接地址,格式: jdbc:mysql://数据库IP地址:3306/数据库名
//USER: 登录数据库用户名
//PASS: 用户名密码
con = DriverManager.getConnection(DB_URL,USER,PASS);

4.获取执行对象,执行sql语句
需要使用一个类型为Statement或PreparedStatement的对象,并提交一个SQL语句到数据库执行查询。

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = con.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

注意: 增、删、改 用executeUpdate(),返回值为int型,表示被影响的行数; 查询用executeQuery()方法,返回结果集
5.从结果集中提取数据
可以使用适当的ResultSet.getXXX()方法来检索的数据

//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name

//需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");

//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
/*
ResultSet接口中 next()方法详细信息

boolean next()
throws SQLException
将光标从当前位置向前移动一行。 一个ResultSet指针最初位于第一行之前; (不用担心取不到第一行。) 方法next的第一个调用使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。
当对next方法的调用返回false ,光标位于最后一行之后。 任何调用需要当前行的ResultSet方法将导致抛出SQLException 。 如果结果集类型为TYPE_FORWARD_ONLY ,它是指定的JDBC驱动程序实现是否会返回供应商false或抛出SQLException上的后续调用next 。

如果当前行的输入流已打开,则对方法next的调用将隐式关闭它。 读取新行时,将清除ResultSet对象的警告链。

结果
true如果新的当前行有效; false如果没有更多的行
*/

6.释放资源
在使用JDBC与数据交互操作数据库中的数据后,应该明确地关闭所有的数据库资源以减少资源的浪费,对依赖于JVM的垃圾收集

//STEP 6: Clean-up environment
rs.close();
stmt.close();
con.close();

7.第一个JDBC程序

package com.itheima01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
// 导入jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取链接
Connection con = DriverManager.getConnection("jdbc:mysql://IP地址/库名", 登录用户", "密码");
//4.获取执行者对象
Statement stat = con.createStatement();
//5.执行sql语句,并接收返回结果集
String sql = "SELECT * FROM user";
ResultSet rs = stat.executeQuery(sql);
//6.处理结果
while (rs.next()){
System.out.println(rs.getInt("id")+"\t"+rs.getString("name"));
}
//7.释放资源
con.close();
stat.close();
rs.close();
}
}

SQL注入攻击

  • 就是利用sql语句的漏洞来对系统进行
  • SQL注入攻击的原理
    1.按照正常道理来说,我们在输入密码处输入的所有内容,都应该认为是密码的组成
    2.但是现在Statement对象在执行sql语句时,将密码的一部内容当作查询条件来执行了

SQL注入攻击的解决

  • PerparedStatement 预编译执行者对象
    1.在执行sql语句之前,将sql语句进行提前编译,明确SQL语句之后,就不会改变了,剩余的内容都会认为是参数!
    2.SQL语句中的参数使用?作为占位符
  • 为?占位符赋值的方法: setXXX(参数1,参数2)
    1.XXX代表: 数据类型
    2.参数1: 代表?的位置编号(标号从1开始)
    3.参数2: ?的实际参数

JDBC如果管理事务

  • 管理事务的功能类: Connection
    1.开启事务: setAutoCommit(boolean autoCommit);参数为false,则开启事务
    2.提交事务: commit();
    3.回滚事务: rollback();