Mybatis从Mapper实例获取Sqlsession对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rocklee/article/details/88762361

      在一个事务中, 若想利用mapper实例同一个sqlsession来同时做其他事, 因为mapper字面的定义为interface,没有任何其他可用属性, 但在运行过程中发现其实这个mapper实例已经被动态代理实例化了, 具体可参考这位大神的分析: https://www.bbsmax.com/A/nAJvPBw3dr/

      因为mapper实例的真实处理代理类是MapperProxy, 所以就写了一个function直接从MapperProxy中取得private final属性的sqlsession, 用了反映功能.

/***
	 * 从Mapper实例获取Sqlsession对象
	 * @param pvMapper 
	 * @return
	 */
	private static SqlSession getSqlSessionFromMapperInstance(Object pvMapper) {
		if (!Proxy.isProxyClass(pvMapper.getClass()))return null;
		InvocationHandler lvInvHandler=Proxy.getInvocationHandler(pvMapper);
		if (!(lvInvHandler instanceof MapperProxy)) return null;
		MapperProxy lvT= (MapperProxy)lvInvHandler ;
		try {
			Field lvSessField=lvT.getClass().getDeclaredField("sqlSession");
			lvSessField.setAccessible(true);
			try {
				return (SqlSession) lvSessField.get(lvT);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (NoSuchFieldException | SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

猜你喜欢

转载自blog.csdn.net/rocklee/article/details/88762361
今日推荐