V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

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

    然后再按类型获取一下 bean 应该就可以了吧
        19
    palmers   19 天前   ♥ 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);
    }

    ............
    ```
        20
    nita22   18 天前   ♥ 1
    注入 sqlsessiontemplate,然后可以从 sqlsessiontemplate 里面 getMapper
        21
    lhx2008   18 天前 via Android
    @palmers 就是我想要的效果哈哈,不过我还是用了 sqlsessiontemplate 比较自由一点,我还想把关联查询在 service 层统一封装了(基于 jpa 的注解),所以要一个自由 getMapper 的函数
        22
    lhx2008   17 天前 via Android
    @palmers 昨天弄了才知道,实际上你这个代码是跑不了的,泛型被擦掉了。我是自己又包装了一个工厂函数把 mapper interface 传进去拿到 entity
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2704 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 66ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1