Mybatis Mapper动态代办署理
2018-07-06 10:01 [网络广告代理] 来源于:未知
事实上,mybatis供给了如许的做法,我们不消本身实现接口,只需要将接口的名字和mapper文件的namespace对应起来,将接口里面的方式名与sql语句标签的id对应起来,这就是mapper动态代办署理。 mapper动态代办署理的例子 起首主设置装备摆设文件(Mybatis.xml),在里面设置装备摆设数据库毗连信息,注册需要扫描的mapper文件: 界说数据库查询的接口,里面每地一个接口的名字很主要,需要和mapper里面每一条sql对应起来: 界说mapper文件(namespace要写我们界说的接口,而每条sql的id与我们的接口方式名字对应起来): 那我们在利用的时辰: 我们在前面还写到过一个selectStudentMap方式,可是里面挪用的是和SelectList一样的sql,在接口的实现类里面我们本身处置了一下,可是此刻利用主动实现的话,底层只会挪用SelectOne或者SelectList方式,所以这个方式会报错,若是接管类型是list,那么框架会主动利用selectList方式,不然就会选择selectOne()这个方式。 在这里我们利用的是返回的是map,所以主动选择返回selectO,ne()方式,那么就会报错。若是我们需要利用主动返回map的话,可以本身定一个map,或者返回list之后再处置。 mapper动态代办署理的道理 打一个断点在sqlSession.getMapper()方式上: 我们可以看到执行下面的接口方式(接口SqlSession的方式) <T> T getMapper(Class<T> var1); 这是一个接口,我们可以看到实现接口的有两个类,一个是DefaultSqlSession,一个是SqlSessionManager,我们需要看的是DefaultSqlSession下面的接口: public <T> T getMapper(Class<T> type) { return this.configuration.getMapper(type, this); } 我们知道,在建立sqlsession的时辰,confiiguration这个设置装备摆设对象已经建立完成。跟进去,这是利用mapper注册器对象的getMapper方式,将当前的sqlSession对象传递进去: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { return m就apperRegistry.getMapper(type, sqlSession); } 我们跟进去源码,可以发现里面利用knownMappers.get(type)来获取mapper代办署理工场,这个konwnMappers是一个hashMap,这个hashMap里面已经初始化了mapperProxyFactory对象了,获取到工场对象之后,再去利用sqlSession实例化: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); if (mapperProxyFactory == null) { throw new BindingException("Type " + type + " is not known to the MapperRegistry."); } try { return mapperProxyFactory.newInstance(sqlSession); } catch (Exception e) { throw new BindingException("Error getting mapper instance. Cause: " + e, e); } } 实例化的时辰,利用了mapper动态代办署理: public T newInstance(SqlSession sqlSession) { final MapperProxy<T>便; mapperProxy = new MapperProxy<T>(sqlSes就、sion, mapperInterface, methodCache); return newInstance(mapperProxy); }protected T newInstance(MapperProxy<T> mapperProxy) { return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy); } 从下面的debug成果中我们可以看到,这是动态代办署理的成果: 好了,具体内容已经介绍完毕,喜好的宝宝可以点击存眷,更多出色内容存眷尚书院哟! (以下为广告:) |
相关内容