Spring 与 MyBatis 的整合

2023-11-06

1.整合思路

  思路:将MyBatis框架中使用到的核心组件配置到Spring容器中,交给Spring来创建和管理。
  具体来说是将需要自行编码通过SqlSessionFactoryBuilder读取配置文件、构建SqlSessionFactory,进而获得SqlSession实例,满足业务逻辑对象对于数据访问的需要的工作交由Spring来完成,发挥Spring框架Bean容器的作用,接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系进行解耦合管理。

2、整和前准备

步骤:1、添加相应的 jar 包。
2、建立开发目录结构,创建实体类。
3、创建数据访问接口。
4、配置 SQL 映射文件。
5、配置 MyBatis 配置文件。

第一步:添加相应的依赖:
在这里插入图片描述
  整合时项目中只需要包含mybaits-spring:2.0.0就可以了,由于在整合中还会用到Spring的数据源支持以及事务支持,因此还需要在项目中加入 spring-jdbc:5.0.0.RELEASE 和
spring-tx:5.0.0:RELEASE 两个文件。
第二步:建立开发目录结构,创建实体类.
在这里插入图片描述
第三步:创建数据访问接口
在这里插入图片描述
第四步:配置 SQL 映射文件

<?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文件-->
<mapper namespace="com.kgc.dao.UserMapper">
    <select id="getUserList" resultType="User">
        select u.* , r.roleName from smbms_user u,smbms_role r where u.userRole = r.id
       
            <if test="userName !=null || userName!=''">
                and u.userName like concat("%",#{userName},"%")
            </if>
            <if test="userRole !=null || userRole!=''">
                and u.userRole = #{userRole} 
            </if>
    </select>
</mapper>

第五步:配置MyBatis配置文件
  和Spring整合的MyBaits配置文件要简单一些,可以将之前一些mybaits文件的配置工作交给spring完成
如:数据源的配置,加载Mapper.xml文件等工作

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--和Spring整合的MyBaits配置文件要简单一些,可以将之前一些mybaits文件的配置工作交给spring完成
    如:数据源的配置,加载Mapper.xml文件等工作-->
    <typeAliases>
        <package name="main.java.cn.kgc.pojo"/>
    </typeAliases>
</configuration>

3.实现 Spring 对 MyBatis 的整合

3.1 配置DataSource

  对于任何持久化方案,数据库谅解都是首先要解决的问题。在 Spring 中,数据源作为一个重要的组件可以单独进行配置和维护。
  在 Spring 中配置数据源,首先要选择一种具体的数据源实现技术。目前流行的数据源实现有 dbcp、c3p0、Proxool。他们都实现了连接池功能。下面是对他们的一些介绍:

  DBCP (DataBase connection pool)数据库连接池。是 Apache 上的一个 Java 连接池项目,也是 tomcat 使用的连接池组件。单独使用DBCP需要2个包:commons-dbcp.jar和commons-pool.jar。由于建立数据库连接是一种非常耗时、耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,使用完毕后再归还到连接池中。
  C3P0 是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
  Proxool 是一种Java数据库连接池技术。sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
  *目前是和DBCP以及C3P0一起,最为常见的三种JDBC连接池技术。
  *日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0。

 这里我们使用dbcp,使用前需要引入两个 jar 包:commons-dbcp.jar 和 commons-pool.jar
在这里插入图片描述
  建立Spring配置文件 applicationContext-mybatis.xml,需要配置数据源的代码示例如下:

 <!--配置数据源的Bean-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://locathost:3306/smbms?userUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="121127"/>
    </bean>

Tip:因为 url 属性的值包含特殊符号 “&” ,所以赋值时使用了 “&amp ;”,也可以使用 <![CDATA[]]标记来替换。

3.2 配置SqlSessionFactoryBean

  配置完数据源,就可以在此基础上集合 SQL 映射文件信息以及 MyBatis 配置文件中的其他信息,创建 SqlSessionFactory 实例。
  在 MyBatis 中,SqlSessionFactory 的实例需要使用 SqlSessionFactoryBuilder 穿件,而在集成环境中,则可以用 MyBatis-Spring 整合保重的 SqlSessionFactoryBean来代替。SqlSessionFactoryBean封装了 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象的过程, 我们可以在 Spring 中以配置文件的形式,通过配置 SqoSessionFactoryBean 获得 SqlSessionFactory实例。
如下示例:

   <!--配置SqlSessionFactoryBean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       
        <!--引用数据源组件-->
        <property name="dataSource" ref="dataSource"/>
       
        <!--引用 MyBatis 配置文件中的配置-->
        <property name="configLocation" value="applicationContext-mybatis.xml"/>
    
        <!--配置映射文件信息-->
        <property name="mapperLocations">
            <list>
                <value>classpath:UserMapper.xml</value>
            </list>
        </property>
    </bean>

  除了数据源和 SQL 映射信息,其他的 MyBatis 配置信息也可以转移至 Spring 配置文件中进行维护,只需要通过 SqlSessionFactoryBean 的对应属性进行赋值即可。

3.3. SqlSessionTemplate 进行持久化操作

  对于 MyBatis 而言,得到 SqlSessionFactory 实例,就可以进一步获取 SqlSession 实例进行数据库操作了。而在集成环境中,为了更好的使用 Spring 框架提供的服务, MyBatis-Spring 整合包提供了 SqlSessionTemplate 类。

  SqlSessionTemplate 类实现了 MyBatis 的 SqlSession 接口,可以替换 MyBatis 中原有的SqlSession 实现类来提供数据库的访问操作。使用SqlSessionTemplate 可以更好的与Spring 服务融合饼干简化部分流程化的工作,还可以保证和当前 Spring 事务相关联、自动管理会话的生命周期,包括必要的关闭、提交和回滚操作。
  配置 SqlSessionTempalte 并在 UserMapper 实现类中使用,示例如下:

package com.kgc.dao.impl;

import com.kgc.dao.UserMapper;
import main.java.com.kgc.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

/**
 * @description:
 * @author:
 * @date: 2019-07-06 12:12
 */
public class UserMapperImpl implements UserMapper {

    private SqlSessionTemplate sqlSessionTemplate;


    @Override
    public List<User> getUserList(User user) {

        //调用SqlSessionTemplate 对象的 getMapper()方法执行 SQL查询 并返回结果
        return sqlSessionTemplate.getMapper(UserMapper.class).getUserList(user);
    }

    public SqlSessionTemplate getSqlSessionTemplate() {
        return sqlSessionTemplate;
    }

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
}

Spring 配置文件的代码如下:

    <!--配置SqlSessionTemplate-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" >
  
        <!--配置SqlSessionTemplate需要引用 SqlSessionFactoryBean 组件作为参数-->
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
     
    <!--配置 DAO 组件并注入 SqlSessionTemplate 实例-->
    <bean id="userMapper" class="com.kgc.dao.impl.UserMapperImpl">
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

注意: 1、创建 SqlSessionTemplate实例时,需要通过其构造方法注入 SqlSessionFactory 的实例。
  2、与 MyBatis 中默认的 SqlSession 实现不同, SqlSessionTemplate 是线程安全的,可以以单例模式配置并被多个 DAO 对象公用,而不必为每一个 DAO 单独配置一个 SqlSessionTemplate 实例。

3.4 完善代码并测试

业务层代码如下:

/**
 * @description:
 * @author:
 * @date: 2019-07-06 13:19
 */
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;
    @Override
    public List<User> getUserList(User user) {
        return userMapper.getUserList(user);
    }
}

