本文主要目的是为mybatis的 include 标签添加扩展属性
当使用mybatis进行单表查询时 可以方便的使用
ID, WORKER_ID, WORKER_NAME,
WORKER_MAIN_NUM, WORKER_EXT_NUM, SALE_PHONE,
IS_PART_TIME, LAST_LOGIN_TIME, SIGN,
HEAD_PIC,WEI_XIN, WX_EWM,
WEIBO, PRACTIC_CERT, WORK_YEAR,
SERVICE_JSON, SERVICE_AREA, PRAISE_COUNT,
SHOP_VIEW_COUNT, CITY_CODE, AREA_CODE,
AREA_NAME, PLACE_CODE, PLACE_NAME,
SORT_SCORE, VOCAT_SKILL, FEATURES,
LEAD_REPUTABLY, STATUS, VERSION,
INSERT_TIME, UPDATE_TIME, BUSINESS_TYPE,
MANIFESTO, BACKGROUND_IMAGE, TITLE_ID
SELECT
A.ID, A.WORKER_ID, A.WORKER_NAME,.....经纪人表的其他字段
B. LEVEL, --经纪人等级
B.SUBJECTS_NUM, --完成科目数
B.LOOK_NUM, --带看数
B.DEAL_NUM --成交数
FROM AGENT_INFO A
LEFT JOIN AGENT_TITLE_INFO B ON A.TITLE_ID=B.ID
WHERE A.ID = #{ID}
下面来看一下我的一个扩展方案 ,因为我们的sql是要查询 经纪人信息,还有经纪人详情的几个字段 ,分别是 AGEN_INFO 表和 AGENT_TITLE_INFO表,看一下做了扩展的配置文件,其实这也是整篇文章唯一想要实现的效果
注:另一个 include标签是另一个mapper文件定义的,mybatis支持 引用其他文件的 sql节点
主要做了扩展的地方有两个
1、为
2、为
结果:我们的 sql 包含的字段是 agent_info表的全部字段 + ( AGENT_TITLE_INFO 表全部字段 - excludeCols中定义的字段 )
level 和 lookNum 是 经纪人详情中的字段,这样就查出来了,同时被排除的 insert_time和update_time就没有查询
实现方法分析
这个改动主要是对源码码的修改是很少的,就只在myabtis启动加载 解析mapper文件时将自己需要的特性添加进去 , 要修改的类是 XMLIncludeTransformer 的 applyInclude方法
mybatis在解析sql时将 include 解析完成 会替换掉 原来的 include 节点
代码的处理部分很简单,就是将 sql节点中的 sql语句加上 prefix,然后将整个 字符串 设置到 DOM节点中 ,这样扩展就完成了, 对了,还有一个地方要改,那就是要对 mybatis的DTD文件做一个小改动,因为启动时会用DTD对mapper的xml进行验证