1. 什么是 JDBC?
JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java语言连接数据库完成CRUD 操作。
2.JDBC 核心思想
Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)。
3.JDBC 开发步骤
3.1 环境搭建(导包)
将 mysql 驱动mysql-connector-java-8.0.23复制到项目的 lib 文件夹中。
3.2 注册驱动
使用 Class.forName(“com.mysql.cj.jdbc.Driver”);手动加载字节码文件到 JVM 中。
MySQL若是 5.x 版本用 Class.forName(“com.mysql.jdbc.Driver”);
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
3.3 连接数据库
URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成
/* url: jdbc:mysql://localhost:3306/database?
characterEncoding=utf8&useSSL=false&
serverTimezone=UTC&allowPublicKeyRetrieval=true
user: 用户名,root
password: 密码,一般设置为 root或 123456 */
//获取数据库连接对象
Connection conn = DriverManager.getConnection(url,user,password);
3.4 获取发送 SQL 的对象
通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问
Statement stmt = conn.createStatement(sql);//传sql语句
3.5 执行sql语句
//增删改返回的是受影响行数
int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
//查询返回的是ResultSet结果集
ResultSet rs = statement.executeQuery(sql);//返回结果集
3.6 查询语句遍历结果集
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id+"---"+name);
}
3.7 释放资源
遵循先开后关原则,释放所使用到的资源对象。
rs.close;
stmt.close;
conn.close;
4.常见错误
java.lang.ClassNotFoundException:找不到类(类名书写错误、没有导入jar包)
java.sql.SQLException:与sql语句相关的错误 (约束错误、表名列名书写错误) 建议:在客户端工具中测试SQL语句之后再粘贴在代码中
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown
column
原因:列值Sting类型没有加单引号
Duplicate entry ‘1’ for key ‘PRIMARY’ 原因,主键值已存在或混乱,更改主键值或清空表
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown
column ‘password’ in 原因:可能输入的值的类型不对,确定是否插入的元素时对应的值的类型正确
5.SQL注入问题
5.1 什么是 SQL 注入
用户输入的数据中有 SQL 关键字或语法并且参与了 SQL 语句的编译,导致 SQL 语句编译后的条件含义为true,一直得到正确的结果。这种现象称为 SQL 注入。
5.2 如何避免 SQL 注入
由于编写的 SQL 语句是在用户输入数据,整合后再进行编译。所以为了避免 SQL 注入的问题,我们要使SQL 语句在用户输入数据前就已进行编译成完整的 SQL 语句,再进行填充数据。
6.PreparedStatement
PreparedStatement 继承了 Statement 接口,执行 SQL 语句的方法无异。
PreparedStatement的应用
作用:
预编译SQL 语句,效率高。
安全,避免SQL注入 。
可以动态的填充数据,执行多个同构的 SQL 语句。
"select * from user where username=? and password=?"
pstmt.setXxx(下标,值) 参数下标从 1 开始,为指定参数下标绑定值
//1.预编译 SQL 语句
PreparedStatement pstmt = conn.prepareStatement("select * from user where username=? and password=?");
//2.为参数下标赋值
pstmt.setString(1,username);
pstmt.setString(2,password);