一、完成客户信息管理:添加、删除、修改(编码重点)
二、分页查询(重点、难点)
1、分页目的:提高效率。减少服务器内存的占用浪费
2、靠数据库的支持:不同的数据库分页语句是不同的。
MySQL:
LIMIT M,N;
M:记录开始的索引。第一条是0
N:一次取得记录条数
M=(当前页码-1)*N;
编写分页代码:
1、设计出封装分页有关信息的类Page
2、改造DAO
3、改造Service
参考实现:
4、改造Servlet
三、大文本和大二进制数据的存取:lob(练一遍)
四、批处理:batch(练一遍)
Statement:他的实现中。
有一个List集合,元素就是SQL语句
addBatch(sql);相当于 List.add(sql);
executeBatch();// 把List中的所有语句一次性的交给数据库处理
clearBatch();// 清空List中的元素
PreparedStatement:适合语句相同,但参数不同的批处理。
五、如何调用存储过程(用JDBC如何调用)
六、事务的入门案例(重点)
1、MySQL:事务默认是自动提交的。即一条语句就是出于独立的事务之中。
2、MySQL:SQL(TPL)
starttransaction:开启事务。后面的语句处于同一个事务之中。
rollback:回滚。事务结束
commit:提交事务。事务结束
3、JDBC控制事务
start transaction: Connection setAutoCommite(false)
rollback Connection.rollback();
commit Connection.commit();
七、事务的特性:(原理:面试)
1、原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账:转账前aaa+bbb=2000;转账后aaa+bbb=2000;
3、隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4、持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
八、事务的隔离级别:(重点)
1、如果不考虑事务的隔离性,会出现什么问题?
脏读:一个线程中的事务读到了另一个线程中事务未提交的数据
不可重复读:一个线程中的事务读到了另一个线程中提交的update的数据,前后两次读到的内容不一致。
虚读:一个线程中的事务读到了另一个线程中提交的insert或delete的数据,前后读到的记录条数不一致。
2、事务的隔离级别:
READUNCOMMITTED 脏读、不可重复读、虚读都有可能发生
READ COMMITTED 能避免脏读;不可重复读、虚读有可能发生(Oracle默认)
REPEATABLE READ 能避免脏读、不可重复读;虚读有可能发生(MySQL默认)
SERIALIZABLE 能避免脏读、不可重复读、虚读的发生
以上隔离级别:从上到下,级别越高,性能越低,数据也越安全。
MySQL:
查看当前数据库的隔离级别:
select @@tx_isolation;
更改隔离级别:(开启事务之前更改)
set transaction isolation level 四个级别之一
练习:account账户。演示脏读
时间 | 线程1(自己) READ UNCOMMITTED | 线程2 | 说明 |
t1 | start transaction; |
|
|
t2 | select * from account where name=’aaa’; 发现:1000块 |
|
|
t3 |
| start transaction; |
|
t4 |
| update account set money=money+100 where name=’aaa’; |
|
t5 | select * from account where name=’aaa’; 发现:1100块 |
| 脏读发生了 |
t6 | commit |
|
|
t7 |
| commit |
|
演示不可重复读
时间 | 线程1(自己) READ COMMITTED | 线程2 | 说明 |
t1 | start transaction; |
|
|
t2 | select * from account where name=’aaa’; 发现:1000块 |
|
|
t3 |
| start transaction; |
|
t4 |
| update account set money=money+100 where name=’aaa’; |
|
t5 | select * from account where name=’aaa’; 发现:1000块 |
| 避免了脏读 |
t6 |
| commit |
|
t7 | select * from account where name=’aaa’; 发现:1100块 |
| 发生了不可重复读 |
| commit |
|
|
演示虚读
时间 | 线程1(自己) READ COMMITTED | 线程2 | 说明 |
t1 | start transaction; |
|
|
t2 | select * from account; 发现:3条记录 |
|
|
t3 |
| start transaction; |
|
t4 |
| insert into account values(4,’ddd’,1000); |
|
t5 |
| commit |
|
t6 | select * from account; 发现:4条记录 |
| 幻影数据。发生了虚读 |
t7 | commit |
|
|
3、JDBC中设置隔离级别
Connection.setTransactionIsolation(intlevel);
九、丢失更新(非常普遍)
一个线程中的事务覆盖了另一个线程中已经提交的数据。
解决:利用数据库的锁机制
共享锁:可以有多把。
独占锁:(排它锁)只能有一把。只要外面有共享锁,会等。update、insert、delete会自动加独占锁。