20201027_陈宇_

日志

学习总结:

JDBC的作用:

​ JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)

​ JDBC 可以干三件事:

​ ①.与数据库建立连接

​ ②.将Java中拼写的SQL语句发送到数据库中执行

​ ③.处理执行结果

JDBC在开发中的地位:

image-20201027224215087

JDBC在运行时的大致步骤:

​ (1).由 DriverManager 类驱动数据库

​ (2).由 Connection 接口负责将Java程序和数据库建立连接

​ (3).由 Statement/PreparedStatement 接口将SQL语句发送到数据库中

​ (4).由 ResultSet 接口处理数据库返回的结果集

数据库连接字符串:

​ DriverManager 类在加载数据库驱动时,需要指明 url ,这里的 url 通常称作数据库连接字符串。数 据库连接字符串用于确定连接协议、连接的数据库服务器、端口号、数据库名称及其连接参数

​ 主协议:子协议://数据库服务器:端口号/数据库名称?连接参数

注册驱动:

​ 我们Java程序需要通过数据库驱动才能连接到数据库,因此需要注册驱动。 MySQL的驱动的入口类 是: com.mysql.jdbc.Driver

​ Driver 类中有一个 Static 块,在类被加载时会注册驱动,所以使用 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 注册驱动会导致注册两次驱动,因此不推荐用此方法注册,而是使用 Class.forName(str) 加载驱动,这样只会注册一次驱动

使用PreparedStatement:

​ PreparedStatement 具有高效率的优点:使用 PreparedStatement 接口可以将编译过的SQL语句缓存,当再次执行缓存过的SQL语句时,会忽略分析语法和编译的过程,提高了运行效率

​ PreparedStatement 具有安全的优点:PreparedStatement 可以防止SQL注入

​ SQL注入是利用SQL语句的漏洞对数据库发送有潜在威胁的SQL语句

事务:

​ 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)

​ 在关系数据库 中,一个事务可以是一条SQL语句,或者多条SQL语句

​ 事务的执行是由高级编程语言编写的程序来执行的

操作事务:

​ 1. 自动提交事务

​ 2. 手动提交事务

​ MySQL默认开启自动提交事务,意思是在MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务

手动提交事务:

​ 手动提交事务使用步骤:

​ 第1种情况:开启事务 ‐> 执行SQL语句 ‐> 成功 ‐> 提交事务

​ 第2种情况:开启事务 ‐> 执行SQL语句 ‐> 失败 ‐> 回滚事务

image-20201027225839966

​ 如果事务中SQL语句没有问题,commit提交事务,会对数据库数据的数据进行改变; 如果事务中 SQL语句有问题,rollback回滚事务,会回退到开启事务时的状态

自动提交事务:

​ Mysql 中默认开启自动提交事务,通过修改 MySQL 全局变量"autocommit",取消自动提交事务

​ 使用SQL语句: show variables like '%commit%'; 查看MySQL是否开启自动提交事务

​ autocommit 值 0:OFF(关闭自动提交) 1:ON(开启自动提交)

​ 取消自动提交事务,设置自动提交的参数为OFF,执行SQL语句: set autocommit = 0;

​ 同一个事务中所有的SQL语句执行时,必须使用同一个Connection对象

回滚点:

​ 在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作都 已经成功,可以在当前成功的位置设置一个回滚点,可以供后续失败操作返回到该位置,而不是返回所 有操作,这个点称之为回滚点

​ 设置回滚点语法: savepoint 回滚点名字 ; 回到回滚点语法: rollback to 回滚点名字 ;

事务的特性:

​ 事务具有4个属性:原子性、一致性、隔离性、持久性,这四个属性通常称为 ACID 特性

​ 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的所有SQL语句,要么都执行,要么都不执行,原子性是事务最根本的特性

​ 一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态(事务前后数据的完整性必须保持一致)一致性与原子性是密切相关的

​ 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并 发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

​ 持久性(Durability):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响

事务隔离级别:

​ 事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题

​ 事务并发会产生以下问题:

​ 脏读、不可重复读、幻读

image-20201027230955020

​ 查询全局事务隔离级别:

​ show variables like '%isolation%'; 或者 select @@tx_isolation;

​ 设置事务隔离级别:

​ set global transaction isolation level 级别字符串;

设置完成后需要退出 MSQL 再进入 MYSQL 才能看到隔离级别的变化

脏读(读取未提交数据):

​ 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

​ 解决:将全局的隔离级别进行提升

​ 设置隔离级别为 read committed ,并重打开mysql

不可重复读:(前后多次读取数据内容不一致):

​ 是指在一个事务内,多次读同一数据,数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题

​ 解决:将全局的隔离级别进行提升为: repeatable read

​ 同一个事务中为了保证多次查询数据一致,必须使用 repeatable read 隔离级别

幻读:(前后多次读取,数据总量不一致):

​ 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题

​ 解决:设置事务隔离级为最高 serializable ,并重打开mysql

​ 使用 serializable 隔离级别,一个事务没有执行完,其他事务的SQL执行不了,可以挡住幻读

学习心得:

​ 今天学习了JDBC,终于可以开始连接数据库了,感觉开始可以着手一下毕业设计了,但是今天学的东西也还没有完完全全的掌握,API很多,有些东西是看过,晓得有这个东西,马上着手写代码的时候又忘了是什么东西,还是要去看书或者是浩哥的文档。弱弱的问一句,浩哥的脚好些了吗?

标签

评论

this is is footer