(一)MVC
(1)MVC
- MVC模型
- Module 主要是封装数据,封装对数据的访问(User、DAO)
- View 主要作用是展示数据(JSP)
- Control 接受请求找到对应的JavaBean处理业务逻辑(Servlet)
(2)Javabean+JSP
- 表单提交的数据到JSP页面,封装为一个JavaBean
- 使用
<jsp:useBean >
- 使用
<!--防止中文乱码-->
<% request.setCharacterEncoding("UTF-8"); %>
<!--将表单中的数据封装为一个JavaBean-->
<jsp:useBean id="u" class="com.mio4.web.domain.User"> </jsp:useBean>
<jsp:setProperty name="u" property="name"/>
<jsp:setProperty name="u" property="password"/>
<!--从JavaBean中获取数据-->
<jsp:getProperty name="u" property="name"/><br/>
<jsp:getProperty name="u" property="password"/><br/>
(3)JavaEE三层架构
- Web 显示层
- JSP+Servlet:展示内容 接受请求
- Service 业务逻辑层
- 调用DAO
- DAO 数据访问层
- 操纵数据库
(二)事务
事务:对于一系列操作,要么全部执行成功,要么全部执行失败 例如银行中的转账:A转出钱,B转入钱,要么都成功,要么都失败
(1)数据库事务
- 数据库事务(Transaction)
- 对于一系列SQL操作,要么全部执行成功,要么全部执行失败
start transaction;
开启一个事务commit;
事务提交rollback;
回滚
(2)Java事务
- 使用
java.sql.Connection
对象控制Java中的事务- connection.setAutoCommit(false); //关闭自动提交
- connection.commit(); //事务提交
- conn.rollback(); //事务回滚
- 需要在Service中创建Connection对象来开启和关闭事务
- 1.使用参数,将Connection传递到DAO中
- 2.使用ThreadLocal中的set()和get()方法将Connection绑定(可以实现一个对象在同一个线程内共享)
(3)事务
- 事务特性ACID
- Atomicity 原子性:所有的操作要么全部执行成功,要么全部执行失败
- Consistency 一致性:事务执行前后整个系统稳定,比如在银行转账前后总的钱数是不变的
- Isolation 隔离性:事务之间不会相互影响(一个事务执行时不会受到其他线程事务的影响)
- Durability 持久性:对于事务提交和回滚,改变需要被持久化到数据库中(永久记录下来)
- 不考虑隔离性会出现的读问题(除了幻读都能在MySQL中进行实验)
- 脏读:读到了其他事务回滚前的数据。比如事务A修改了数据X但没有提交,事务B读取了X,此时A回滚事务,则B形成了脏读
- 不可重复读:在同一个事务中,两次查询的结果不一样
- 幻读:事务A首先读到了符合条件的n条数据,事务B然后让符合条件的数据增加了m条,这时事务A再次读取时会读到n+m条数据,产生幻读
- 数据库隔离级别
隔离级别 | 隔离级别 | 可避免情况 |
---|---|---|
read uncommited | 读未提交 | 无 |
read commited | 读已提交 | 脏读 |
repeatable read | 可重复读 | 不可重复读 脏读 |
serializable | 串行化 | 脏读 不可重复读 幻读 |
set session transaction isolation level read uncommitted; //设置隔离级别为read uncommited
select @@tx_isolation; //查看数据库隔离级别
- 隔离级别比较(既然隔离级别越高越安全,为什么不通用serializable隔离级别呢?效率)
- 隔离级别越高,效率越低
- 脏读是必须避免的情况
模拟银行转账代码:https://github.com/mio4/Learn-Java/tree/master/Head%20First%20Java%20Web/BasicDemo12