20201027_陈宇_
日志
学习总结:
JDBC的作用:
JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)
JDBC 可以干三件事:
①.与数据库建立连接
②.将Java中拼写的SQL语句发送到数据库中执行
③.处理执行结果
JDBC在开发中的地位:
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语句 ‐> 失败 ‐> 回滚事务
如果事务中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):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响
事务隔离级别:
事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题
事务并发会产生以下问题:
脏读、不可重复读、幻读
查询全局事务隔离级别:
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很多,有些东西是看过,晓得有这个东西,马上着手写代码的时候又忘了是什么东西,还是要去看书或者是浩哥的文档。弱弱的问一句,浩哥的脚好些了吗?
近期评论