1.什么是JDBC?
为了在java语言中提供数据库访问的支持,提供了一套访问数据的标准Java类库,即JDBC,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的 Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。
2.JDBC驱动程序
2.1 JDBC(Java Database Connectivity)驱动程序是一种软件组件,用于连接Java应用程序和数据库。它充当Java应用程序与数据库之间的桥梁,允许Java应用程序执行SQL(结构化查询语言)命令,从而与数据库进行交互。
2.2 JDBC驱动程序的主要功能是:
2.2.1 建立与数据库的连接:驱动程序使用提供的数据库URL、用户名和密码,建立与目标数据库的连接。
2.2.2 执行SQL语句:通过驱动程序,Java应用程序可以执行SQL语句,如查询、插入、更新和删除等。
2.2.3 处理结果集:对于查询操作,驱动程序将结果集返回给Java应用程序,以便进行进一步处理。
2.2.4 事务管理:驱动程序支持事务处理,确保数据的完整性和一致性。
2.2.5 异常处理:驱动程序处理与数据库交互过程中可能出现的异常,并确保应用程序的稳定性。
3.JDBC开发流程
3.1 JDBC所需的四个参数(user,password,url定义了连接数据库时的协议、子协议、数据源标识,它们之间用冒号隔开。书写形式:协议:子协议:数据源标识,driverClass是连接数据库所需的驱动)
3.2 加载JDBC驱动程序
3.3 创建数据库的连接
3.4 创建一个preparedStatement
3.5 执行SQL语句
3.6 遍历结果集
3.7 处理异常,关闭JDBC对象资源
4.Class.forName的作用
Class.forName用于加载指定的JDBC驱动类
Class.forName本质是通知JDBC注册这个驱动类
驱动由数据库厂商自行开发,连接字符串也不同
5.Connection对象
Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上
6.连接数据库的常见问题
ClassNotFoundException - 类未找到异常
Connection refuse - 数据库连接被拒绝异常
Access denied for user - 用户名与密码错误异常
7.Statement对象
Statement是用于执行SQL的工具
查询方法: ResultSet executeQuery(String sql)
sql参数必须是SELECT 查询SQL语句
8.ResultSet对象
ResultSet结果集对象,保存查询结果
ResultSet采用迭代方式逐行获取每一行表数据
每一次迭代,使用ResultSet对象的getXXX()方法获取列数据。
9.事务:是以一种可靠的、一致的方式,访问和操作数据库的程序单元。
9.1事务的操作
开启事务:start transaction;
回滚:rollback;
提交:commit;
9.2 MySQL数据库的事务提交
1)事务提交的两种方式
自动提交:MySQL数据库默认是自动提交的,一条DML(增删改语句)会自动提交一次事务;
手动提交:需要先开启事务(START TRANSACTION),提交(COMMIT);
2)修改事务的默认提交方式
查看默认提交方式:SELECT @@autocommit; -- 1代表自动提交,0代表手动提交
修改默认提交方式:SET @@autocommit = 0; -- 1代表自动提交,0代表手动提交
9.3 事务回滚
如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。
如果没有发生故障,则通过以完成状态提交事务来完成更新。
回答问题:
一.JDBC的DriverManager是用来做什么的?
DriverManager 是 Java JDBC API 的一部分,是用于管理数据库驱动程序的类。它的主要功能包括:
1.注册数据库驱动程序:在使用 JDBC 连接数据库之前,必须先注册适用于数据库的驱动程序。DriverManager 负责加载和注册这些驱动程序。
2.创建数据库连接:DriverManager 允许创建到数据库的连接,这是执行 SQL 操作的第一步。
3.管理数据库连接池:连接池是一组预先创建的数据库连接,可以在需要时被重复使用,以提高性能。DriverManager 可以与连接池一起使用。
二.execute,executeQuery,executeUpdate的区别是什么?
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
1.方法executeQuery
用于产生单个结果集的语句, 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句
2.方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE
3.方法execute:
用于执行返回多个结果集、多个更新计数或二者组合的语句。
4.execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用
三.插入自动增长的主键会报错吗?
可能会遇到数据库插入操作失败的问题。 这通常是由于插入的数据中没有为自动增长主键字段提供值所致。 解决这个问题的方法是确保在插入数据时,不需要为自动增长的主键字段提供值。
四.不指定列名插入会报错吗,应遵循什么原则?
不指定列名插入数据时,通常不会直接报错,但是可能会引发其他问题。由于这种方式高度依赖于表中列的定义次序和可获得的次序信息,因此如果插入的顺序与表中的列定义顺序不匹配,可能会导致数据插入错误或者数据读取错误。
为了确保数据插入的正确性和完整性,建议遵循以下原则:
1.指定列名插入:在插入数据时,最好明确指定列名,以确保数据按照正确的顺序插入到正确的列中。这样可以避免由于顺序不匹配而导致的数据错误。
2.保持列顺序一致性:如果必须在不指定列名的情况下插入数据,那么应该尽量保持插入数据的顺序与表中列的定义顺序一致。这样可以减少由于顺序不匹配而引发的问题。
3.避免使用不安全的方式:不指定列名是一种相对不安全的方式,因为它高度依赖于表中列的定义次序和可获得的次序信息。
五.如何防止数据库注入?
SQL注入是一种web安全漏洞,使攻击者干扰应用程序对其数据库的查询,使攻击者可以查看到他们无法检索的数据。
防止SQL注入的最佳做法是使用参数化查询或预编译语句
参数化查询:PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?"); statement.setString(1, input); ResultSet resultSet = statement.executeQuery();
这是防止SQL注入的最有效方法。参数化查询确保所有数据都被当作数据对待,而不是可执行的SQL代码。在大多数现代数据库访问框架中,都支持参数化查询。
预编译语句的工作原理是将占位符代替参数值发送给数据库,数据库会确保输入参数被正确处理,并将其视为纯粹的数据而不是可执行的SQL代码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。