java--spring---事务配置和Mybatis整合

一、事务的配置

1.事务的隔离级别:有4个值。

	DEFAULT:采用 DB 默认的事务隔离级别。MySql 的默认为 REPEATABLE_READ; Oracle默认为 READ_COMMITTED。
	➢ READ_UNCOMMITTED:读未提交。未解决任何并发问题。
	➢ READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
	➢ REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
	➢ SERIALIZABLE:串行化。不存在并发问题。

2.事务的传播行为

控制业务方法是不是有事务的, 是什么样的事务的。

7个传播行为,表示你的业务方法调用时,事务在方法之间是如果使用的。

PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
以上三个需要掌握的
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED

3.spring框架中提供的事务处理方案

1. 使用注解。

spring框架自己用aop实现给业务方法增加事务的功能, 使用@Transactional注解增加事务。@Transactional注解是spring框架自己注解,放在public方法的上面,表示当前方法具有事务。可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等等

1.1使用@Transactional的步骤:
1.需要声明事务管理器对象
 <bean id=“xxx" class="...DataSourceTransactionManager"> 
1.2开启事务注解驱动, 告诉spring框架,我要使用注解的方式管理事务。
1.3.spring事务注解实例
<!--使用spring的事务处理-->
<!--声明事务管理器-->
<bean class="org.springframework.jdbc.support.JdbcTransactionManager" id="transactionManager">
    <!--连接的数据库,指定数据源-->
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解驱动,告诉spring使用注解管理对象-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
public interface DeptService {
	public void testTran();
}

@Service
@Transactional
//添加事务 
public class DeptServiceImpl implements DeptService {
	@Override
	public void testTran() {
		Dept d1 = new Dept("测试事务", "测试");
		deptDao.save(d1);
		Dept d2 = new Dept(1, "ces", "ces");
		deptDao.save2(d2);
	}
}
2.不使用注解
2.1配置事务
<!--声明业务方法它的事务属性(隔离级别,传播行为,超市时间)
    id:自定义名称transaction-manager,表示tx:advice和</tx:advice>之间的配置内容
    transaction-manager:代表事务管理器对象的id
-->
<tx:advice id="myadvice" transaction-manager="transactionManager">
    <!---->
    <!--tx:attributes:配置事务属性-->
    <tx:attributes>
        <!--tx:method:给具体的方法配置事务属性,method可以有多个,
              分别给不同的方法设置事务属性
              name:方法名称:1)完整的方法名称,不带有包和类
                           2)方法可以使用通配符,*表示任意字符
                 propagation:传播行为,枚举值
                   isolation:隔离级别
                     rollback-for:指定的异常类名,全限定类名,发生异常一定回滚  -->
        <tx:method name="buy" propagation="REQUIRED" isolation="DEFAULT"
                   rollback-for=" java.lang.NullPointerException,com.openlab.excep.NotEnoughException" />
        <!--通过通配符,指定很多的方法-->
        <tx:method name="add" propagation="REQUIRES_NEW"></tx:method>
        <!--指定修改方法-->
        <tx:method name="modif"></tx:method>
    </tx:attributes>
</tx:advice>
2.2配置aop
<!--配置aop-->
<aop:config>
     <!--配置切入点表达式:指定那些包中的类要应用事务
           id切入点表达式的名称唯一值
           expression;切入点表达式指定那些类要使用事务,aspectj会创建代理对象
    -->
    <aop:pointcut id="point" expression="execution(* com.openlab.service.BuyGoodsService.*(..))"/>
    <!-- 配置增强器:关联advice和pointcut
    advice-ref:通知,上面tx:advice的配置
    -->
    <aop:advisor advice-ref="myadvice" pointcut-ref="point"></aop:advisor>
</aop:config>

二、Mybatis整合

1.通过mapper.xml映射文件整合

1.配置pom文件加入依赖
2.创建实体类
3.创建dao接口和mapper文件

int insertuser(Users user);
List<Users> selectAll();
<mapper namespace="com.openlab.dao.UserDao">
    <insert id="insertuser">
        insert into user values (#{id},#{name },#{password})
  </insert>

  <select id="selectAll" resultType="com.openlab.pojo.Users">
      select * from  user
  </select>
</mapper>

4.创建mybatis主配置文件

<typeAliases>
    <package name="com.openlab.pojo"/>
</typeAliases>
 <mappers>
     <package name="com.openlab.dao"/>
 </mappers>

5.创建service接口和实现类,属性是dao

int add(Users user);
List<Users> quseryUser();
//引用类型
private UserDao dao;
 @Override
 public int add(Users user) {
     int nums= dao.insertuser(user);
     return nums;
 }

 @Override
 public List<Users> quseryUser() {
     List<Users> list=dao.selectAll();
     return list;
 }

6.创建spring配置文件,声明mybatis的对象交给spring创建

<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!---->
<!--声明数据源datesource,作用连接数据库-->
 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
<!--声明的是mybatis中提供的sqlsessionfactory类。这个类内部创建sqlsessionfactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
    <!--set注入,把数据库连接池付给datesource属性-->
    <property name="dataSource" ref="dataSource"></property>
    <!--mybatis主配置文件的位置
        configLocation:属性resource类型,读取配置文件的
        他的赋值,使用value,指定文件路径,使用calsspath:表示文件的位置
    -->
    <property name="configLocation" value="classpath:mybatis.xml"></property>

</bean>
<!--创建dao对象,使sqlsession的getmapper(user.class)
MapperScannerConfigurer:在内部第调用getmapper()生成每个dao接口的代理对象
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--指定sqlsessionfactory对象的id-->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    <!--指定包名包名使接口所在的包名
    MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次
    getmapper()方法,得到每个接口的到对象
    创建好的dao对象放入到spring的容器中
    -->
    <property name="basePackage" value="com.openlab.dao"></property>
</bean>

7.测试

<!--声明service--><bean id="userservice" class="com.openlab.service.impl.Userviceimpl"><property name="dao" ref="userDao"></property></bean>
ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
 Userviceimpl u = ac.getBean(Userviceimpl.class);
 List<Users> users = u.selectAll();
      for(Users u:users){
          System.out.println(u);
      }

你可能感兴趣的:(spring,spring,java)