Spring 中配置Service层的代码如下:

   <bean id="userService" class="java.cn.kgc.service.impl.UserServiceImpl" p:userMapper-ref="userMapper"/>

测试类代码:

* @author: 
 * @date: 2019-07-06 14:35
 */
public class TestUserMapper {
Logger log = Logger.getLogger(TestUserMapper.class);
    /**
     * 获取所有用户信息
     */
    @Test
    public void getUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext-mybatis.xml");
       UserService userService = (UserService) context.getBean("userService");
        User user = new User();
        user.setUserName("韩");
        List<User> userList = userService.getUserList(user);
        for(User u:userList){
            log.info(u.getUserName());
        }
    }

在这里插入图片描述
小结:利用Spring框架和MyBatis-Spring整合资源包提供的组件,能够以配置的方式得到数据源、SqlSessionFactoryBean、SqlSessionTemplate等组件,并在此基础上完成DAO 模块和业务模块的开发和装配,简化了开发过程且便于维护。

扩展:
  MyBatis-Spring 提供了 SqlSessionDaoSupport 类来简化 SqlSessionTemplate的配置和获取。SqlSessionDaoSupport 类提供了 **setSqlSessionFactory()**方法用来注入 SqlSessionFactory实例并创建 SqlSessionTemplate 实例,同时提供了 getSqlSession() 方法用来返回创建好的SqlSessionTemplate 实例。

