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

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

然后再按类型获取一下 bean 应该就可以了吧
palmers
2018 年 1 月 4 日
统一 @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
2018 年 1 月 4 日
注入 sqlsessiontemplate,然后可以从 sqlsessiontemplate 里面 getMapper

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX