一.JDBC(Java Database Connectivity)
1.JDBC
JDBC(Java Database Connectivity) Java 连接数据库的规范(标准)。
2.JDBC核心思想
Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)不同的数据库厂商提供不同的驱动包。
2.1MySQL数据库驱动
-
mysql-connector-java-5.1.X 适用于 5.X 版本
-
mysql-connector-java-8.0.X 适用于 8.X版本
2.2JDBC API
类型 | 权限定名 | 简介 |
---|---|---|
class | java.sql.DriverManager | 管理多个数据库驱动类,提供了获取数据库连接的方法 |
interface | java.sql.Connection | 代表一个数据库连接(当connection不是null时,表示已连接数据库) |
interface | java.sql.Statement | 发送SQL语句到数据库工具 |
interface | java.sql.ResultSet | 保存SQL查询语句的结果数据(结果集) |
class | java.sql.SQLException | 处理数据库应用程序时所发生的异常 |
3.环境搭建
- 在项目下新建 lib 文件夹,用于存放 jar 文件。
- 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
- 选中 lib 文件夹右键 Add as Libraay,点击 OK。
二.JDBC开发步骤*
2.1注册驱动(加载驱动)
使用 Class.forName("com.mysql.jdbc.Driver");手动加载字节码文件到JVM中。
Class.forName("com.mysql.jdbc.Driver");//加载驱动
2.2创建数据库连接
通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象
-
url:jdbc:mysql://localhost:3306/database
-
username:root
-
password:123
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8", "root","1234");
2.3获取statement对象
通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。
Statement statement = conn.createStatement();
2.4执行SQL语句
执行 SQL 语句并接收执行结果。
//4.执行sql语句
- ResultSet resultSet = statement.executeQuery("select * from t_employees");
- int i = statement.executeUpdate("delete from t_jobs where job_id = 'jm'");
2.5结果处理
2.6释放资源
遵循先开后关原则,释放所所用的资源对象。
//6.资源释放
try {
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
综合案例:
import java.sql.*;
public class Demo01 {
public static void main(String[] args) throws SQLException {
Connection connection=null;
Statement statement=null;
ResultSet resultSet =null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb3","root","123");
//3.创建statement对象
statement=connection.createStatement();
//4.执行sql语句
resultSet = statement.executeQuery("select * from t_employees");
//5.结果处理
while (resultSet.next()){
int employeeid = resultSet.getInt(1);
System.out.println(employeeid);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//6.资源释放
try {
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三.ResultSet(结果集)
在执行查询 SQL 后,存放查询到的结果集数据。
1.接受结果集
ResultSet rs=statement.executeQuery(sql);
ResultSet rs= statement.executeQuery("SELECT * FROM t_employees;");
2.遍历ResultSet中的数据
ResultSet 以表(table)结构进行临时结果的存储,需要通过 JDBC API 将其中数据进行依次获取。
-
数据行指针:初始位置在第一行数据前,每调用一次 boolean next()方法ResultSet 的指针向下移动一行,结果为 true,表示当前行有数据。
-
rs.getXxx(整数);代表根据列的编号顺序获得,从 1 开始。
-
rs.getXxx("列名");代表根据列名获得。
2.1遍历方法
- int getInt(int Index) throws SQLException //获得当前行第N列的int值
- int getInt(String Label) throws SQLException //获得当前行Label列的int值
- double getDouble(int Index) throws SQLException //获得当前行第N列的double值
- double getDouble(String Label) throws SQLException //获得当前行Label列的double值
- String getString(int Index) throws SQLException //获得当前行第N列的String值
- String getString(String Label) throws SQLException //获得当前行Label列的String值
注意:列的编号从1开始。
2.3综合案例
package com.qf.www.test;
import java.sql.*;
public class JobsQuery {
public static void main(String[] args) {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/product", "root", "1234");
//3.获取发送 sql 语句对象
Statement statement = connection.createStatement();
//4.执行 SQL 语句并接收结果集
ResultSet resultSet = statement.executeQuery("select * from t_jobs");
//5 处理结果集
while(resultSet.next()){
//5.1有数据,依据列名获取数据
String job_id = resultSet.getString("job_id");
String job_title = resultSet.getString("job_title");
int min_salary = resultSet.getInt("min_salary");
int max_salary = resultSet.getInt("max_salary");
System.out.println(job_id+"\t"+job_title+"\t"+min_salary+"\t"+max_salary);
}
//6.释放资源
rs.close();
statement.close();
connection.close();
}
}
}
}
四、 常见错误
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
原因:可能输入的值的类型不对,确定是否插入的元素时对应的值的类型正确