您的位置:首页 > 其它

为什么Mybatis可以通过SO加入查询条件

2013-09-25 19:45 417 查看
1、比如我们在SignInfoMapper.xml中,
<sql id= "SO_Where_Clause">
[align=left] <where>[/align]
[align=left] 1=1[/align]
[align=left] <if test="@org.apache.commons.lang.StringUtils@isNotBlank(province)" >[/align]
[align=left] and t.PROVINCE=#{province}[/align]
[align=left] </if>[/align]
[align=left] <if test="@org.apache.commons.lang.StringUtils@isNotBlank(city)" >[/align]
[align=left] and t.CITY=#{city}[/align]
[align=left] </if>[/align]
[align=left] <if test="@org.apache.commons.lang.StringUtils@isNotBlank(county)" >[/align]
[align=left] and t.COUNTY=#{county}[/align]
[align=left] </if>[/align]
<if test="isSearched
!= -1" >
[align=left] and NVL(t.IS_SEARCHED,0) = #{isSearched}[/align]
[align=left] </if>[/align]
[align=left] <if test="reqTimeFrom!=null" >[/align]
[align=left] and t.REQ_TIME <![CDATA[ >= ]]> #{reqTimeFrom}[/align]
[align=left] </if>[/align]
[align=left] <if test="reqTimeTo!=null" >[/align]
[align=left] and t.REQ_TIME <![CDATA[ <= ]]> #{reqTimeTo}+1[/align]
[align=left] </if>[/align]
[align=left] </where>[/align]
[align=left] <include refid="sqlmap.common.Order_By_Clause" />[/align]
[align=left] </sql>[/align]

[align=left] 然后<select id= "getListBySo" resultMap ="signInfoVoResultMap">[/align]
[align=left] SELECT t.* FROM ASS_SIGN_INFO t[/align]
[align=left] <include refid="SO_Where_Clause" />[/align]
[align=left] </select>[/align]
[align=left] 然后:[/align]
[align=left] @Override[/align]
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);
[align=left] }[/align]
[align=left] 这样就可以实现动态的查询了呢?Mybatis是如何将这个动态的参数拼接到SQL上的呢?[/align]

[align=left]2、我们通过调试查看该方法的执行过程,如下所示:[/align]
[align=left] 2.1、[/align]
[align=left] @Test[/align]
public void testGetPageList()
{
[align=left] ReqLogSO sos = new ReqLogSO();[/align]
[align=left] sos.setCity( "上海市");[/align]
[align=left] sos.setProvince( "上海");[/align]
[align=left] List<ReqLogVO> list = reqLogService.getVOListBySo(sos);[/align]
[align=left] assertTrue(list.size() > 0);[/align]
[align=left] }[/align]
[align=left] 2.2、reqLogService .getVOListBySo(sos);调用:[/align]

[align=left] [/align]
@Override
public <E>
List<E> getVOListBySo(BasePageSO so) {

[align=left] RowBounds rowBounds =[/align]
new RowBounds((so.getPageNumber() - 1) *so.getObjectsPerPage(),
so.getObjectsPerPage());

[align=left] [/align]
return sqlSessionTemplate.selectList(getStatementPrefix()
+ POSTFIX_GET_LIST_BY_SO, so, rowBounds);


[align=left] }[/align]
[align=left] 2.3、上述下划线的方法调用,SqlSessionTemplate.class中的:[/align]

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 {

[align=left] MappedStatement ms =configuration.getMappedStatement(statement);[/align]

[align=left] List<E> result =[/align]
executor.<E>query(ms,
wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER );


[align=left] [/align]
return result;

[align=left] }[/align]
catch (Exception e) {

[align=left] ...[/align]

[align=left] }[/align]

2.5、executor.<E>query()方法接着调用CachingExecutor的方法:

public <E>
List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException
{
[align=left] BoundSql boundSql = ms.getBoundSql(parameterObject);[/align]
[align=left] CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);[/align]
return query(ms,
parameterObject, rowBounds, resultHandler, key, boundSql);

[align=left] }[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