spring的优势
- spring是一个框架,是一个生态圈,其扩展了许多不同的领域,例如web项目、移动项目等。
- spring的三大核心也是其优势点
- IOC控制反转
- AOP面相切片编程
- 容器使用
- spring是一套框架,不依赖于任何应用服务器,所以做到了write once,run anywhere
- 封装了内置tomcat容器,也设置了jdbc,同时使用mybatis实现数据持久层与数据库的简单链接
pom.xml //导入mybatis jar包的中央仓库坐标
//加入jdbc驱动
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc
</artifactId>
</dependency>
//整合mybatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter
</artifactId>
<version>2.1.0</version>
</dependency>
application.yml
//配置mysql启动配置项
spring:
datasource:
##获取连接的参数 driver url username password
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:port/库名?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: username
password: password
//配置mybatis的映射文件等
mybatis:
##映射文件{sql文件}
type-aliases-package: type-aliases-package #设置实体类别名
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
然后就开始创建mapper层创建mapper接口,然后在resource中创建对应的映射文件
有两种方式
- 如果没有在yml文件中配置
mapper-locations: classpath:mapper/*Mapper.xml
在需要再resource下创建和src中的mapper文件路径一样的文件夹,
然后创建相应的xml的文件
- 如果在yml文件中配置
mapper-locations: classpath:mapper/*Mapper.xml
那么不需要和src下的mapper文件路径相同,直接创建相应的mapper文件夹
spring事务
- sping事务:在业务层(service)与持久层(mapper或者dao层)进行交互的时候,尤其时在进行增删改的操作,因为查询操作不需要对数据库进行数据更改操作,只需要返回某情况(where sort limit)情况下的数据。在增删改的时候,通常会涉及到多个表单数据更改,
class serviceImpl{
@Autowired
private Mapper mapper;
//删除某电影类型的时候,还需要把涉及到此类别的电影进行类型修改
//只是演示事务的概念,有不对的希望指出,谢谢!
//可能类型删除完毕,但是对于对应的电影无法进行修改,这个时候是无法完成该操作的,我们希望的是两个操作同时执行或者同时不执行并且报错, 简称事务回滚操作, 这时候,我们使用@Transactional注解该方法,有一个操作不完成则不继续进行,回滚到整个方法开始,躲避与持久层的交互出现的错误。
public boolean delete(Movie movie){
//删除对应类型
mapper.deleteType(movie.getType());
//删除电影中的该类型
mapper.updateMovie(movie);
}
}
- 事务分为编程式事务与声明式事务。
- 声明式事务:通过@Transactional注解完成事务定义。
- 实现过程:
在运行@SringbootApplication的启动类后,该启动类会加载两个注解@EnableAutoConfiguration和@Conponent注解,扫描包内的全部组件,进行bean初始化,在这个时候,拥有@Transactional注解的类会生成一个代理对象,代理对象变为bean注入ioc容器当做bean的时候,会提前进行事务操作。
@Transactional(propagation = Propagation.REQUIRES_NEW)
spring事务的传播机制
- 什么是传播机制
不同方法之间进行调用的时候,如何进行**事务**的选取
- 传播机制都有哪些
class A{
public void a(){}
}
class B{
public void b(){}
}
@Transactional(propagation = Propagation.事务处理方法)
使用声明式事务时,需要配置使用事务的类对于事务的调用方法,使用propagation = Propagation.事务传播方法
🎏事务方法
🎈REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
🎈SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
🎈MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
🎈REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
🎈NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
🎈NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
🎈NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
3. 怎么进行传播机制的设置
@Transactional(propagation = Propagation.事务处理方法)
spring事务的隔离级别