zoukankan      html  css  js  c++  java
  • mybatis的DAO接口自动实现

    Spring注入映射器

    在SpringMVC中,你可以不必为每一个DAO都去写相应的实现,而交给SpringMVC替你创建。

    为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:MapperFactoryBean。这个类可以让你直接注入数据映射器接口到你的 service 层 bean 中。当使用映射器时,你仅仅如调 用你的 DAO 一样调用它们就可以了,但是你不需要编写任何 DAO 实现的代码,因为 MyBatis-Spring 将会为你创建代理。

    使用注入的映射器代码,在 MyBatis,Spring 或 MyBatis-Spring 上面不会有直接的依赖。 MapperFactoryBean 创建的代理控制开放和关闭 session,翻译任意的异常到 Spring 的 DataAccessException 异常中。此外,如果需要或参与到一个已经存在活动事务中,代理将 会开启一个新的 Spring 事务。

    MapperFactoryBean

    数据映射器接口可以按照如下做法加入到 Spring 中:

    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
      <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
      <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
    • 1
    • 2
    • 3
    • 4

    MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。

    如果 UserMapper 有一个对应的 MyBatis 的 XML 映射器文件, 如果 XML 文件在类路径的位置和映射器类相同时, 它会被 MapperFactoryBean 自动解析。没有必要在 MyBatis 配置文件中去指 定映射器 , 除非映射器的 XML 文件在不同的类路径下 。

    注意,当 MapperFactoryBean 需要 SqlSessionFactory 或 SqlSessionTemplate 时。这些可以通过各自的 SqlSessionFactory 或 SqlSessionTemplate 属性来设置, 或者可以由 Spring 来自动装配。如果两个属性都设置了,那么 SqlSessionFactory 就会被忽略,因为 SqlSessionTemplate 是需要有一个 session 工厂的设置; 那个工厂会由 MapperFactoryBean 来使用。

    你可以直接在 business/service 对象中以和注入任意 Spring bean 的相同方式直接注入映射器:

    <bean id="fooService" class="org.mybatis.spring.sample.mapper.FooServiceImpl">
      <property name="userMapper" ref="userMapper" />
    </bean>
    • 1
    • 2
    • 3

    这个 bean 可以直接在应用程序逻辑中使用:

    public class FooServiceImpl implements FooService {
    
      private UserMapper userMapper;
    
      public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
      }
    
      public User doSomeBusinessStuff(String userId) {
        return this.userMapper.getUser(userId);
      }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意在这段代码中没有 SqlSession 或 MyBatis 的引用。也没有任何需要创建,打开或关闭 session 的代码, MyBatis-Spring 会来关心它的。

    MapperScannerConfigurer

    没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。

    要创建 MapperScannerConfigurer,可以在 Spring 的配置中添加如下代码:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
    </bean>
    • 1
    • 2
    • 3

    basePackage 属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。

    MapperScannerConfigurer 属性不支持使用了 PropertyPlaceholderConfigurer 的属 性替换,因为会在 Spring 其中之前来它加载。但是,你可以使用 PropertiesFactoryBean 和 SpEL 表达式来作为替代。

    注意 , 没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因为 MapperScannerConfigurer 将会创建 MapperFactoryBean 之后自动装配。但是,如果你使用了一个以上的DataSource ,那么自动装配可 能会失效 。这种情况下 ,你可以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名称来使用。这就是它如何来配置的,注意 bean 的名称是必须的,而不是 bean 的引用,因此,value 属性在这里替代通常的 ref:

    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    • 1

    MapperScannerConfigurer 支持过滤由指定的创建接口或注解创建映 射器 。annotationClass 属性指定了要寻找的注解名称。markerInterface 属性指定了要寻找的父接口。如果两者都被指定了,加入到接口中的映射器会匹配两种标准。默认情况下,这两个属性都是 null,所以在基包中给定的所有接口可以作为映射器加载。

    被发现的映射器将会使用 Spring 对自动侦测组件(参考 Spring 手册的 3.14.4)默认的命名策略来命名。也就是说,如果没有发现注解,它就会使用映射器的非大写的非完全限定类名。但是如果发现了@Component 或 JSR-330 的@Named 注解,它会获取名称。注意你可以配置到org.springframework.stereotype.Component , javax.inject.Named(如果你使用 JSE 6 的话)或你自己的注解(肯定是自我注解)中,这样注解将会用作生成器和名称提供器。

  • 相关阅读:
    在vue项目中使用element-ui的Upload上传组件
    express使用ejs模板引擎渲染html文件
    nodejs服务端实现post请求
    anroid学习笔记(1)
    水平遍历和嵌套递归
    写代码的风格
    简易版本vue的实现和注解
    JavaScript下的new操作符做了什么?
    node下的跨域传递cookie
    用node研究axios前后端交互状态码规则
  • 原文地址:https://www.cnblogs.com/yuan951/p/7070138.html
Copyright © 2011-2022 走看看