Java框架我爱编程

SpringMVC和事务和Mybatis

2018-03-23  本文已影响0人  天下无敌强

《JavaEE互联网轻量级应用整合开发》

SpringMVC从入门到放弃

控制器开发

获取请求参数

Ajax发送POST请求

$.post({
    url:"...",
    //此处需要告知传递参数类型为JSON,不能缺少
    contentType:"application/json",
    //将JSON对象转换为字符串传递
    data:JSON.stringify(data),
    success:function(result){}
});

深入Spring事务管理

声明式事务

隔离级别

SQL规范事务隔离级别

隔离级别解释

选择隔离级别和传播行为

传播行为

以信用卡批量还款为例

//记录还款成功的总卡数和对应完成的信息
@Transaction RepaymentBatchService.batch
//每张卡的还款
@Transaction RepaymentService.repay

Spring中的传播行为

  1. REQUIRED==>当方法调用时,如果不存在当前事务,那么就创建事务;如果之前的方法已经存在事务了,那么就沿用之前的事务;Spring的默认行为
  2. SUPPORTS==>当方法调用时,没事务就不启用事务;如果存在当前事务,就沿用当前事务
  3. MANDATORY==>方法必须在事务内运行,如果不存在当前事务就抛出异常
  4. REQUIRES_NEW==>无论是否存在当前事务,方法都会在新的事务中运行,也就是事务管理器会打开新的事务去运行该方法
  5. NOT_SUPPORTED==>不支持事务,不存在事务也不会创建,如果存在事务,则挂起它,直至该方法结束后才恢复当前事务,适用于那些不需要事务的SQL
  6. NEVER==>不支持事务,只有在没有事务的环境中才能运行它,如果方法存在当前事务,则抛出异常
  7. NESTED==>嵌套事务,也就是调用方法如果抛出异常,只回滚自己内部执行的SQL,而不回滚主方法的SQL。它的实现存在两种情况,1.如果当前数据库支持保存点(savepoint),那么它就会在当前事务上使用保存点技术;如果发生异常,则将方法内执行的SQL回滚到保存点上,而不是全部回滚;2.不支持保存点的haunted,就等同于REQUIRES_NEW创建新的事务运行方法代码

Spring中通过一个枚举去定义的org.springframework.transaction. annotation.Propagation
企业级应用中主要关注的是REQUEIRES_NEWNESTED

@Transactional的自调用失效问题

MVC模型中Controller中调用Service的问题

防止过长时间占用事务

错误异常捕获语句

Mybatis和Spring

SqlSessionTemplate

Mybatis

生命周期论

SQLSessionFactoryBuilder

SQLSessionFactory

  1. SQLSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象
  2. MyBatis的本质就是Java对数据库的操作,所以SQLSessionFactory的生命周期存在于整个Mybatis应用中
  3. 由于SQLSessionFactory是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个SQLSessionFactory就存在多个数据库连接池,不利于数据库资源的控制,容易导致资源被消耗光
  4. 一般以单例存在,在应用中共享

SqlSession

Mapper

Mybatis配置

typeHandler类型转换器

ObjectFactory(对象工厂)

Mybatis插件

映射器

映射器配置元素

SELECT元素

SELEC查询中传递多个参数

  1. 使用map————键值集合需要阅读键才能明白其作用,其次无法限定传递的值得数据类型,因此业务性质不强,可读性差
  2. 使用注解(至于mapper接口的方法的入参定义上)@Param————无法处理多个参数
  3. 使用JavaBean————没有@Param注解的方式直观
  4. 混合使用(注解加JavaBean)

简单分页参数Bean-RowBounds

INSERT语句

插入中的自定义规则

ResultMap中的级联配置

级联配置

<resultMap type="com.kyou.Girl" id="[映射集唯一标识]">
    <id column="[column_name]" property="[Girl实体中定义的ID属性]">
    <result column="girl_name" property="girlName">
    <association property="task" column="task_id"
            select="com.kyou.mapper.TaskMapper.getTask"/>
</resultMap>
上一篇 下一篇

猜你喜欢

热点阅读