「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制

简介: 「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制


0 复习



  1. 代理模式


    代理模式,可以为目标类添加额外功能。


  2. Spring 动态代理



    1. 定义目标类对象
    2. 定义额外功能,增强。实现Spring内置的接口
    3. 配置增强类
    4. 定义切入点
    5. 编织组装

  3. 增强类型



    1. 前置增强 MethodBeforeAdvice
    2. 后置增强 AfterReturningAdvice
    3. 异常增强 ThrowsAdvice
    4. 环绕增强 MethodInterceptor

  4. 切入点表达式



    1. execution(返回值类型 包名.类名.方法名(参数表))



      execution( com.bcl.service..*(..));



    2. args(参数表)


    3. within(全类名)


    4. @annotation(自定义注解)



  5. 事务的隔离级别



1 再谈web.xml


1.1 web.xml中标签的加载顺序


到目前为止web.xml中出现的标签:servlet filter listener context-param


加载顺序,从前到后:



context-param 定义一对键值对数据,通常为listener使用


listener ContextLoaderListener:在web应用启动时执行,创建Spring工厂


filter Struts2Filter:过滤所有请求


servlet



1.2 Servlet的url-pattern的配置方式


Servlet的url-pattern有4种配置格式:



精确匹配 /book/showAllBooks


路径匹配 / /book/


后缀名匹配 .action .do *.jsp


缺省匹配 / 在上面3种都无法匹配的情况下,做默认匹配



优先级从高到低:



1 精确匹配 2 路径匹配 3后缀名匹配 4缺省匹配



