版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hlw521hxq/article/details/83448468
Spring表达式
原理
重要的类:
-
SpelExpressionparser:SpringEL解析表达器–》父类Expressionparse
-
StandardEvaluationContext:直译:标准化评估语境—》父类EvaluationContext
方法:
- parseExpression():解析器对象调用解析
- getValue():解析表达对象调用,获取值
- getValue(解析域对象):解析表达对象调用,返回解析域对象的值
对于引用类型:不用解析域对象,直接解析
xml配置解析器
Spring事务
管理jdbc-连接数据库事务
连接数据库
导入jar包
- Spring-jdbc:连接数据库
- mysql-connector-java:连接
- commons-dbcp:连接池
- spring-tx:事务
- c3p0:连接池
c3P0连接池
queryForObject
new RowMapper<Users>() {
public Users mapRow(ResultSet resultSet, int i) throws SQLException {
return chuliresult(resultSet);
}
重要的类:
ComboPooledDataSource:负责连接数据库
JdbcTemplate:负责sql操作,相当于封装的sql工具类,负责Dao与持久层的家伙
DataSourceTransactionManager:事务管理类
需要学习的类
- DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
- HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器,调用处理器传递参数等工作!
- ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
事务管理
事务的传播行为*
- (1)PROPAGATION_REQUIRED
表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务 - (2)PROPAGATION_SUPPORTS
表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行 - (3)PROPAGATION_MANDATORY
表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 - (4)PROPAGATION_REQUIRED_NEW
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。
如果存在当前事务,在该方法执行期间,当前事务会被挂起。
如果使用JTATransactionManager的话,则需要访问TransactionManager - (5)PROPAGATION_NOT_SUPPORTED
表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。
如果使用JTATransactionManager的话,则需要访问TransactionManager - (6)PROPAGATION_NEVER
表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常 - (7)PROPAGATION_NESTED
表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。
嵌套的事务可以独立于当前事务进行单独地提交或回滚。
如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。
注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务
事务的特性ACID
- 原子性(atomicity)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability)
事务并发引起的问题
-
脏读
一个事务读取到另外一个可能回滚的事务数据 ,是一个脏的数据。对应事务隔离性
-
不可重复读
在同一个事务中两次读取到的数据不一致,由于两次查询过程的时间中,发生了更新或者增删改的操作,违背一致性
-
幻读
插入事务执行中,查询事务查询过来,发现数据没有变化,实际上,插入操作正在进行
事务隔离级别
- 读未提交
- 读已提交
- 可重复读
- 串行化