spring(2)_整合mybatis

本文介绍了如何将Spring与Mybatis进行整合,包括引入相关依赖、创建sessionFactory、配置数据源、Mapper文件的编写,以及事务处理的两种方式——编程式和声明式事务。重点讲述了Spring如何通过SqlSessionFactoryBean管理sqlsessionFactory对象,以及声明式事务处理的优势。
摘要由CSDN通过智能技术生成

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 不支持
-->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值