zoukankan      html  css  js  c++  java
  • 关于 mybatis 的 @MapperScan 用法心得

    1. 必需引用 mybatis-spring-boot-starter, 否则不能扫描生效。可以用 mybatis-plus 的 mybatis-plus-boot-starter 替代。

    2. 从网上搜 MapperScan,大部分说是通过 basePackage 指定扫描多个包,本身没问题,但不是一个完美的方案。原因如下:

    (1)如果扫描的包名是一个较顶级的,那么,一些不是 mapper 的 interface 也会被处理成 mapper 而被创建成一个 spring bean,造成系统无法启动,这肯定不行。

    (2)只有缩小包的范围,最好是只配置 mapper 对应包,但如果把所有包含  mapper 的包罗列出来,则也存在不足。

      - 其一,会导致列表变得比较长。用通配符解决一部分问题,但需要包包满足一些统一的规则。另外,对于层级不同的情况,不好处理。

      - 其二,则降低了扩展性,因为每增加或调整 mapper 包,都要到 @MapperScan 中去注册。业务代码的变更影响了框架性的代码。尤其是对于多模块的情况,这个问题变得越发隐晦:谁能想到多引用一个模块就需要配置一下 @MapperScan?

      - 其三,违背依赖的原则,本来框架不依赖业务,现在变成了框架反过来要因业务变化而调整代码。

    3. 因此,我认为最好的方式是,在 @MapperScan 中,使用 basePackage + annotationClass 组件解决问题。

    (1)所有的 mapper 上加上 @Mapper 注解。这是合理的,因为本身 mapper 属于一类特殊的接口,理应该要通过特殊注册进行区分。

    (2)有了第1条,basePackage 就可以指定一个较顶级的包名了

    通过上面两条,一方面解决了 mapper 包动态变化的问题,因为业务上的代码一般会有一个统一的包前缀,典型的如 com.cortName, 那么就可以把它作为 basePackage,只需要配置一次,后面的变化都不受影响。

    示例:

    @MapperScan(basePackages = {"com.biz1", "com.group2"}, annotationClass = Mapper.class)
  • 相关阅读:
    CodePlus#4 最短路
    最大子矩阵问题———悬线法
    Luogu P3393 逃离僵尸岛
    SCOI2011 糖果
    关于页面的跳转添加参数(比如id啥的)
    npm 常用命令
    移动开发中的一些基本的思想,和需要注意的细节技巧之处
    Mock模拟后台数据接口--再也不用等后端的API啦
    普及知识
    移动端JD首页H5页面
  • 原文地址:https://www.cnblogs.com/qkhh/p/14368828.html
Copyright © 2011-2022 走看看