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);}