为什么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]
<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]
相关文章推荐
- Mybatis中通过HaseMap封装参数作为查询条件
- 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了
- 为什么带约束条件的极值计算可以通过引入拉格朗日算子解决
- cassandra——可以预料的查询,如果你的查询条件有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现
- hibernate 通过Restrictions设置中文查询条件,不执行无结果集的问题
- oracle的varchar2(4000)通过jdbc的thin驱动连接为什么只可以存666个汉字 .
- mybatis if条件查询 及<号的问题
- mybatis一对多查询(多个条件查询多值)
- mybatis中数组空值查询条件
- 通过经纬度计算距离,可以用来得到周边500米内的商家。mybatis中的Sql语句实现
- 通过Ajax+jquery实现的动态增加一组查询条件的实例
- 页面加载完成后通过查询条件给easyui datagrid赋值,请求两次,并且值不显示问题
- mybatis in条件查询(foreach)
- MyBatis:复合条件查询——对象封装成List类型
- mybatis中文条件查询时,不返回值
- 通过域名可以查询绑定在该主机域名的数量
- Questions:连接两个表进行查询:可以输入或不输入查询条件的sql 语句
- sql连表查询where后面的条件是否可以加在on后面
- Mybatis通过拦截器实现分页查询
- 多条件的查询,查询条件可以为空