1、比如我们在SignInfoMapper.xml中,
<
sql
id
=
"SO_Where_Clause"
>
<
where
>
1=1
<
if
test
=
"@org.apache.commons.lang.StringUtils@isNotBlank(province)"
>
and t.PROVINCE=#{province}
</
if
>
<
if
test
=
"@org.apache.commons.lang.StringUtils@isNotBlank(city)"
>
and t.CITY=#{city}
</
if
>
<
if
test
=
"@org.apache.commons.lang.StringUtils@isNotBlank(county)"
>
and t.COUNTY=#{county}
</
if
>
<
if
test
=
"isSearched != -1"
>
and NVL(t.IS_SEARCHED,0) = #{isSearched}
</
if
>
<
if
test
=
"reqTimeFrom!=null"
>
and t.REQ_TIME
<![CDATA[
>=
]]>
#{reqTimeFrom}
</
if
>
<
if
test
=
"reqTimeTo!=null"
>
and t.REQ_TIME
<![CDATA[
<=
]]>
#{reqTimeTo}+1
</
if
>
</
where
>
<
include
refid
=
"sqlmap.common.Order_By_Clause"
/>
</
sql
>
然后
<
select
id
=
"getListBySo"
resultMap
=
"signInfoVoResultMap"
>
SELECT t.* FROM ASS_SIGN_INFO t
<
include
refid
=
"SO_Where_Clause"
/>
</
select
>
然后:
@Override
public
<E> List<E> getVOListBySo(BasePageSO so) {
RowBounds rowBounds =
new
RowBounds((so.getPageNumber() - 1) *so.getObjectsPerPage(), so.getObjectsPerPage());
return
sqlSessionTemplate
.selectList(getStatementPrefix() +
POSTFIX_GET_LIST_BY_SO
, so, rowBounds);
}
这样就可以实现动态的查询了呢?Mybatis是如何将这个动态的参数拼接到SQL上的呢?
2、我们通过调试查看该方法的执行过程,如下所示:
2.1、
@Test
public
void
testGetPageList() {
ReqLogSO sos =
new
ReqLogSO();
sos.setCity(
"上海市"
);
sos.setProvince(
"上海"
);
List<ReqLogVO> list =
reqLogService
.getVOListBySo(sos);
assertTrue(list.size() > 0);
}
2.2、
reqLogService
.getVOListBySo(sos);调用:
@Overridepublic <E> List<E> getVOListBySo(BasePageSO so) {RowBounds rowBounds =new RowBounds((so.getPageNumber() - 1) *so.getObjectsPerPage(), so.getObjectsPerPage());return sqlSessionTemplate.selectList(getStatementPrefix() + POSTFIX_GET_LIST_BY_SO, so, rowBounds);
}
2.3、上述下划线的方法调用,
SqlSessionTemplate.class中的:
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {return this . sqlSessionProxy .<E> selectList(statement, parameter, rowBounds);}2.4、接着调用DefaultSqlSession.class中的:
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {try {MappedStatement ms = configuration .getMappedStatement(statement);List<E> result =executor.<E>query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER );return result;}catch (Exception e) {...2.5、executor.<E>query()方法接着调用 CachingExecutor的方法:}
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {BoundSql boundSql = ms.getBoundSql(parameterObject);CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}