spring :
项目整合框架 主要负责项目中组件对象的 创建 使用 销毁 对象创建
mybatis :
持久层 框架 主要是用来简化原始jdbc技术对数据库访问操作 操作数据库
整合思路:
mybatis中的核心对象通过spring框架接管创建
mybatis中的核心对象是 sessionFactory 通过源码得知sessionFactory是一个复杂对象 自己创建比较麻烦 。
spring如何管理sqlsessionFactory对象的创建?
mybatis官方对代码进行了封装 mybatis-spring 依赖中 的 SqlSessionFactoryBean 提供 sessionFactory。
xml文件实例:
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"></bean>
spring整合mybatis步骤:
步骤一:
引入依赖:1.spring 2.mybatis 3.mysql 4. mybatis-spring 5. druid
(前三个依赖就不放上去了,不知道的可以看我sping章, 下面是后面两个的依赖)
<!--spring-mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!--druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency>
步骤二:
2.1:建表
2.2:创建实体类
2.3:创建DAO接口
2.4:创建接口相对应的mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">//对应的接口路径
//resultType是从数据库查询数据用的
<select id="" resultType="">
<!--select语句-->
</select>
//parameterType是将数据存入到数据库用的
<insert id="" parameterType="">
<!--insert语句-->
</insert>
</mapper>
步骤三:
spring主配置文件
1.将sessionFactory对象交给spring工厂管理
<!--创建sessionFactory对象-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--set注入 把数据库连接池付给dataSource属性-->
<property name="dataSource" ref="dataSource"/>
<!--mybatis主配置文件的位置-->
<!--使用通配符进行注册 只需要注册一次-->
<property name="mapperLocations" value="classpath:路径/*.xml"/>
<!--注入别名相关配置 默认指定包下设置别名 别名为首字母小写的类名-->
<property name="typeAliasesPackage" value="aop"/>
</bean>
<!--创建数据源 druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3307/2001"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
创建出sessionFactory对象后就可以查询数据库里的数据了
2.创建dao组件
dao组件将
SqlSession sqlSession = factoryBean.openSession(); VersionService versionService = sqlSession.getMapper(VersionService.class);
这两行代码进行了封装
<!--
创建DAO组件类
MapperScannerConfigurer 创建指定包下的DAO对象 对象id名:接口首字母小写 批量创建 首选
MapperFactoryBean 创建指定接口的DAO对象 单个创建 id自己指定
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
<!--把这个包下的所有接口都创建相应实现类并实例化,默认名称接口的首字母小写,多个包用逗号分隔-->
<property name="basePackage" value="包路径"/>
</bean>
3.事务处理
用来实现事务控制的核心对象是
Connection 连接对象的 commit() rollback();
1.编程式事务处理
定义:通过业务层中注入事务管理器对象,然后通过编码的方式进行事务控制
1.1.0 创建serviceImpl实现类
1.1.1 在spring和mybatis框架中提供了一个类
DataSourceTransctionManger 数据源事务管理器
作用:在全局创建一个事务管理器,用来统一调度 业务是当前线程使用连接对象和Dao层实现连接对象一致 TheadLocal
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"/>
</bean>
1.1.2 配置xml将serviceImpl交给spring容器管理
<bean id="userDao2" class="serviceImpl.UserDaoImpl">
<property name="userDao" ref="userDao"/>
<property name="platformTransactionManager" ref="transactionManager"/>
</bean>
1.2 在service层中调用事务管理器
package serviceImpl;
import controller.User;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import service.UserDao;
import java.util.List;
public class UserDaoImpl implements UserDao {
private UserDao userDao;
//在工厂中提取事务管理器
private PlatformTransactionManager platformTransactionManager;
public void setPlatformTransactionManager(PlatformTransactionManager platformTransactionManager) {
this.platformTransactionManager = platformTransactionManager;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void insertUser(User user) {
//创建事务配置对象
TransactionDefinition transaction = new DefaultTransactionDefinition();
//获取事务状态
TransactionStatus transaction1 = platformTransactionManager.getTransaction(transaction);
try {
//业务处理
user.setAge(15);
user.setName("彭家亮");
user.setSool("反动派");
userDao.insertUser(user);
//异常 测试事务
int i = 1/0;
platformTransactionManager.commit(transaction1);
}catch (Exception e){
System.out.println("出错");
platformTransactionManager.rollback(transaction1);
}
}
}
2.声明式事务处理 推荐
定义:通过利用aop切面编程进行事务控制,并对事务属性在配置文件中完成细粒度配置 这种方式称之为声明事务
好处:减少代码冗余,更加专注业务逻辑开发,无需重复开发
tx:advice 标签:
1.根据指定的事务管理器在工厂中创建一个事务环绕对象
2.对业务方法进行细腻度事务控制
<!-- spring框架封装的事务环绕通知 -->
<tx:advice id="transaction" transaction-manager="transactionManager">
<!-- 细腻度配置 -->
<tx:attributes>
<!-- propagation 事务传播属性 REQUIRED 默认值 -->
<tx:method name="insert*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 事务配置
proxy-target-class="true" 属性值决定是基于接口的还是基于类的代理被创建
-->
<aop:config proxy-target-class="true">
<aop:pointcut id="pc" expression="within(service.UserDaoImpl)"/>
<aop:advisor advice-ref="transaction" pointcut-ref="pc"/>
</aop:config>
配置完成
声明式事务就是 封装的编程式事务+环绕通知
<!-- propagation 事务传播属性
REQUIRED: 需要事务 如果外层没有事务,则开启新的事务,如果外层存在事务,则融入当前事务
SUPPORTS: 支持事务 如果外层没有事务,不会开启新的事务,如果外层存在事务,则融入当前事务
REQUIRES_NEW: 每次开启新的事务 如果外层存在事务,外层事务挂起,自己开启新的事务执行,执行完成,恢复外层事务
NOT_SUPPORTED: 不支持事务 如果外层存在事务,外层事务挂起,自己以非事务方式执行,执行完成,恢复外层事务
MANDATORY: 强制事务 没有事务报错
NEVER: 不能有事务 存在事务报错
NESTED: 嵌套事务 事务之间可以嵌套运行,数据库Oracle Mysql 不支持
-->