目录
Statement(用于执行SQL语句,会被SQL注入攻击,后被PreparedStatement替代 )
PreparedStatement(可以防止SQL注入,全面替代Statement)
JDBC的概念
JDBC(Java Database Connectivity )意为java数据库连接,及使用java代码实现对数据库的连接与管理操作。
Java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现类封装成jar文件,也就是我们俗称的数据库驱动jar包。
JDBC的搭建步骤
-
准备数据库。
-
官网下载数据库连接驱动jar包。https://downloads.mysql.com/archives/c-j/
-
创建Java项目,在项目下创建lib文件夹,将下载的驱动jar包复制到文件夹里。
-
选中lib文件夹右键->Add as Library,与项目集成。
-
编写代码
JDBC的代码实现
步骤框架
1.注册驱动
2.获取数据库连接
3.创建Statement对象
4.编写SQL语句并执行,获取结果
5.处理结果
6.释放资源(以先开后关原则)
代码实现
package com.atguigu;
import java.sql.*;
public class JdbcQuick {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "atguigu");
//3.创建Statement对象
PreparedStatement preparedStatement = connection.prepareStatement("select emp_id,emp_name,emp_salary,emp_age from t_emp");
//4.编写SQL语句并执行,获取结果
ResultSet resultSet = preparedStatement.executeQuery();
//5.处理结果
while (resultSet.next()) {
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
String empSalary = resultSet.getString("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);
}
//6.释放资源(先开后关原则)
resultSet.close();
preparedStatement.close();
connection.close();
}
}
核心API
注册驱动(jdk6.0后可自动注册,无需编写代码)
Class.forName("com.mysql.cj.jdbc.Driver");
注册驱动程序,目的是使得 JDBC API 能够识别并与特定的数据库进行交互。
从JDK6开始,不再需要显式地调用 Class.forName()
来加载 JDBC 驱动程序,只要在类路径中集成了对应的jar文件,会自动在初始化时注册驱动程序。
Connection(连接数据库 )
用于建立与数据库的通信通道,每当创建一次Connection对象时即为连接了一次数据库。
在连接数据库时需要指定数据库URL、用户名和密码。
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "atguigu");
//"jdbc:mysql://数据库URL:端口号/数据库名称", "用户名", "密码"
Statement(用于执行SQL语句,会被SQL注入攻击,后被PreparedStatement替代 )
Statement
接口用于执行 SQL 语句并与数据库进行交互。它是 JDBC API 中的一个重要接口。通过 Statement
对象,可以向数据库发送 SQL 语句并获取执行结果。
执行查询语句时,使用executeQuery()方法;执行其他语句时,使用executeUpdate()方法。
Statement statement = connection.createStatement();
String sql = "select emp_id,emp_name,emp_salary,emp_age from t_emp WHERE emp_name = '康师傅'";
statement.executeQuery(sql);
PreparedStatement(可以防止SQL注入,全面替代Statement)
预编译SQL语句 :PreparedStatement
是 Statement
接口的子接口,用于执行预编译
的 SQL 查询,及在SQL语句会被提前固定。
防止SQL注入: PreparedStatement
支持参数化查询,将数据作为参数传递到SQL语句中,采用?占位符的方式,将传入的参数用一对单引号包裹起来'',无论传递什么都作为值。以?先在sql语句中占位,后将?中的内容转译再执行SQL语句,有效防止传入关键字或值导致SQL注入问题。
性能提升:PreparedStatement是预编译SQL语句,同一SQL语句多次执行的情况下,可以复用,不必每次重新编译和解析。
在执行SQL语句前应先使用setInt为SQL语句中的?占位符赋值。
PreparedStatement preparedStatement = connection.prepareStatement("select emp_id,emp_name,emp_salary,emp_age from t_emp where emp_id = ?");
preparedStatement.setInt(1,1);
preparedStatement.executeQuery();
ResultSet(查询返回的结果)
ResultSet
是 JDBC API 中的一个接口,用于表示从数据库中执行查询语句所返回的结果集
。它提供了一种用于遍历和访问查询结果的方式。
遍历结果:ResultSet可以使用 next()
方法将游标移动到结果集的下一行,逐行遍历数据库查询的结果,返回值为boolean类型,true代表有下一行结果,false则代表没有。
获取单列结果:可以通过getXxx的方法获取单列的数据,该方法为重载方法,支持索引和列名进行获取。
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
String empSalary = resultSet.getString("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId+"\t"+empName+"\t"+empSalary+"\t"+empAge);
}
常见错误
资源的管理
在使用JDBC的相关资源时,比如Connection、PreparedStatement、ResultSet,使用完毕后,要及时关闭这些资源以释放数据库服务器资源和避免内存泄漏是很重要的。
SQL语句错误
java.sql.SQLSyntaxErrorException:SQL语句错误异常,一般有几种可能:
-
SQL语句有错误,检查SQL语句!建议SQL语句在SQL工具中测试后再复制到Java程序中!
-
连接数据库的URL中,数据库名称编写错误,也会报该异常!
SQL语句未设置参数问题
java.sql.SQLException:No value specified for parameter 1
在使用预编译SQL语句时,如果有?占位符,要为每一个占位符赋值,否则报该错误!
数据库用户名或密码错误问题
连接数据库时,如果用户名或密码输入错误,也会报SQLException,容易混淆!所以一定要看清楚异常后面的原因描述
通信异常
在连接数据库的URL中,如果IP或端口写错了,会报如下异常:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
标签:语句,JDBC,数据库,resultSet,API,emp,SQL From: https://blog.csdn.net/qq_33697759/article/details/141060291