该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-01-31
最后修改:2012-01-31
。。。。。。。。。。。。 } 这是小弟的代码。我想在方法内部取得方法签名里MybatisCallBack<T> callback 的类型T的类型和类型名,一直 找不到可以取的T的方法, 无奈之下多放了一个参数进来 public <T> Object executeQuery(MybatisCallBack<T> callback, Class<T> type){ 。。 } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-01-31
我现在的项目需要引入mybatis,于是我需要对mybatis进行一些封装,如上描述的,我觉得运行时完全有必要取的T类型,而不需要引入一个额外的参数来指明T的ClassType。但是我无法获取到,是不支持还是怎么滴
|
|
返回顶楼 | |
发表时间:2012-01-31
先确定你是否真的需要类型T的类型和类型名吧
|
|
返回顶楼 | |
发表时间:2012-01-31
gtssgtss 写道 先确定你是否真的需要类型T的类型和类型名吧
当然确定,不然我还引入一个额外的方法参数干嘛 |
|
返回顶楼 | |
发表时间:2012-01-31
这么说吧,我设计的思路是需要T来得到我的mybatis的mapper来放在模板方法里调用
|
|
返回顶楼 | |
发表时间:2012-01-31
如果需要创建对象,Class就必须要
如果你要调用的api要Class,Class就必须要 否则Class要来干什?ArrayList有多少地方用了Class? 看不到你的实现,也就没法确定你是否真的需要那东西 |
|
返回顶楼 | |
发表时间:2012-01-31
gtssgtss 写道 如果需要创建对象,Class就必须要
如果你要调用的api要Class,Class就必须要 否则Class要来干什?ArrayList有多少地方用了Class? 看不到你的实现,也就没法确定你是否真的需要那东西 public class MybatisMapperTemplate { private static ThreadLocal<SqlSession> sessions = new ThreadLocal<SqlSession>(); private MybatisMapperTemplate() { } public static MybatisMapperTemplate getInstance() { return new MybatisMapperTemplate(); } /** * 调用mybatis进行查询的入口类的入口方法。所有查询都由该类的该方法发起 * * @Title: doInMybatisMapperCallBack * * @Description: 使用方法: * MybatisMapperTemplate.getInstance().executeQuery * * @param * @param <T> * @param * @param callback * @param * @param type * XXMapper.class * * @return void 返回类型 * @throws Exception * * @throws */ public <T> Object executeQuery(MybatisCallBack<T> callback, Class<T> type) throws Exception { /** * 查询结果集可能是List,可能是单条实体记录,所以不做泛型,统一用Object来接收和返回 */ Object obj = null; try { obj = callback.doInMybatis(this.mapper(type)); } catch (Exception e) { TracingHelper.errorLog(MybatisMapperTemplate.class, e.getMessage(), e); e.printStackTrace(); throw e; } finally { this.closeSession(); } return obj; } /** * 释放session,该方法不被外部调用。仅在模板方法内调用 * @Title: closeSession * @Description: TODO(这里用一句话描述这个方法的作用) * @param 设定文件 * @return void 返回类型 * @throws */ private void closeSession() { // TODO Auto-generated method stub SqlSession session = sessions.get(); TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession()", "session begin closing .."); if(session != null) { session.close(); TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession()", "session has already closed .."); } else{ TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession", "session is null .."); } } /** * 获取接口及XML的映射Mapper类,对外封闭 * @Title: mapper * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param <T> * @param @param type * @param @return 设定文件 * @return T 返回类型 * @throws */ private <T> T mapper(Class<T> type) { // TODO Auto-generated method stub TracingHelper.infoLog(MybatisMapperTemplate.class, "mapper()", "get mybatis mapper.."); return getMapper(type); } /** * 扩展Mybatis原生获取session的方法。对外封闭 * @Title: getMapper * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param <T> * @param @param type * @param @return 设定文件 * @return T 返回类型 * @throws */ private <T> T getMapper(Class<T> type) { SqlSessionFactory ssf = null ; SqlSession sqlSession = null ; try{ ssf = SessionFactory.getSqlSessionFactory(); sqlSession = ssf.openSession(); sessions.set(sqlSession); }catch(Exception e){ e.printStackTrace(); } return sqlSession.getMapper(type); } public interface MybatisCallBack<T> { public Object doInMybatis(T mapper); } 简而言之就是需要T来得到Mapper的具体类型 |
|
返回顶楼 | |
发表时间:2012-01-31
不支持呗。
TIJ的泛型一章有详细的解释。 |
|
返回顶楼 | |
发表时间:2012-01-31
最后修改:2012-01-31
既然是api要用Class的话,那自然需要咯
实在要取的话,看看这个 http://www.iteye.com/topic/585900 你会发现,你取得到的时候没必要,有必要的时候取不到-- |
|
返回顶楼 | |
发表时间:2012-01-31
不支持。Java 泛型的支持不是太好。
|
|
返回顶楼 | |