其他数据库相关
JDBC
概述
JDBC(Java DataBase Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系型数据库提供统一访问,是由一组用 Java 语言编写的类和接口组成的。
JDBC 是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接
功能类
DriverManager
DriverManager:驱动管理对象
-
注册驱动:
-
注册给定的驱动:
public static void registerDriver(Driver driver) -
代码实现语法:
Class.forName("com.mysql.jdbc.Driver) -
com.mysql.jdbc.Driver 中存在静态代码块
static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}} -
不需要通过 DriverManager 调用静态方法 registerDriver,因为 Driver 类被使用,则自动执行静态代码块完成注册驱动
-
jar 包中 META-INF 目录下存在一个 java.sql.Driver 配置文件,文件中指定了 com.mysql.jdbc.Driver
-
-
获取数据库连接并返回连接对象:
方法:
public static Connection getConnection(String url, String user, String password)- url:指定连接的路径,语法为
jdbc:mysql://ip地址(域名):端口号/数据库名称 - user:用户名
- password:密码
- url:指定连接的路径,语法为
Connection
Connection:数据库连接对象
- 获取执行者对象
- 获取普通执行者对象:
Statement createStatement() - 获取预编译执行者对象:
PreparedStatement prepareStatement(String sql)
- 获取普通执行者对象:
- 管理事务
- 开启事务:
setAutoCommit(boolean autoCommit),false 开启事务,true 自动提交模式(默认) - 提交事务:
void commit() - 回滚事务:
void rollback()
- 开启事务:
- 释放资源
- 释放此 Connection 对象的数据库和 JDBC 资源:
void close()
- 释放此 Connection 对象的数据库和 JDBC 资源:
Statement
Statement:执行 sql 语句的对象
- 执行 DML 语句:
int executeUpdate(String sql)- 返回值 int:返回影响的行数
- 参数 sql:可以执行 insert、update、delete 语句
- 执行 DQL 语句:
ResultSet executeQuery(String sql)- 返回值 ResultSet:封装查询的结果
- 参数 sql:可以执行 select 语句
- 释放资源
- 释放此 Statement 对象的数据库和 JDBC 资源:
void close()
- 释放此 Statement 对象的数据库和 JDBC 资源:
ResultSet
ResultSet:结果集对象,ResultSet 对象维护了一个游标,指向当前的数据行,初始在第一行
- 判断结果集中是否有数据:
boolean next()- 有数据返回 true,并将索引向下移动一行
- 没有数据返回 false
- 获取结果集中当前行的数据:
XXX getXxx("列名")- XXX 代表数据类型(要获取某列数据,这一列的数据类型)
- 例如:String getString("name"); int getInt("age");
- 释放资源
- 释放 ResultSet 对象的数据库和 JDBC 资源:
void close()
- 释放 ResultSet 对象的数据库和 JDBC 资源:
代码实现
数据准备
-- 创建db14数据库
CREATE DATABASE db14;
-- 使用db14数据库
USE db14;
-- 创建student表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT, -- 学生id
NAME VARCHAR(20), -- 学生姓名
age INT, -- 学生年龄
birthday DATE, -- 学生生日
);
-- 添加数据
INSERT INTO student VALUES (NULL,'张三',23,'1999-09-23'),(NULL,'李四',24,'1998-08-10'),
(NULL,'王五',25,'1996-06-06'),(NULL,'赵六',26,'1994-10-20');
JDBC 连接代码:
public class JDBCDemo01 {
public static void main(String[] args) throws Exception{
//1.导入jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取连接
Connection con = DriverManager.getConnection("jdbc:mysql://192.168.2.184:3306/db2","root","123456");
//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();
con.close();
}
}
注入攻击
攻击演示
SQL 注入攻击演示
-
在登录界面,输入一个错误的用户名或密码,也可以登录成功

-
原理:我们在密码处输入的所有内容,都应该认为是密码的组成,但是 Statement 对象在执行 SQL 语句时,将一部分内容当做查询条件来执行
SELECT * FROM user WHERE loginname='aaa' AND password='aaa' OR '1'='1';
攻击解决
PreparedStatement:预编译 sql 语句的执行者对象,继承 PreparedStatement extends Statement
- 在执行 sql 语句之前,将 sql 语句进行提前编译,明确 sql 语句的格式,剩余的内容都会认为是参数
- sql 语句中的参数使用 ? 作为占位符
为 ? 占位符赋值的方法:setXxx(int parameterIndex, xxx data)
-
参数1:? 的位置编号(编号从 1 开始)
-
参数2:? 的实际参数
String sql = "SELECT * FROM user WHERE loginname=? AND password=?";pst = con.prepareStatement(sql);pst.setString(1,loginName);pst.setString(2,password);
执行 sql 语句的方法
- 执行 insert、update、delete 语句:
int executeUpdate() - 执行 select 语句:
ResultSet executeQuery()