4.注入映射器的两种方式

  在 DAO 的实现类中使用 SqlSessionTemplate 的方法,都是采用字符来指定映射项,这种方式比较容易产生错误。并且 SqlSessionTemplate 对于映射器的方法功能实现都是通过 getMapper() 等方法来使先的。这并非最佳选择。
  利用MyBatis_spring 提供的组件,可以不必每次都调用 getMapper()方法,而是通过配置的方式直接为业务对象注入映射器实现,不需要额外代码。

4.1 MapperFactoryBean 的用法

  如果如果仅适用 SqlSessionTemplate 执行基本的数据访问操作,而不包含替他非 MyBatis的工作,可以不必手工编码使用 SqlSessionTemplate 或 SqlSessionDaoSupport 来实现此类 DAO.。 MyBatis_spring 提供了 MapperFactoryBean,能够以配置的方式生成映射器实现并注入到业务组件。

用法示例如下(先注释 上述示例中 UserMapper 的实现类 UserMapperImpl ):

   <!--配置数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="121127"/>
    </bean>

    <!--配置SqlSessioinFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--引入数据源组件-->
        <property name="dataSource" ref="dataSource"/>
        <!--引入mybatis配置文件-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <!--映入映射文件-->
        <property name="mapperLocations">
            <list>
                <value>UserMapper.xml</value>
            </list>
        </property>
    </bean>
    
    <!--配置 DAO-->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="main.java.cn.kgc.dao.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    </bean>
    <!--业务层配置-->
      <bean id="userService" class="java.cn.kgc.service.impl.UserServiceImpl" p:userMapper-ref="userMapper"/>

注意:
    1、配置 DAO 组件 userMapper 时, class 属性不是某个实现类,而是 MapperFactoryBean.
    2、通过 mapperInterface 属性指定映射器,只能是接口类型,不能是某个实现类。
    3、 MapperFactoryBean 是 SqlSessionDaoSupport 的子类,需要通过 setSqlSessinFactory()方法注入 SqlSessionFactory 实例以创建SqlSessionTemplate实例。
    4、如果映射器对应的 SQL 映射文件与映射器的类路径相同,该映射文件可以自动被 MapperFactoryBean解析。在此情况下,配置SqlSessionFacotryBean是可以不必指定SQL映射文件的位置。反之,如果映射器与映射文件的类路径不同,则需要再配置SqlSessionFactoryBean是明确指定映射文件的位置。

4.2 MapperScannerConfigurer 的用法

  MyBatis-Spring 中提供了 MapperScannerConfigurer,他可以用来扫描指定标准的接口并将它们直接注册为MapperFactoryBean.以解决因为映射器过多而导致配置过多的问题。
MapperConfigurer 的配置方法如下:

   <!--配置 DAO -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="main.java.cn.kgc.dao"/>
    </bean>

说明:
 basePackage 属性指定了扫描的基准包,MapperConfigure将递归扫描 基准包下及其子包下的所有接口。如果它们已经在 SQL 映射文件中定义过,则将它们动态注册为MapperFacotryBean,如此即可批量产生映射器实现类。

