JDBC
全称
java DataBase Connectivity java平台提供的一种统一的执行规范/标准
每一个不同的厂商生产的数据库产品(比如mysql等) 都实现了这个规范
作用:
- 负责产生连接
- 传送SQL指令
- 处理响应信息
- 处理事务
JDBC驱动
驱动有不同的类型,四种:
- JDBC-ODBC 每一个客户机都需要安装 管理不方便
- JDBC-Native 类似第一种,每个客户机都需要安装,调用本地的c/c++语言,具体到某一个数据库,想要改变,需要改写底层的实现
- JDBC-Net 使用了标准的Socket通信,不需要每一个客户机都安装,相对来说比较灵活
- 纯JavaJDBC 一个纯粹基于Socket进行的通信,不需要安装在客户机上,不同的厂商需要下载。
找到MySQL数据库的JDBC驱动包
下载驱动包
如何使用JDBC
JDBC六部曲
- 导包,将找到的jar文件包导入到java工程
- 加载驱动类,Driver
- 获取连接
- 创建状态参数
- 执行数据库操作
写 DML---增删改 统称为对数据库进行更新
读 DQL---select 数据库没有发生变化,需要处理结果
- 关闭
例子:
package testjdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) {
//1.导包,将找到的jar文件包导入到java工程
//2.加载驱动类,Driver
try {
Class.forName("com.mysql.jdbc.Driver");
//3.获取连接
String url = "jdbc:mysql://localhost:3306/emp";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//4.创建状态参数*
Statement stat = conn.createStatement();
//5.执行数据库操作
String sql = "delete from dept where deptno=50";
stat.executeUpdate(sql);
System.out.println("=======");
// 写 DML---增删改 DDL 统称为对数据库进行更新int = stat.executeUpdate(String sql)
// 读 DQL---select 数据库没有发生变化,需要处理结果ResultSet rs = stat.executeQuery(String sql)
// 调用存储过程------execute(String sql)
//6.关闭 close()
// rs.close()//用到了结果集的话,结果集也要关
stat.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
对于上面jdbc的执行过程,在创建状态参数的时候会出现SQL注入的问题。
先了解一下什么是SQL注入?
1.SQL注入
通过SQL命令 拼接其它特殊字符串,让其他的字符串来改变原有SQL语句的执行,达到欺骗服务器的效果。其他字符:肯定时SQL语法认可的合法关键字
2.问题产生原因
- 判断不严谨
- SQL语句的问题,因为它允许拼接字符串,拼接的时候容易出现问题。
3.如何解决
- 首先了解PreparedStatement和Statement 的区别
1.PreparedStatement extends Statement
2.Statement:普通的状态参数,在创建的时候不需要SQL语句,此时没有执行
3.PreparedStatement:预处理状态参数,创建的时候就需要预先加载SQL语句,此时没有执行,但是,底层预先处理了SQL需要的查询结果,性能很高,可以利用?来替代数据类型和值
好处:增强可读性 可以参数动态化 防止SQL注入 提高执行性能
- 怎么写?
String sql = "SELECT ANAME,APASSWORD,ABALANCE FROM ATM WHERe ANAME = ?"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstat = conn.prepareStatement(sql); pstat.setString(1, aname);//sql语句与进行拼接处理,?赋值为aname 用?来替代值和类型,注意:SQL语句上的问号需要在执行操作之前赋值。 pstat.setxxxx(index,value) index从一开始(代表第几个问号)
使用了预处理状态参数之后 模糊查询的问题