注意点:



  1. 同是路径匹配,路径最长者优先
  2. 路径匹配和后缀名匹配不能混淆使用。/book/*.do 错误
  3. 任何时候,无论怎么配置,filter一定优先于servlet

2 Spring整合MyBatis


2.1 MyBatis项目开发步骤



  1. 搭建开发环境



    1. 新建项目


    2. 导入依赖



      数据库驱动依赖:ojdbcx.jar mysql-connector-java.jar


      MyBatis相关的依赖


      servlet+jsp+jstl的依赖


      struts2的依赖


      junit+hutool+druid



    3. 配置文件+工具类



      jdbc.properties


      log4j.properties


      xxxMapper.xml


      mybatis-config.xml


      struts.xml



    4. 配置文件初始化



      web.xml 配置Struts2Filter


      mybatis-config.xml 初始化配置




  2. 建表


  3. 实体


  4. mapper



    1. 接口
    2. 实现:XxxMapper.xml

  5. service



    1. 接口


    2. 实现:



      SqlSession sqlSession = MyBatisUtils.openSession();


      XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);




  6. test


  7. action+jsp


  8. 集成测试



2.2 整合思路


image-20200603111758115image-20200603111758115

2.3 整合实战


准备工作,添加 mybatis-spring


https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 整合spring mybatis的依赖--><dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-spring</artifactId>    <version>2.0.4</version></dependency>
AI 代码解读

初版配置:


https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 读取jdbc.properties--><context:property-placeholder location="classpath:jdbc.properties"/><!-- 0 定义一个连接池 --><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">    <property name="driverClassName" value="${jdbc.driverClassName}"/>    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="password" value="${jdbc.password}"/></bean><!-- 定义SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="druidDataSource"/>    <!--            配置实体类的包名,自动为实体配置短类名的别名         -->    <property name="typeAliasesPackage" value="com.bcl.entity"/>    <property name="mapperLocations">        <!-- 配置mapper.xml的路径-->        <list>            <!--<value>classpath:com/bcl/mapper/UserMapper.xml</value>                <value>classpath:com/bcl/mapper/StudentMapper.xml</value>                <value>classpath:com/bcl/mapper/BookMapper.xml</value>-->            <value>classpath:com/bcl/mapper/*Mapper.xml</value>        </list>    </property></bean><!-- 定义SqlSession --><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">    <constructor-arg ref="sqlSessionFactory"/></bean><!-- 创建 UserMapper实现类对象--><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">    <property name="sqlSessionTemplate" ref="sqlSession"/>    <property name="mapperInterface" value="com.bcl.mapper.UserMapper"/></bean><!--<bean id="bookMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">        <property name="sqlSessionTemplate" ref="sqlSession"/>        <property name="mapperInterface" value="com.bcl.mapper.BookMapper"/>    </bean>--><bean id="userService" class="com.bcl.service.impl.UserServiceImpl">    <property name="userMapper" ref="userMapper"/></bean>
AI 代码解读

最终配置:


https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 读取jdbc.properties-->    <context:property-placeholder location="classpath:jdbc.properties"/>    <!-- 0 定义一个连接池 -->    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">        <property name="driverClassName" value="${jdbc.driverClassName}"/>        <property name="url" value="${jdbc.url}"/>        <property name="username" value="${jdbc.username}"/>        <property name="password" value="${jdbc.password}"/>    </bean>    <!-- 定义SqlSessionFactory-->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="druidDataSource"/>        <!--            配置实体类的包名,自动为实体配置短类名的别名         -->        <property name="typeAliasesPackage" value="com.bcl.entity"/>        <property name="mapperLocations">            <!-- 配置mapper.xml的路径-->            <list>                <value>classpath:com/bcl/mapper/*Mapper.xml</value>            </list>        </property>    </bean>    <!--        自动创建Mapper实现类对象        自动扫描basePackage包下的Mapper接口,自动创建Mapper接口的实现类对象    -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <!--            mapper实现类对象的id规则:接口名首字母小写            UserMapper  ==> userMapper            BookMapper ==> bookMapper        -->        <property name="basePackage" value="com.bcl.mapper"/>    </bean>    <bean id="userService" class="com.bcl.service.impl.UserServiceImpl">        <property name="userMapper" ref="userMapper"/>    </bean>
AI 代码解读

2.4 Spring整合MyBatis项目的开发步骤



  1. 搭建开发环境



    1. 新建web项目


    2. 导入依赖



      jdbc驱动依赖


      mybatis依赖


      struts2依赖


      spring依赖


      spring整合mybaits依赖


      spring整合struts2依赖



      https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version>    <scope>test</scope></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-test</artifactId>    <version>4.3.26.RELEASE</version></dependency><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.48</version></dependency><dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis</artifactId>    <version>3.5.4</version></dependency><dependency>    <groupId>org.slf4j</groupId>    <artifactId>slf4j-log4j12</artifactId>    <version>1.7.30</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>4.3.26.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aop</artifactId>    <version>4.3.26.RELEASE</version></dependency><dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjweaver</artifactId>    <version>1.9.5</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>4.3.26.RELEASE</version></dependency><dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.1.0</version></dependency><dependency>    <groupId>javax.servlet.jsp</groupId>    <artifactId>javax.servlet.jsp-api</artifactId>    <version>2.3.3</version></dependency><dependency>    <groupId>jstl</groupId>    <artifactId>jstl</artifactId>    <version>1.2</version></dependency><dependency>    <groupId>org.apache.struts</groupId>    <artifactId>struts2-core</artifactId>    <version>2.3.16.3</version></dependency><!-- 整合spring mybatis的依赖--><dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-spring</artifactId>    <version>2.0.4</version></dependency><!-- druid的依赖--><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.1.14</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-jdbc</artifactId>    <version>4.3.26.RELEASE</version></dependency> <dependency>            <groupId>org.apache.struts</groupId>            <artifactId>struts2-spring-plugin</artifactId>            <version>2.3.16.3</version>        </dependency>
      AI 代码解读

    3. 导入配置文件



      jdbc.properties


      log4j.properties


      xxxMapper.xml


      mybatis-config.xml


      struts.xml


      applicationContext.xml



    4. 配置文件初始化


      web.xml


      https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:applicationContext.xml</param-value></context-param><listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter>    <filter-name>Struts2Filter</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping>    <filter-name>Struts2Filter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>
      AI 代码解读

      applicationContext.xml


      https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 读取jdbc.properties--><context:property-placeholder location="classpath:jdbc.properties"/><!-- 0 定义一个连接池 --><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">    <property name="driverClassName" value="${jdbc.driverClassName}"/>    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="password" value="${jdbc.password}"/></bean><!-- 定义SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="druidDataSource"/>    <!--            配置实体类的包名,自动为实体配置短类名的别名         -->    <property name="typeAliasesPackage" value="com.bcl.entity"/>    <property name="mapperLocations">        <!-- 配置mapper.xml的路径-->        <list>            <value>classpath:com/bcl/mapper/*Mapper.xml</value>        </list>    </property></bean><!--        自动创建Mapper实现类对象        自动扫描basePackage包下的Mapper接口,自动创建Mapper接口的实现类对象    --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    <!--            mapper实现类对象的id规则:接口名首字母小写            UserMapper  ==> userMapper            BookMapper ==> bookMapper        -->    <property name="basePackage" value="com.bcl.mapper"/></bean>
      AI 代码解读


  2. 建表


  3. 实体


  4. mapper


  5. service



    1. 接口


    2. 实现


      https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">class XxxServiceImpl implements XxxService{    private XxxMapper xxxMapper;    public void setXxxMapper(XxxMapper mapper){        this.xxxMapper = mapper;    }        业务方法...}
      AI 代码解读


  6. test


  7. action+jsp


    https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">XxxAction{    private XxxService xxxService;    public void setXxxService(XxxService service){        this.xxxService = service;    }        服务方法...}
    AI 代码解读

  8. 集成测试



3 Spring中事务控制


Spring提供2种控制方式:



  1. 编程式事务控制:在程序中定义事务控制代码。
  2. 声明式事务控制:借助Spring AOP实现,将事务控制的代码定义成功能增强,将增强编织到切点指定的位置(业务层)。

Spring AOP声明式事务控制的步骤:



  1. 定义原始类对象(service对象)


    https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 定义目标类对象--><bean id="userService" class="com.bcl.service.impl.UserServiceImpl">    <property name="userMapper" ref="userMapper"/></bean>
    AI 代码解读

  2. 定义增强类,Spring内置有事务控制的增强


    DataSourceTransactionManager事务增强类


  3. 配置增强类


    https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!-- 配置增强类:事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="druidDataSource"/></bean><tx:advice transaction-manager="txManager" id="txAdvice">    <tx:attributes>        <!-- login 开启只读事务-->        <tx:method name="login" read-only="true"/>        <!-- 其它的方法,都必须开启事务 -->        <tx:method name="*" propagation="REQUIRED"/>    </tx:attributes></tx:advice>
    AI 代码解读

  4. 定义切点


  5. 编织组装


    https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #f8f8f8; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"><!--        定义切入点        编织组装     --><aop:config>    <aop:pointcut id="servicePointCut" expression="execution( com.bcl.service..*(..))"/>    <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointCut"/></aop:config>
    AI 代码解读


4 事务详解



  1. read-only="true"


    只读事务,不能执行增删改,但对于查询有性能优化。


  2. timeout 超时机制


    如果超过执行时间,事务自动回滚。默认值-1,表示跟数据库的配置有关。


  3. rollback-for和no-rollback-for


    rollback-for 定义异常类型:事务遇到这种异常会回滚


    no-rollback-for 定义异常类型:事务遇到这种异常不会回滚


    Spring中,rollback-for的默认值是RuntimeException,no-rollback-for的默认值是Exception。


    自定义异常时,发生该异常需要回滚事务,继承RuntimeException


    自定义异常时,发生该异常不需要回滚事务,继承Exception


  4. propagation(传播机制)


    企业开发时,业务复杂时,会出现业务方法调用业务方法的情况。propagation定义了一个业务方法被另外一个业务方法调用时,事务的传播方式。


    常见的事务传播机制:



    REQUIRED 如果外部有事务,加入外部事务,如果没有则新建


    SUPPORTS 如果外部有事务,加入外部事务,如果没有则以无事务的状态运行


    REQUIRES_NEW 无论是否有外部事务,都会新建一个事务



  5. isolation(隔离级别)



    READ_UNCOMMITTED 读未提交


    READ_COMMITTED 读提交 实战时使用


    REPEATABLE_READ 可重复读


    SERIALIZABLE 序列化读




「❤️ 帅气的你又来看了我」


如果你觉得这篇内容对你挺有有帮助的话:



  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  2. 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
  3. 觉得不错的话,也可以关注 编程鹿 的个人公众号看更多文章和讲解视频(感谢大家的鼓励与支持🌹🌹🌹)


目录
打赏
0
0
0
0
1
分享
相关文章
Spring中事务失效的场景
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时, 那么这个注解才会⽣效 , 如果使用的是被代理对象调用, 那么@Transactional会失效 同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现 的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效 如果在业务中对异常进行了捕获处理 , 出现异常后Spring框架无法感知到异常, @Transactional也会失效
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
25 0
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
33 0
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
18 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
29 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
21 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
40 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
33 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
15 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
35 0

热门文章

最新文章