戚权20201027
知识点
jdbc
JDBC的作用
- 与数据库建立连接
- 将Java中拼写的SQL语句发送到数据库中执行
- 处理执行结果
JDBC在运行时的大致步骤
(1). 由 DriverManager 类驱动数据库。
(2). 由 Connection 接口负责将Java程序和数据库建立连接。
(3). 由 Statement/PreparedStatement 接口将SQL语句发送到数据库中。
(4). 由 ResultSet 接口处理数据库返回的结果集。
1DriverManager 驱动
Class.forName("com.mysql.jdbc.Driver");
2获取连接
DriverManager.getConnection("jdbc:mysql://localhost:3306/company_info","root" , "root");
- 在MySQL中,只要不是查询就是修改。 executeUpdate:用于执行增删改 executeQuery:用于执行查询
3创建执行sql对象
Statement stat = conn.createStatement();
4定义SQL语句
String sql = "insert into users (username,password) values('lisi', '123456')";
5执行sql,返回影响行数
int rows = stat.executeUpdate(sql);
使用PreparedStatement
PreparedStatement 具有安全的优点: PreparedStatement 可以防止SQL注入。SQL注入是利用SQL语句的漏洞对数据库发送有潜在威胁的SQL语句。
高效性
事务
事务 (Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务可以是一条SQL语句,或者多条SQL语句。事务的执行是由高级编程语言编写的程序来执行的。在Java中使用JDBC操作事务。
手动提交事务
start transaction; #开启事务
commit; #提交事务
rollback; #回滚事务
如果事务中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对象。
事务原理
事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务日志( rollback ,断开连接)
回滚点
设置回滚点语法: savepoint 回滚点名字 ; 回到回滚点语法: rollback to 回滚点名字 ;
设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候。
注意:最后不要忘了,要保存结果的话需要提交事务 Commit 。如果不想保存结果使用 rollback结束
事务的特性
事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的所有SQL语句,要么都执行,要么都不执行。原子性是事务最根本的特性。
一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态(事务前后数据的完整性必须保持一致)。一致性与原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
事务隔离级别
查询全局事务隔离级别
show variables like '%isolation%';
-- 或
select @@tx_isolation;
设置事务隔离级别
set global transaction isolation level 级别字符串;
-- 如:
set global transaction isolation level read uncommitted;
注意:设置完成后需要退出 MSQL 再进入 MYSQL 才能看到隔离级别的变化
脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据
脏读非常危险的,比如A向B购买商品,A开启事务,向B账号转入1000块,然后打电话给B说钱已经转
了。B一查询钱到账了,发货给A。A收到货后回滚事务,B去银行取钱发现钱没了。
解决
解决脏读的方式是:将全局的隔离级别进行提升。
不可重复读
是指在一个事务内,多次读同一数据。数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)
两次查询输出的结果不同,到底哪次是对的?不知道以哪次为准。 当然是后面的为准。我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和发短信给客户,结果在一个事务中针对不同的输出目的地进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。
解决
解决不可重复读的方式是:将全局的隔离级别进行提升为: repeatable read
总结
今天 学习了jdbc和时间,感觉挺复杂的,需要多花点时间。
评论留言