注意:
  1、basePackage 属性中可以包含多个包名,多个包名之间用逗号或者分号隔开。
  2、MapperScannerConfigurer 会为所有由它创建的映射器实现类开启自动装配。也就是说,MapperScannerConfigurer 创建的所有映射器实现都会被自动注入SqlSessionFactory 实例。因此在上述示例中装配DAO组件是无需显式注入 SqlSessionFactory 实例。
  3、若环境中出于不同目的配置了多个SqlSessionFactory 实例。将无法进行自动装配,此时应显式地指定所以啦的 SqlSessionFactory 实例。配置示例如下:

 <!--配置 DAO -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>   
        <property name="basePackage" value="main.java.cn.kgc.dao"/>
    </bean>

  需要注意的是这里使用的是 sqlSessionFactoryBeanName 属性而不是 sqlSessionFactory属性。正如该属性名所表达的,这个属性关注的是Bean的名称,所以为其赋值使用的是 value 而不是 ref。

映射器的命名问题:
  通过配置 MapperScannerConfigurer 可以批量生成映射器实现,这些映射器被注册到 Spring 的容器是,Spring 会根据其接口名称为其命名,默认规则是首字母小写的非完全限定类名。如: UserMapper 类型的组件会被 默认注册为 userMapper。在业务层中依然可以通过该命名为其注入映射器,也可以通过使用 @Autowired 或 @Resources 注解来实现对业务层的组件的依赖注入。

小结
 &emsp**;MapperScannerConfigurer** 与 @Autowired 注解 或 @Resource 注解配合使用,自动创建映射器实现并注入给业务组件,能够最大限度的减少 DAO 组件与业务组件的编码和配置工作。

5. 添加声明式事务

  Spring 提供了声明式事务处理机制,它基于AOP实现,无需编写任何事务管理代码,所有的工作全在配置文件中完成。这意味着与业务代码完全分离,配置即可用,降低了开发和维护的难度。

5.1 声明式事务的 XML 配置方式

  这里以添加用户的功能为例,介绍如何实现声明式事务处理。首先在UserMapper 和 UserMapper.xml 中添加相关的方法和 SQL 映射。示例代码如下:

UserMapper中的代码:

 public interface UserMapper {
        public int addUser(User user);
    }

