在網(wǎng)上找過了,只能生成實體類,mapper接口,xml,請問怎么生成接口方法的實現(xiàn),還是說沒有這個功能?
mybatis的mapper是通過動態(tài)代理來實現(xiàn)的。
關(guān)于動態(tài)代理的API文檔:https://docs.oracle.com/javas...
動態(tài)代理類顧名思義即是JVM在運(yùn)行時動態(tài)產(chǎn)生的一個新類,具體可以查閱相關(guān)文檔。
mybatis中由MapperProxyFactory產(chǎn)生mapper類和實例:
public class MapperProxyFactory<T> {
private final Class<T> mapperInterface;
private final Map<Method, MapperMethod> methodCache = new ConcurrentHashMap<Method, MapperMethod>();
public MapperProxyFactory(Class<T> mapperInterface) {
this.mapperInterface = mapperInterface;
}
public Class<T> getMapperInterface() {
return mapperInterface;
}
public Map<Method, MapperMethod> getMethodCache() {
return methodCache;
}
@SuppressWarnings("unchecked")
protected T newInstance(MapperProxy<T> mapperProxy) {
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
}
}
MapperProxy實現(xiàn)InvocationHandler了(此處mapperProxy并非提問所說的mapper接口的代理類,真正的代理類和實例是在MapperProxyFactory中產(chǎn)生的):
class MapperProxy implements InvocationHandler, Serializable {
...
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);
} else if (isDefaultMethod(method)) {
return invokeDefaultMethod(proxy, method, args);
}
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
final MapperMethod mapperMethod = cachedMapperMethod(method);
return mapperMethod.execute(sqlSession, args);
}
...
}
具體的執(zhí)行是在這里:
final MapperMethod mapperMethod = cachedMapperMethod(method);
mapperMethod.execute(sqlSession, args);
有session和映射的sql語句,即可完成執(zhí)行一個語句的動作。
詳細(xì)可以看這篇blog: Mybais之mapperproxy
關(guān)于動態(tài)代理延伸閱讀:
Java 動態(tài)代理機(jī)制分析及擴(kuò)展,第 1 部分
Java 動態(tài)代理機(jī)制分析及擴(kuò)展,第 2 部分
在generatorConfig.xml中設(shè)置了通用Mapper(或者自定義的Mapper繼承了此通用Mapper)
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
</plugin>
mybatis-generator自動生成的Mapper會自動繼承在這里設(shè)置的Mapper,tk.mybatis.mapper.common.Mapper包含了所有基本的單表的CRUD的實現(xiàn),可以直接調(diào)用無需自己寫接口實現(xiàn),當(dāng)需要繼續(xù)多表操作的時候,可以自己在接口中加方法并實現(xiàn)和普通的mybatis一樣的用法。
生產(chǎn)的mapper接口有繼承tk.mybatis.mapper.common.Mapper,常用操作都已經(jīng)有了,不需要在xml中寫實現(xiàn)。
可以參考:http://blog.csdn.net/isea533/...
還有:https://github.com/abel533/My...
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。