将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以,该整合只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
实现 Spring 与 MyBatis 的整合。常用的方式:扫描的 Mapper 动态代理。Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。
事务原本是数据库中的概念,在实际项目的开发中,进行事务的处理一般是在业务逻辑层, 即 Service 层。这样做是为了能够使用事务的特性来管理关联操作的业务。
在 Spring 中通常可以通过以下两种方式来实现对事务的管理:
(1)使用 Spring 的事务注解管理事务
(2)使用 AspectJ 的 AOP 配置管理事务(声明式事务管理)
MySQL:mysql默认的事务处理级别是’REPEATABLE-READ’,也就是可重复读
Oracle:oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。
默认系统事务隔离级别是READ COMMITTED,也就是读已提交
总结:
常用
不常用
示例:
@Transactional(readOnly = false, // 读写事务
timeout = -1, // 事务的超时时间不限制(数据库有异常或没有连接上,等待的时间,但还是要看连接的数据库是如何设置的。
//noRollbackFor = ArithmeticException.class, // noRollbackFor设置遇到指定的错误不用回滚。此处是遇到数学异常不回滚
isolation = Isolation.DEFAULT, // 事务的隔离级别,数据库的默认
propagation = Propagation.REQUIRED // 事务的传播行为,此处是指当前的方法要在事务中去执行。
)
@Transactional有几点需要注意
<bean id="transactionManager" class="**org.springframework.jdbc.datasource.DataSourceTransactionManager**">
<property name="dataSource" ref="dataSource" />
bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="**org.springframework.orm.hibernate3.HibernateTransactionManager**">
<property name="sessionFactory" ref="sessionFactory" />
bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
Spring中事务的实现有两种方式,一种是基于xml文件的实现,一种是基于注解方式实现。在SSM的开发中,多使用注解方式实现事务的处理。
实现步骤:
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>5.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>5.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.1version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.22version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.12version>
dependency> dependencies><build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A73eKdcL-1658763749525)(…/…/…/…/Pictures/Spring/wps292.jpg)](https://img-blog.csdnimg.cn/cb116a19eb484cf99a3e2eceafbce2e8.jpeg)
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*get*" read-only="true"/>
<tx:method name="*select*" read-only="true"/>
<tx:method name="*find*" read-only="true"/>
<tx:method name="*search*" read-only="true"/>
<tx:method name="*add*" propagation="REQUIRED" />
<tx:method name="*save*" propagation="REQUIRED" no-rollback-for="ArithmeticException"/>
<tx:method name="*insert*" propagation="REQUIRED" no-rollback-for="ArithmeticException"/>
<tx:method name="*delete*" propagation="REQUIRED"/>
<tx:method name="*remove*" propagation="REQUIRED"/>
<tx:method name="*clean*" propagation="REQUIRED"/>
<tx:method name="*update*" propagation="REQUIRED"/>
<tx:method name="*modify*" propagation="REQUIRED"/>
<tx:method name="*set*" propagation="REQUIRED"/>
<tx:method name="*change*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS"/>
tx:attributes>
tx:advice>
<aop:config >
<aop:pointcut id="pointcat" expression="execution(* com.bjpowernode.service.*.*(..))">aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcat">aop:advisor>
aop:config>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:annotation-driven>tx:annotation-driven>
@Service
//交给Spring接管,进行对象的创建,并且自动注入mapper
@Transactional( propagation = Propagation.*REQUIRED*
//必须添加事务
,readOnly = true
//只读事务(用于查询操作)
,timeout = -1 //设置连接永不超时
,noRollbackForClassName = "ArithmeticException"
//遇到这个异常不回滚事务
,isolation = Isolation.*DEFAULT*
//使用数据库的隔离级别
) public class UsersServiceImpl implements UsersService {
整合实现步骤:
1.新建maven工程,添加各种依赖
2.修改目录结构
3.添加SqlMapConfig.xml和XXXMapper.xml模板
4.添加db.properties文件
5.添加SqlMapConfig.xml文件
6.添加applicationContext_dao.xml文件并实现功能
7.添加applicationContext_service.xml文件并实现功能(注解驱动)
8.添加applicationContext_trans.xml文件(xml配置文件方式)
<import resource="classpath:applicationContext_dao.xml">import>
<context:component-scan base-package="com.bjpowernode.service">context:component-scan>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="insert*" propagation="REQUIRED">tx:method>
<tx:method name="add*" propagation="REQUIRED">tx:method>
<tx:method name="save*" propagation="REQUIRED" no-rollback-for="ArithmeticException">tx:method>
<tx:method name="set*" propagation="REQUIRED">tx:method>
<tx:method name="update*" propagation="REQUIRED">tx:method>
<tx:method name="modify*" propagation="REQUIRED">tx:method>
<tx:method name="change*" propagation="REQUIRED">tx:method>
<tx:method name="delete*" propagation="REQUIRED">tx:method>
<tx:method name="remove*" propagation="REQUIRED">tx:method>
<tx:method name="clear*" propagation="REQUIRED">tx:method>
<tx:method name="empty*" propagation="REQUIRED">tx:method>
<tx:method name="*" propagation="SUPPORTS">tx:method>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.bjpowernode.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut">aop:advisor> aop:config>
9.新建库springuser,新建表users,accounts
10.新建实体类Users,Accounts
11.新建mapper包下的接口和.xml文件
12.新建service包下的接口和接口实现类
13.新建测试类,完成功能测试
测试结果总结如下:
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
1、Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中的init-method和destroy-method指定的方法
2、Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
3、容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
4、工厂后处理器接口方法:这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器 接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
总结:class(UsersService)-实例化-对象属性填充(AccountsService)-初始化(DefaultUsers)AOP-代理对象-bean.
@Service
//交给Spring去创建对象
IOC@Transactional =èAOP处理
public class UsersServiceImpl implements UsersService {
//切记切记:一定有数据访问层的对象
@Autowired
UsersMapper usersMapper;
//由Spring负责依赖注入
IOCDefaultUsers users;=è初始化处理的对象
@Override
public int insert(Users users) {
int num = usersMapper.insert(users)***\*;
System.out.println("用户增加成功!num="+num);
System.out.println(1);
return num;
}
}
4.9 Spring中用到的设计模式总结
Spring框架中用到了很多的设计模式,总结如下: