Spring框架-数据访问层和事务管理
一.Spring数据访问层管理
1.导入Spring jdbc,mysql,mybatis,Spring管理mybatis数据访问层jar包
</dependency> <groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency>
<!-- Spring管理mybatis的jar包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency>
2.导入阿里数据源
<!-- 阿里数据源 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
3.Spring管理数据库连接对象
<bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value=""></property><property name="url" value=""></property><property name="username" value=""></property><property name="password" value=""></property><property name="initialSize" value="10"></property><!初始化连接数量><property name="maxActive" value="20"></property><!最大连接数量>
</bean>
以前使用jdbc,mybatis都是由我们自己创建数据库连接对象,在Spring中如果需要连接数据库,那么只需要将Spring管理的连接对象交给mybatis
4.Spring管理sqlSessionFactory对象
<!-- Spring管理sqlSessionFactory对象--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="druidDataSource"></property> <!-- 注入数据库 --><property name="configLocation" value="classpath:mybatis.xml"></property><!-- spring自动注册Mapper映射 --><property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></property></bean>
5.生成mybatis接口代理对象,扫描指定的包,并将数据库连接对象交给mybatis
<!-- 生成mybatis接口代理对象,直接扫描指定的包 --><bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="springpro.dao"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean>
二.事务管理
1.数据库事务管理
数据库事务管理就是对一次数据库操作过程中执行的多条执行语句进行管理,保证一次对数据库操作的多条sql要么都执行,要么都不执行,确保数据一致性
2.Spring事务管理
Spring事务管理就是Spring框架针对程序中提交事务这部分业务代码与业务代码进行分离,在程序执行没有问题时,提交事务,程序出现问题时,回滚事务
Spring中的事物管理分为两种形式:
1>编程式事务
在项目中很少使用,这种方式需要我们在代码中提交事务或回滚事务时自己写代码实现
2>声明式事务
声明式事务建立在AOP基础上,本质是对方法前后进行拦截,所以声明式事务是方法级别,在方法或类上添加注解标签即可,这样Spring会帮我们自动进行事务管理,方法成功则提交事务,出现异常则回滚事务
配置:
<!-- 配置 spring 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="druidDataSource"></property></bean><!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解标签(@Transactional):可以添加在类和方法上,添加在方法上只对这个方法生效,添加在类上对这个类中的所有方法都生效
声明式事务失效场景:
1.注解应用在非public修饰的方法上
2.异常被catch捕获了,事务失效
3.默认情况下出现编译期异常,可以解决@Transactional(rollbackFor = Exception.class) 不修改的情况下只有运行期异常会事务回滚
4.数据库引擎不支持事务(数据库有很多引擎,只有一个引擎支持事务InnoDB)