1. 数据库
数据库是一个庞大的服务器软件,用来管理数据。
2. JDBC连接数据库的步骤
- 加载数据库驱动
- 建立数据库连接Connection对象
- 通过Connection对象创建Statement或者PreparedStatement对象
- 执行sql语句
- 处理查询结果集
- 关闭statement、数据库连接等,以释放资源
3. JDBC操作数据库原理
JDBC是java访问dataBase的一套API。它操作数据库的原理简单理解如下:
- jdbc和数据库建立连接。请注意,一个连接管理多个sql命令。默认情况下(自动提交事务),一个连接只会发送一个sql命令,执行完毕,提交事务;再来命令,重新建立连接,执行完毕,提交事务。
- 建立连接之后,通过该连接对象向数据库发送sql命令,注意,在创建的同一个连接里可以发送多条sql命令。
- jdbc每向数据库发送一次sql命令,就相当于和数据库建立了一次交互,默认情况下,数据库需要读取该命令,解析该命令,然后执行该命令,最后释放该命令。也就是说,数据库从接收jdbc提交的一次sql命令后,需要做很多事情最终执行这条命令。所以说,数据库接收一条sql命令本身是比较消耗性能的。
- 默认情况下,不考虑数据库事务隔离级别的话(即默认事务与事务之间是严格隔离的情况下),数据库接收到jdbc发送的所有sql命令,每一条sql命令都默认是一个事务,5条sql命令就分别是5个事务。
所有的命令在数据库中执行,都在数据库内存中检查对应的数据是否存在,如果存在,则直接操作;如果不存在,再从db中重新加载。
解释4:
默认情况指的是:数据库的默认事务即一条sql默认是一个事务;并且不考虑数据库的事务隔离级别(即所有事务之间严格隔离,完全独立,A事务必须等B事务执行完毕才可以执行)。 jdbc向数据库发送了如下SQL: delete from test_table; insert into test_table; update test_table; select from test_table; 在数据库服务器的执行如下: 开启事务; 执行delete from test_table; 从db中加载test_table的数据到数db内存; 提交事务; 开启事务; 执行insert into test_table; 先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存; 提交事务; 开启事务; 执行update test_table; 先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存; 提交事务; 开启事务; 执行select from test_table; 先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存; 提交事务;
- 如果不显式设置事务的话,则数据库默认接收到一条sql命令,就默认开启一个事务,执行完毕后,结束事务。如果数据库同时接收多条sql命令,则默认每一条sql命令都独占一个数据库事务,多条sql命令将分别在各自的事务中执行,执行完毕后自动提交(所以说,JDBC默认执行SQL的规则是:一条命令是一个事务,一条命令和数据库进行一次交互 )。
- 如果显式设置了事务,则在同一个事务中的所有sql命令都按照顺序分别和数据库进行交互,相当于每一个SQL命令都和数据库交互一次(这个和默认情况是一致的),但是,因为是在同一个事务中,所以多次交互遵循一个原则:如果db内存中有数据,则直接使用;否则,再重新从数据表中加载到db内存中使用。
解释5:默认情况下: update table;jdbc发送这条命令和数据库完成一次交互,将table的数据加载到db的内存中,交互完成后,jdbc提交事务,将数据持久化到数据库表中。 如果再有update table;则jdbc重新和数据库完成一次交互,重新从数据库中读取table加载到内存中,交互完成后,jdbc提交事务,然后将数据持久化到数据表中。 手动控制事务的情况下: 开启事务; update table;jdbc发送这条命令和数据库完成一次交互,将table的数据加载到db的内存中,交互完成后,不做任何处理; jdbc再次向数据库发送update table;命令,继续和数据库完成一次交互,只不过这次没有重新加载table的数据到内存中,而是直接使用上一步的内存数据。 提交事务,将db内存中所有的数据持久化到数据表中。 总结一点:事务是数据库操作的基本单元,这句话意味着只要是一个事务中的所有数据操作,都只会加载一次数据到db内存,同一个事务中,操作的都是同一份内存数据。 伪代码如下: begin transaction; delete from test_table; insert into test_table; end transaction; 上述代码中,delete和insert操作的都是同一份数据库内存。事务是数据库操作的基本单元,可以理解为事务是数据库操作的基本内存单元。
手动控制事务,则在同一个事务中,客户端和数据库只建立一次连接,因为事务始终和连接Connection对象绑定,这样一来,通过一个事务来管理客户端和数据库的连接,以及连接管理下的多个sql命令
- 数据库接收到jdbc发送的sql命令后,经过一系列复杂的过程,最终执行该命令,将该命令中描述的持久层数据一次性加载进内存中。
- 数据库执行完毕,jdbc处理相关结果,然后释放资源,关闭连接,结束和数据库的这次通信连接。
文档信息
- 本文作者:Marshall