spirng(四)—Spring整合Mybatis

一、引入依赖

  • spring-context     上下文
  • spring-aspects    切面编程
  • spring-jdbc    spring对jdbc的支持
  • mysql
  • mybatis
  • mybatis-spring     mybatis对spring的支持,mybatis写的,spring默认不支持mybatis
  • druid    阿里的连接池

二、思路

将mybatis核心对象(SqlSessionFactory)交给spring管理

三、配置spring的配置文件

    <!-- 管理SqlSessionFactory      复杂对象命名以FactoryBean结尾的-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">        <!--id:SqlSessionFactory在spring容器中的唯一标识-->
        <!--数据源-->
        <property name="dataSource" ref="dataSource"></property>
        <!--映射文件-->
        <property name="mapperLocations">
            <array>
                <value>classpath:mapper/UserMapper.xml</value>
                <value>classpath:mapper/CommentMapper.xml </value>
            </array>
        </property>
        <!--实体类别名-->
        <property name="typeAliases">
            <array>
                <value>entity.User</value>
                <value>entity.Comment</value>
            </array>
        </property>
    </bean>
    <!--创建数据源-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <!--管理dao(复杂对象)-->
        <bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="userDao">
            <!--SqlSessionFactory(因为需要根据SqlSession获取dao)-->
            <property name="sqlSessionFactory" ref="sessionFactory"></property>
            <!--指定dao-->
            <property name="mapperInterface" value="dao.UserDao"></property>
        </bean>
    <!--管理dao-->
        <bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="commentDao">
            <!--SqlSessionFactory(因为需要根据SqlSessio获取dao)-->
            <property name="sqlSessionFactory" ref="sessionFactory"></property>
            <!--指定dao-->
            <property name="mapperInterface" value="dao.CommentDao"></property>
        </bean>    

四、优化spring配置文件

    <!-- 管理SqlSessionFactory      复杂对象命名以FactoryBean结尾的  -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
        <!--数据源-->
        <property name="dataSource" ref="dataSource"></property>
        <!--
            映射文件
            利用通配符:映射mapper包下的以mapper.xml结尾的文件 或者包下的(*)所有文件
                              注意: 映射文件必须有包结构才支持通配
        -->
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"></property>
        <!--实体类定义别名    typeAliasesPackage 包级别:包中的所有类  -->
        <property name="typeAliasesPackage" value="entity"></property>
    </bean>
    <!--
        创建数据源
        引入小配文件 location="配置文件路径"
             注意:spring默认会优先加载使用系统环境变量,此时,username实际上指的是当前计算机的用户名。
                  而不是取值配置文件中定义的username,将${username}换成了${name}
     -->
    <context:property-placeholder location="mysql.properties"/>
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${name}"/>
            <property name="password" value="${password}"/>
    </bean>
    <!--
        管理dao
        MapperScannerConfigurer:映射文件扫描配置
        容器中创建dao对象的名字为: (名字首字母小写) UserDao ===> userDao
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--SqlSessionFactory(因为需要根据SqlSession获取dao)-->
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
        <!--指明dao的位置(包级别的,包中所有dao都会被创建  首字母小写)-->
        <property name="basePackage" value="dao"></property>
    </bean>

引入的小配置文件mysql.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
name=root
password=root

五、spring整合业务层

使用spring提供的事物控制

1、引入依赖

  • spring-tx    进行事务控制,spring提供的transaction

2、配置文件

<!--
创建DataSourceTransactionManager(数据源事务管理器)
把数据源交给数据源事务管理器, 返回的就是线程安全的事务管理对象
-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager id="transactionManager" ">
  <property name="dataSource" ref="dataSource"/>
</bean>

<!--
tx:advice: 在spring程序运行时, 生成环绕通知, 唯一标识为id
  transaction-manager: 将线程安全的事务管理对象生成环绕通知
-->
<tx:advice id="tx" transaction-manager="transactionManager">
    <!-- //细粒度控制事务
      tx:method: 为哪些方法开启事务  name: 方法名(支持 *通配符)
    -->
    <tx:attributes>
        <tx:method name="add*"/>
    </tx:attributes>
</tx:advice>

<!--组装切面-->
<aop:config>
  <aop:pointcut id="pt" expression="within(service.*ServiceImpl)"/>
  <aop:advisor advice-ref="tx" pointcut-ref="pt"/>
</aop:config>

为什么使用spring提供的事物控制?

  • 1.spring整合mybatis 默认的事务是 自动自交, 出现异常无法回滚
  • 2.手动使用aop完成事物, 存在连接线程安全的问题(无法确保service与dao使用同一连接)

要引入的依赖如下:

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.26.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.26.RELEASE</version>
  </dependency>

    <!-- mybatis相关配置 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.1.1</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.18</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.26.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.0</version>
    </dependency>

    <!-- spring提供的transaction -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.26.RELEASE</version>
    </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值