用 Spring 拉取的 Mybatis 的 Mapper,除了用 @Autowired,还有用什么方法可以拿到? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lhx2008
V2EX    Java

用 Spring 拉取的 Mybatis 的 Mapper,除了用 @Autowired,还有用什么方法可以拿到?

  •  
  •   lhx2008
    xenv Jan 3, 2018 4984 views
    This topic created in 3037 days ago, the information mentioned may be changed or developed.
    我想做到根据 String 自动获取到 Mapper,
    但是好像 capableBeanFactory.autowireBean 和 capableBeanFactory.getBean 都拿不到,我搜索了好久也没啥结果
    现在比较折中的方法只能把所有 Mapper 都 Autowired 进来,再用反射 get 那个 mapper,有点蛋疼
  • mapper
  • autowired
  • mybatis
    a href="/tag/string" class="tag">
  • string
    22 replies    2018-01-06 08:15:11 +08:00
    lhx2008
        1
    lhx2008  
    OP
       Jan 3, 2018
    突然发现用注入一个 sqlSessionFactory 用 openSession().getMapper()就可以了,但是不知道有没啥副作用
    aristotll
        2
    aristotll  
       Jan 3, 2018
    @lhx2008 那样你就要 close 自己那个 open 开的 session 了吧
    lhx2008
        3
    lhx2008  
    OP
       Jan 3, 2018
    @aristotll 对呀,@Autowired 的 seesion 应该是 spring 管理的,自己弄一个不知道 Spring 会不会自动帮我关
    lonenol
        4
    lonenol  
       Jan 3, 2018
    试试这个:
    sqlSessionFactory.configuration.mapperRegistry.mappers
    lhx2008
        5
    lhx2008  
    OP
       Jan 3, 2018
    @lonenol 这个好像返回的是 interface,不是 mybatis 动态代理之后的实体类
    public Collection<Class<?>> getMappers()
    18583826786
        6
    18583826786  
       Jan 3, 2018 via Android
    额,不一直都是注入 sqlSessionFactoty,然后得到 mapper 吗? spring 有事务控制可以自己关闭 session,这里需要配置
    x18960
        7
    x18960  
       Jan 3, 2018 via iPhone
    只知道 jdk 的, 同楼主观望其他方法
    zjp
        8
    zjp  
       Jan 3, 2018
    Mapper 可以直接注入啊… mybatis 会动态代理。如楼上所说需要配置事务控制。简单场景用到反射可以肯定是用错了。
    lhx2008
        9
    lhx2008  
    OP
       Jan 3, 2018 via Android
    @zjp 问题是我现在不知道是那个 mapper,要运行的时候传参进来才能确定,所以在 mapper 上面自动注入是不行的
    lhx2008
        10
    lhx2008  
    OP
       Jan 3, 2018 via Android
    @18583826786 如果是正常用法就是直接注入到 xxxmaper 上面,不用 getmapper 啊
    lhx2008
        11
    lhx2008  
    OP
       Jan 3, 2018 via Android
    我想是不是要重新自己写一个切面来自动关闭 session 会好一点?如果自己用 getMapper 函数的话。
    lhx2008
        12
    lhx2008  
    OP
       Jan 3, 2018 via Android
    @zjp 反射还挺常用吧,特别是抽象重复方法的时候
    zjp
        13
    zjp  
       Jan 4, 2018 via Android
    @lhx2008 抱歉才看清楚题目描述…注入 sqlSessionFactoty 是需要手动关闭 session,生命周期已经脱离 Spring 管理
    bxb100
        14
    bxb100  
       Jan 4, 2018 via Android   1
    有个抽象类叫做 sqlsessiondaosupport 其中有个方法可以获得 spring 管理的 sqlsession 然后你可以 getmapper
    bxb100
        15
    bxb100  
       Jan 4, 2018 via Android
    或者直接用 sqlsessiontemplate 拿
    lhx2008
        16
    lhx2008  
    OP
       Jan 4, 2018 via Android
    @bxb100 谢谢,我回去试试
    Sypher
        17
    Sypher  
       Jan 4, 2018
    也就是说,楼主想要拿( Spring 管理下的) Mapper 去搞事情。#14 楼这种方法适合你
    lonenol
        18
    lonenol  
       Jan 4, 2018
    @lonenol 这个好像返回的是 interface,不是 mybatis 动态代理之后的实体类
    public Collection<Class<?>> getMappers()

    然后再按类型获取一下 bean 应该就可以了吧
    palmers
        19
    palmers  
       Jan 4, 2018   1
    统一 @bxb100 童鞋的做法 类似这样:
    ```java
    public class BaseService<T, M> extends SqlSessionDaoSupport {
    /**
    * model T 对应的 Mapper 类 -- 用的时候传进来
    */
    private Class<M> mapperClass;

    @Override
    public M getMapper() throws DataAccessException {
    return getSqlSession().getMapper(mapperClass);
    }

    ............
    ```
    nita22
        20
    nita22  
       Jan 4, 2018   1
    注入 sqlsessiontemplate,然后可以从 sqlsessiontemplate 里面 getMapper
    lhx2008
        21
    lhx2008  
    OP
       Jan 4, 2018 via Android
    @palmers 就是我想要的效果哈哈,不过我还是用了 sqlsessiontemplate 比较自由一点,我还想把关联查询在 service 层统一封装了(基于 jpa 的注解),所以要一个自由 getMapper 的函数
    lhx2008
        22
    lhx2008  
    OP
       Jan 6, 2018 via Android
    @palmers 昨天弄了才知道,实际上你这个代码是跑不了的,泛型被擦掉了。我是自己又包装了一个工厂函数把 mapper interface 传进去拿到 entity
    About     Help     Advertise     Blog     API     FAQ     Solana     3253 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 12:02 PVG 20:02 LAX 05:02 JFK 08:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86