UserMapper.xml中的代码:

  <insert id="addUser" parameterType="User">
        insert into smbms_user (userCode,userName,userPassword,gender,birthday,phone,address,userRole)
        values(#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole})
    </insert>

业务层的代码:

 public int addUser(User user) throws RuntimeException{
        int i = 0;

        try{
           i = userMapper.addUser(user);
        }catch(RuntimeException e){
            System.out.println("发生异常!");

            throw e;
        }
        return i;
    }

  接下来为业务层配置事务切面。首先要引入 tx 和 aop 两个命名空间,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"

       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

        http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-4.0.xsd

        http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd

        http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

        http://www.springframework.org/schema/p  http://www.springframework.org/schema/p/spring-p-4.0.xsd">
</beans>

  接下来需要配置一下事务管理器组件,他提供对事物处理的全面支持和统一管理,在切面中相当于增强处理的角色。可以使用 DataSourceTranSactionManager 来实现。其配置方式如下:

 <!--定义事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--需要引入之前配置好的数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

  事务管理器还可以进一步的配置,以便更好地适应具体的事务规则。示例代码如下:

  <!--定义属性声明事务规则-->
        <tx:attributes>
            <tx:method name="find*" propagation="SUPPORTS"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>

  在<tx:advice>标签内可以设置id 属性和 transaction-manager 属性。 其中 transaction-manager 属性医用一个事务管理器 Bean。
  除了上述两个属性外,还可以通过 <tx:attributes> 子标签定制事务属性。事务属性通过<tx:method >标签进行设置。Spring 支持对不同的方法设置不同的事务属性,所以可以为一个 <tx:advice> 设置多个<tx:method>。
  <tx:method>标签中的 name 属性时必须的,用于指定匹配的方法。这里需要对方法名进行约定,可以使用通配符(*)。其他属性均为可选,用于指定具体的事务规则,这些属性的解释如下:

1、propagration:事务传播机制。该属性的可选值如下:

属性可选值 说明
REQUIRED   默认值,表示如果存在一个事务,则支持当前事务;如果当前没有事务,则开启一个新的事务。
REQUIRES_NEW   表示总是开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起,开启新事物执行该方法。
MANDATORY   表示如果存在一个事务,则支持当前事务;如果当前没有一个活动弄的事务,则抛出异常
NESTED   表示如果当前存在一个活动的事务,则创建一个事务座位当前事物的签到事务运行;如果当前没有事务该取值与REQUIRE相同
SUPPORTS   表示如果存在一个事务,则支持当前事务;如果当前没有事务,则按非事务方式执行。
NOT_SUPPORTED   表示总是以非事务方式执行。如果一个事务已经存在,则将这个存在的事务挂起,然后执行该方法。
NEVER 表示总是以非事务方式执行。如果当前存在一个活动的食物,则抛出异常。

2、isolation:事务隔离登记。即挡墙事务和其他事务的隔离程度,在并发事务处理的情况下需要考虑他的设置。该属性的可选值如下:

属性可选值 说明
DEFAULT   默认值,表示使用数据库默认的事务隔离级别。
READ_UNCOMMITTED 未提交阅读
READ_COMMITTED 提交阅读
REPEATABLE_READ 可重复阅读
SERIALIZABLE 串行读

3、timeout:事务超时时间。允许事务运行的最长时间,以秒为单位。
4、read-only:事务是否为只读,默认你只为 false 。对于只执行查询功能的事务,把它设置为 true ,能提高事务处理的性能。
5、rollback-for:设定能够触发回滚的异常类型。
6、no-rollback-for:设定不触发回滚的异常类型。

 设置完事务规则,最后还要定义切面,将事务规则应用到指定的方法上。示例代码如下:

  <!--定义切面-->
    <aop:config>
    <!--定义切入点-->
        <aop:pointcut id="txPointCut" expression="execution(* service.*.*(..))"/>

        <!--引入事务管理的增强处理,引入切入点-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>

总结Spring声明事务的步骤:
1、导入tx 和 aop 的命名空间。
2、定义事务管理器 Bean ,并为其注入 数据源Bean。
3、通过 <ts:advice>配置事务增强,绑定事务管理器并针对不同方法定义事务规则。
4、配置切面,僵尸舞增强与方法切入点结合。

5.2 声明式事务的注解添加方式

  Spring 还支持使用注解装配声明式事务,所使用的注解是 @Transacional。

    @Transactional(propagation = Propagation.SUPPORTS)
    public int addUser(User user) throws RuntimeException{
        int i = 0;

        try{
           i = userMapper.addUser(user);
        }catch(RuntimeException e){
            System.out.println("发生异常!");

            throw e;
        }
        return i;
    }

  如上述示例在一个业务的实现类上添加@Transactional 注解即可为该类的所有业务方法统一添加事务处理。如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加@Transactional注解进行单独设置。

@Transactional 注解也可以设置事务属性的值,默认的@Transactional 设置如下,
1、事务传播设置是 PROPAGATION_REQUIRED.
2、事务隔离级别是 ISOLATION_DEFAULT。
3、食物是读/写
4、事务超时默认是依赖于事务系统的,或者不支持事务超时。
5、任何RuntimeException 将触发事务回滚,但是任何 checked Exception 不会触发事务回滚。

这些属性也是可以改变的,@Transactional 注解的个属性如下:

属性 类型 说明
propagation 枚举型:Propagation   可选的传播性设置。使用列举:@Transaciontal (propagation = Propagation.REQUIRES_NEW)
isolation 枚举型:Isolaction 可选的隔离级别。使用举例:@Transacional(propagation = Isolation.READ_COMMITTED)
readOnly 布尔型 是否为只读事务。使用列举:@Transacional (readOnly = true)
timeout int 型(以秒为单位) 事务超时。使用列举 @Transacioinal(timeout=10)
roolbackFor 一组Class类是的实例;必须是Throwable 的子类 一组异常类@Transacional(roollbackFor={SQLException.class}),多个异常可以用英文逗号隔开
rollbackFoClassName 一组Class类是的实例必须是Throwable 的子类 一组异常类名,遇到时必须进行回滚。使用举例:@Transactional(rolbackForClassName={“SQLException”}),多个异常用英文逗号隔开
noRollBackFor 一组Class类是的实例必须是Throwable 的子类 一组异常类,遇到时不必进行回滚
noRollbackForClassName 一组Class类是的实例必须是Throwable 的子类 一组异常类名称,遇到时不必进行回滚

总结:

  1、MyBatis-Spring 提供了 SqlSessionTemplate 模板类操作数据库,常用的方法有 selectList()、 insert()、update() 、等,使用 getMapper(ClassType) 可以直接访问接口实例,能够减少错误的发生, 另外不用写 DAO 的实现类。
  2、 使用 MapperFactoryBean 能够以配置的方式得到映射器实现,简化DAO 开发。前提是保证映射命名空间名和接口名称相同,以及映射元素的 id 和接口方法相同。
  3、使用 MapperScannerConfigurer 可以递归扫描 basePackage 所指定的包下的所有接口类, 在 Service 中可以使用 @Autowired 或 @Resource 注解注入这些映射接口的 Bean。
  4、Spring 和 MyBatis 整合可以采用 Spring 的事务管理,包括使用 xml 和注解配置事务管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 与 MyBatis 的整合 的相关文章

  • 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美 下 https www yuque com zcming123 uygxde cbwnad 这位猿 三连 再走吧 以下内容是为了让搜索引擎 检测到这篇文章 要阅读体验 请点击上面的连接 点击我 去我的语雀看 对了 我看到语雀那
  • 2021-07-25

    神经网络 M P神经元 感知机 感知机 神经网络 M P神经元 1 M P神经元 模拟生物行为的数学模型 接手n个输入 来自其他的神经元 并给各个输入赋予权重计算加权和 再跟自己特有的阀值 比较 通常用减法 最后经过激活函数 模拟 抑制 和
  • 模型选择、欠拟合和过拟合

    训练误差 training error 模型在训练数据集上表现出的误差 泛化误差 generalization error 模型在任意一个测试数据样本上表现出的误差的期望 常常通过测试数据集上的误差来近似 机器学习模型应该关注泛化误差 模型
  • JWT(Json Web Token)的原理、渗透与防御

    关于JWT kid安全部分后期整理完毕再进行更新 2023 05 16 JWT的原理 渗透与防御 目录 JWT的原理 渗透与防御 含义 原理 JWT的起源 传统session认证问题 token与session区别 JWT的结构与内容 JW
  • php 随机生成指定金额范围内的随机数

    function random bag money total personal num min money money total 20 personal num 19 min money 1 money right money tota
  • java学习笔记13--反射机制与动态代理

    本文地址 http www cnblogs com archimedes p java study note13 html 转载请注明源地址 Java的反射机制 在Java运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任
  • 《Python 黑帽子》学习笔记 - 准备 - Day 1

    信息安全是一个有意思的方向 也是自己的爱好 从零开始 想在工作之余把这个爱好培养为自己的技术能力 而 web 安全相对来说容易入门些 于是选择 web 渗透测试作为学习的起点 并选择同样是容易入门的 Python 作为编程工具 潜心学习 持
  • Python学习笔记--exe文件打包与UI界面设计

    exe文件打包与UI界面设计 前言 一 基于tkinter实现的UI设计 1 1 库的选择及思路 1 2 定位方法的选用 1 3 Frame控件 1 4 变量设置 1 5 批量设置 1 6 Text文本框 1 7 总体界面设计 1 8 功能
  • java I/O流的一些常用操作

    java i o 的一些操作 文件流 FileInputStream FileOutputStream FileReader FileWriter 这四个类是专门操作文件流的 用法高度相似 区别在于前面两个是操作字节流 后面两个是操作字符流
  • Qiskit API架构介绍(一)

    API是一组类 函数和数据结构 用于与设备和模拟器进行接口 并运行实验 Qiskit实验概述 Qobj中的实验序列定义了运行在后端backend上的量子操作 单个Qobj定义了一批要并发运行的实验 即 Qobj中每个实验按列出的顺序运行一个
  • CentOS 7 挂载本地光盘作为镜像源

    1 上传iso文件到 usr local src 一定要确保这个ISO文件上传完毕后再进行下面的操作 2 创建挂载目录 mkdir media CentOS7 3 挂载iso文件 mount t iso9660 o loop usr loc
  • Cpp学习——类与对象3

    目录 一 初始化列表 1 初始化列表的使用 2 初始化列表的特点 3 必须要使用初始化列表的场景 二 单参数构造函数的隐式类型转换 1 内置类型的隐式类型转换 2 自定义类型的隐式类型转换 3 多参数构造函数的隐式类型转换 4 当你不想要发
  • Matlab导出动态链接库dll

    1 新建 m文件 内容 function c Add a b c a b end 保存为 Add m 2 命令行输入 gt gt mex setup MEX configured to use Microsoft Visual C 2013
  • centos7 Jumpserver堡垒机部署以及使用详情

    一 跳板机 堡垒机的概念 1 跳板机 跳板机就是一台服务器 运维人员在使用管理服务器的时候 必须先连接上跳板机 然后才能去操控内网中的服务器 才能登录到目标设备上进行维护和操作 跳板机的缺点 仅仅实现服务器登录安全 但是没有实现对于运维人员
  • JavaEE学习记录day11 IO流02 字符流、转换流、Properties集合

    1 字符流 1 1为什么会出现字符流 理解 字符流的介绍 由于字节流操作中文不是特别的方便 所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时 文本文件也会有中文 但是没有问题 原因是最终底层操作会
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • 【9.19】正则表达式——sed、awk

    9 19 正则表达式 sed awk 9 4 9 5 sed 1 sed 匹配 2 sed打印具体行数 3 sed 替换功能 9 6 9 7 awk 1 awk 匹配 2 awk 数学运算表达式 3 两个字段比较大小 4 内置变量 OFS
  • 教你5步学会用Llama2:我见过最简单的大模型教学

    在这篇博客中 Meta 探讨了使用 Llama 2 的五个步骤 以便使用者在自己的项目中充分利用 Llama 2 的优势 同时详细介绍 Llama 2 的关键概念 设置方法 可用资源 并提供一步步设置和运行 Llama 2 的流程 Meta
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st
  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time

随机推荐

  • 面试题一:前端去重方法汇总你知道多少?

    题记 我们项目中有很多的业务是需要去重的 那么下面是常用的一些去重的一些方法 用indexOf方法去重 新建一个空数组 遍历需要去重的数组 将数组元素存入新数组中 存放前判断数组中是否已经含有当前元素 没有则存入 此方法也无法对NaN去重
  • 上采样,下采样,过采样,欠采样的区别

    上下是方法 过欠是现象 上采样 upsampling 应该就是内插 补零滤波 下采样 downsampling 应该就是抽取 过采样就是采样频率大于两倍的信号最高频率 欠采样就是采样频率小于两倍的信号最高频率 欠采样失真仅仅是对基带信号而言
  • 源码编译llvm Error 记录

    cmake G Unix Makefiles llvm DLLVM ENABLE PROJECTS bolt clang clang tools extra compiler rt cross project tests libclc l
  • OceanBase:编译、安装和配置手册

    概述 OceanBase是 一个高性能的分布式表格系统 提供类似BigTable的性能和扩展性 但表格中保存的是强类型的数据 比如integer string datetime等 它使用C 编写 运行于64位Linux环境下 生产环境下需要
  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编
  • ios内嵌h5点击输入框页面放大

    首先咱们这个是基于修改meta没卵用的情况 去修改这个input的style把font size改成16px 我的机型是xr 自己用了反正有效 希望对你有帮助
  • 实战:tomcat版本升级

    tomcat版本升级 由原来的apache tomcat 7 0 96升级到apache tomcat 7 0 109 版本 1 先把原来的备份 mv apache tomcat 7 0 96 1 apache tomcat 7 0 96
  • 01-Kafaka

    1 Kafka 2 的安装与配置 1 上传kafka 2 12 1 0 2 tgz到服务器并解压 tar zxf kafka 2 12 1 0 2 tgz C opt 2 配置环境变量并更新 编辑profile配置文件 vim etc pr
  • 春招大厂面试升级笔记!光CRUD已经不能满足了

    大厂的面试已经升级 早就不满足于CRUD了 今天给大家分享的就是大厂最近升级的面试小 炒 全篇共计为大家详细划分了19个部分 字数超过了20W字 面试题数量超过了1500道 同时结合了大量的实例和代码 涵盖了 Java基础 并发编程 JVM
  • python中sort()和sorted()排序函数用法详解

    python中对数据的排序主要使用sort 和sorted 方法 1 sort 方法 语法结构 列表序列 sort key None reverse False 注意 reverse 表示排序规则 reverse True 降序 rever
  • typora插件_Typora + PicGo 编写博客的神器

    一 软件版本要求 typora 0 9 93 使用最新版本即可 下载链接 https www typora io PicGo 2 2 0以上 也是最好用最新版的 下载链接 https github com Molunerfinn PicGo
  • stable diffusion实践操作-embedding(TEXTUAL INVERSION)

    系列文章目录 本文专门开一节写图生图相关的内容 在看之前 可以同步关注 stable diffusion实践操作 文章目录 系列文章目录 前言 1 embeddding的功能 2 如何去下载 https civitai com models
  • 粽子SHOP-粽子商城官网-一款简洁大气的官网源码

    介绍 一款简洁大气的官网源码 无后台 直接上传服务器或主机即可 可自行编辑内容非常实用的个人介绍页面 大家需要的自行下载 网盘下载地址 http zijieyunpan com OSdKfaj4W2z0 图片
  • FPGA时序分析约束

    时序分析约束 时序分析 时序分析的目的就是通过分析fpga设计各个寄存器之间的数据和时钟传输路径 来分析数据延迟和时钟延迟之间的关系 保证整个系统中的所有寄存器都能正确存储数据 时序约束 两个作用 1 告知EDA软件 该设计需要达到怎么样的
  • 程序员如何逆袭,达到财富自由?

    首先 先给程序员做一个定义 我定义的是 一个普通的程序员 家里普普通通 自己也没在大厂 一个中等公司 拿着两万左右的薪水 年终奖一般发不超过两个月 这样的程序员 逆袭的路有三条 背题 去大厂 混到高P拿股票 劲熬 找到靠谱的创业公司 拿到期
  • Python实现汽车油耗预测_基于Tensorflow2.X

    目录 一 开发环境 二 代码实现 2 1 准备操作 2 1 1 导入所需模块 2 1 2 matplotlib无法正常显示中文的解决方案 若无此情况可跳过 2 2 加载数据集 2 3 数据处理 2 3 1 数据清洗 2 3 2 数据转换 2
  • 学习underscore之比较两个元素是否相同

    underscore1 11 0 中判断两个参数相同的函数为isEqual isEqual 函数认为以下相等 0 与 0 不相等 NaN 与 NaN相等 a i 与 new RegExp a i 相等 5 与 new String 5 相等
  • 【Qt OpenGL教程】10:加载3D世界,并在其中漫游

    第10课 加载3D世界 并在其中漫游 参照NeHe 这次教程中 我将教大家如何加载一个3D世界 并在3D世界中漫游 这相较于我们只能创造一个旋转的立方体或一群星星时有很大的进步了 当然这节课代码难度不低 但也不会很难 只要你跟着我慢慢一步一
  • flutter 生成jks文件 获取sha1

    debug版本 SHA1 C Program Files Java jdk1 8 0 191 bin keytool exe list keystore debug keystore 找到这个目录下的keytool exe 拖进cmd 然后
  • Spring 与 MyBatis 的整合

    1 整合思路 思路 将MyBatis框架中使用到的核心组件配置到Spring容器中 交给Spring来创建和管理 具体来说是将需要自行编码通过SqlSessionFactoryBuilder读取配置文件 构建SqlSessionFactor