设为首页 - 加入收藏 bjscsh.com   bjscsh.com  
热搜: 网络广告代理
当前位置: 主页 > 网络广告代理 >

Mybatis Mapper动态代办署理

2018-07-06 10:01 [网络广告代理] 来源于:未知
事实上,mybatis供给了如许的做法,我们不消本身实现接口,只需要将接口的名字和mapper文件的namespace对应起来,将接口里面的方式名与sql语句标签的id对应起来,这就是mapper动态代办署理。

mapper动态代办署理的例子

起首主设置装备摆设文件(Mybatis.xml),在里面设置装备摆设数据库毗连信息,注册需要扫描的mapper文件:

Mybatis Mapper动态代理


界说数据库查询的接口,里面每地一个接口的名字很主要,需要和mapper里面每一条sql对应起来:

Mybatis Mapper动态代理


界说mapper文件(namespace要写我们界说的接口,而每条sql的id与我们的接口方式名字对应起来):

Mybatis Mapper动态代理


那我们在利用的时辰:

Mybatis Mapper动态代理


我们在前面还写到过一个selectStudentMap方式,可是里面挪用的是和SelectList一样的sql,在接口的实现类里面我们本身处置了一下,可是此刻利用主动实现的话,底层只会挪用SelectOne或者SelectList方式,所以这个方式会报错,若是接管类型是list,那么框架会主动利用selectList方式,不然就会选择selectOne()这个方式。

在这里我们利用的是返回的是map,所以主动选择返回selectO,ne()方式,那么就会报错。若是我们需要利用主动返回map的话,可以本身定一个map,或者返回list之后再处置。

mapper动态代办署理的道理

打一个断点在sqlSession.getMapper()方式上:

Mybatis Mapper动态代理


我们可以看到执行下面的接口方式(接口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成果中我们可以看到,这是动态代办署理的成果:

Mybatis Mapper动态代理


好了,具体内容已经介绍完毕,喜好的宝宝可以点击存眷,更多出色内容存眷尚书院哟!

Mybatis Mapper动态代理

(以下为广告:)

推荐文章
jQuery(".g-box8").slide({ titCell:"li",triggerTime:0 });