http://www.iteye.com/topic/393042最近做了很多动态的查询,尤其是排序,以及一些状态字段,所以就做了一个总的动态查询,以不变应万变,呵呵

ibatis 里面的sql代码:

Xml代码
        <select id="getTopics" resultClass="topic" parameterClass="map">
                        <![CDATA[
                                select * from p_Topic
                        ]]>
                <dynamic prepend=" WHERE ">
                        <isPropertyAvailable property="authorId">
                                <isNotNull property="authorId" prepend=" and ">
                                        authorId=#authorId#
                </isNotNull>
                        </isPropertyAvailable>
                        <isPropertyAvailable property="marketId">
                                <isNotNull property="marketId" prepend=" and ">
                                        marketId=#marketId#
                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="isDelete">
                                <isNotNull property="isDelete" prepend=" and ">
                                        isDelete=#isDelete#
                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="isBest">
                                <isNotNull property="isBest" prepend=" and ">
                                        isBest=#isBest#
                                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="statusStr">
                                <isNotNull property="statusStr" prepend=" and ">
                                        $statusStr$
                                </isNotNull>
                        </isPropertyAvailable>
                        <isPropertyAvailable property="marketIdList">
                                <isNotNull property="marketIdList" prepend=" and marketId in ">
                                        <iterate property="marketIdList" conjunction="," close=")" open="(">
                                                #marketIdList[]#
                                        </iterate>
                                </isNotNull>
                        </isPropertyAvailable>
                </dynamic>

<dynamic prepend=" order by ">
                        <isPropertyAvailable property="orderStr">
                                <isNotNull property="orderStr">
                                        $orderStr$
                </isNotNull>
                        </isPropertyAvailable>
                </dynamic>

<dynamic>
                        <isPropertyAvailable property="begin">
                                <isNotNull property="begin">
                                        limit #begin#
                </isNotNull>
                        </isPropertyAvailable>
                        <isPropertyAvailable property="max" prepend=" , ">
                                <isNotNull property="max">
                                        #max#
                </isNotNull>
                        </isPropertyAvailable>
                </dynamic>
        </select>

<select id="getTopicCount" resultClass="java.lang.Long"
                parameterClass="map">
                        <![CDATA[
                                select count(id) from p_Topic
                        ]]>
                <dynamic prepend=" WHERE ">
                        <isPropertyAvailable property="authorId">
                                <isNotNull property="authorId" prepend=" and ">
                                        authorId=#authorId#
                </isNotNull>
                        </isPropertyAvailable>
                        <isPropertyAvailable property="marketId">
                                <isNotNull property="marketId" prepend=" and ">
                                        marketId=#marketId#
                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="isDelete">
                                <isNotNull property="isDelete" prepend=" and ">
                                        isDelete=#isDelete#
                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="isBest">
                                <isNotNull property="isBest" prepend=" and ">
                                        isBest=#isBest#
                                </isNotNull>
                        </isPropertyAvailable>

<isPropertyAvailable property="statusStr">
                                <isNotNull property="statusStr" prepend=" and ">
                                        $statusStr$
                                </isNotNull>
                        </isPropertyAvailable>
                        <isPropertyAvailable property="marketIdList">
                                <isNotNull property="marketIdList" prepend=" and ">
                                        <iterate property="marketIdList" conjunction="," close=")" open=" marketId in (">

 
                                                #marketIdList[]#
                                        </iterate>
                                </isNotNull>
                        </isPropertyAvailable>
                </dynamic>
        </select>

这里需要注意的是:

①#xxx#  代表xxx是属性值,map里面的key或者是你的pojo对象里面的属性,ibatis会自动在它的外面加上引号,表现在sql语句是这样的 where xxx = 'xxx' ;

而$xxxx$ 则是把xxxx作为字符串拼接到你的sql语句中,比如 order by  topicId , 如果你不用$来拼接而用#的话,外面就会被加上引号的哦    比如你的语句这样写  ... order by #xxx# (xxx就是你传进来的字符串topicId),ibatis 就会把他翻译成  order by 'topicId' 这样就报错了 ,用$的结果就是这样  order by topicId

②这里的iterate

Java代码
 
         <isPropertyAvailable property="marketIdList">  
            <isNotNull property="marketIdList" prepend="and">  
                <iterate property="marketIdList" conjunction="," open=" marketId in (" close=")">  
                    #marketIdList[]#  
                </iterate>  
            </isNotNull>  
        </isPropertyAvailable>
 
 
注意 iterate 的property属性 ,虽然你上面的isNotNull什么的都有这句,但这里一定要写清楚,否则ibatis会找不到你的list的
 
数据访问层代码:
 
Java代码
               public List<Topic> getTopics(Map<String, Object> map) {

return getSqlMapClientTemplate().queryForList("getTopics", map);
        }

 
 
 服务层代码:
 
Java代码
        public List<Topic> getTopicsByMarketIdList(Long authorId,List<Long> marketIdList,
                        Integer orderby, Integer status, Pagination pagination) {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("authorId", authorId);
                map.put("isDelete", false);
                map.put("marketIdList", marketIdList);
                map.put("orderStr", "这里你组装你的order字符串");
                map.put("statusStr","这里你组装你的status字符串");
                map.put("begin", pagination.getOffset());
                map.put("max", pagination.getPageSize());
               //这个getTopicCount()方法和getTopics()大体是一致的,所以我的dao里面省略了它
                Long total = topicDao.getTopicCount(map);
                if (total == 0) {
                        return new ArrayList<Topic>();
                } else {
                        pagination.setTotal(total);
                        List<Topic> res = topicDao.getTopics(map);
                        return res;
                }
        }
 
Java代码
 
public class Topic extends BaseObject implements Serializable {
        /**
         *
         */
        private static final long serialVersionUID = -851973667810710701L;

private Long id;
        private Long authorId;
        private String authorName;
        private Long marketId;
        private String title;
        private String tags;
        private String content;
        private Date pubdate;
        private Integer isBest;
        private Integer status;
        private Integer isDelete;
        private Integer clickCount;
        private Integer replyCount;
        private Date lastReplyTime;
       //getter and setter 省略...
}

 
Pagination代码:
 
Java代码
public class Pagination {

/**
         * 要查看的页码
         */
        private int page;

/**
         * 每页显示数
         */
        private int pageSize;

/**
         * 一共有多少页
         */
        private int totalPage;

/**
         * 一共有多少条记录
         */
        private long total;

/**
         * 当前页的记录数
         */
        private int size;

/**
         * 只需要topxx,不需要页数信息了
         */
        private boolean topOnly;

/**
       *从第几条记录开始        
       */
        private int offset;
        
        public void setOffset(int offset) {
                this.offset = offset;
        }

public Pagination(int page, int pageSize) {
                this.page = page;
                this.pageSize = pageSize;
        }

public Pagination() {
        }

public boolean require() {
                return pageSize > 0 ? true : false;
        }

public int from() {
                return page * pageSize;
        }

public int to() {
                return from() + size;
        }

public int getPage() {
                return page;
        }

public void setPage(int page) {
                this.page = page;
        }

public int getPageSize() {
                return pageSize;
        }

public void setPageSize(int pageSize) {
                this.pageSize = pageSize;
        }

public int getTotalPage() {
                return totalPage;
        }

public void setTotalPage(int totalPage) {
                this.totalPage = totalPage;
        }

public long getTotal() {
                return total;
        }

public void setTotal(long total) {
                this.total = total;
                if (pageSize > 0) {
                        this.totalPage = (int) Math.ceil(total / (double) pageSize);
                } else {
                        this.totalPage = 1;
                }
                if (page >= totalPage) {
                        page = totalPage - 1;
                }
                if (page < 0)
                        page = 0;
                if (pageSize > 0) {
                        if (page < totalPage - 1)
                                this.size = pageSize;
                        else
                                this.size = (int) (total % pageSize);
                } else {
                        this.size = (int) total;
                }
                offset=page * pageSize;
        }

public int getOffset() {
                return offset;
        }

public int getSize() {
                return size;
        }

public void setSize(int size) {
                this.size = size;
        }

public boolean isTopOnly() {
                return topOnly;
        }

public void setTopOnly(boolean topOnly) {
                this.topOnly = topOnly;
        }

}

ibatis 动态查询的更多相关文章

  1. ibatis动态查询条件

    ibatis的调试相对困难,出错的时候主要依据是log4生成的log文件和出错提示,这方面要能比较熟练的看懂. 下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回has ...

  2. ibatis动态查询

    在复杂查询过程中,我们常常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL 中的参数,包括Select 语句中所包括的字段和限定条件,都可能发生变化.典型情况,如在一个复杂的组合查询页面, ...

  3. ibatis动态多条件查询及模糊查询(oracle,mysql,sql)

    首先是模糊查询的问题,开始时我使用如下条件:select * from user where name like '%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是 ...

  4. Ibatis动态(dynamic)查询

     Ibatis的动态查询使得数据操作变得非常的灵活,下次举出了常用的动态查询的属性信息: Ibatis配置信息 <!-- Dynamic Sql --> <typeAlias a ...

  5. ibatis Dynamic总结(ibatis使用安全的拼接语句,动态查询)

    ibatis中使用安全的拼接语句,动态查询,ibatis比JDBC的优势之一,安全高效 说明文字在注释中 一.引入 一个小例子  <select id="selectAllProduc ...

  6. ibatis 取消查询动态列的缓存

    ibatis在查询结果列不确定(或是动态变化)的情况下,会因为列缓存的原因导致变化后的列数据查不出来 解决方法是: select标签有个属性remapResults,该属性默认值为false,设置成r ...

  7. 转:ibatis动态sql

    转:ibatis动态sql 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的 IF-ELSE条件语句和一连串 ...

  8. Ibatis动态拼装sql,常用标签总结及举栗子。

    今天得到项目经理一项任务,就是拼装sql,第一次见到,不是太懂,赶紧回来睡一觉再说,由于这次的项目orm使用的是ibatis框架,所以需要使用动态拼装sql,或者是ognl语言,这门语言不是专属于ib ...

  9. IBATIS动态SQL(1)

    转:IBATIS动态SQL 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的 ...

随机推荐

  1. tensorflow-gpu 使用的常见错误

    这篇博客会不定期整理我在 tensorflow 中出现的问题和坑. 1. CUDA_ERROR_OUT_OF_MEMORY: tensorflow 在执行过程中会默认使用全部的 GPU 内存,给系统保 ...

  2. Ubuntu开机启动的方式

    方法一:--------------------------------------------------1. 在/etc/init.d/下放置启动脚本,比如postgresqlroot@ubunt ...

  3. 谜题27:变幻莫测的i值

    与谜题26中的程序一样,下面的程序也包含了一个记录在终止前有多少次迭代的循环.与那个程序不同的是,这个程序使用的是左移操作符(<<).你的任务照旧是要指出这个程序将打印什么.当你阅读这个程 ...

  4. 【KM】POJ2195/HDU1533-Going home

    //最近没什么时间quq据说长得帅的人都在切八中,然而长得丑的人只能水水裸题 [题目大意] 给出一张地图及人和房屋的位置,求出每个人回到不同房屋所具有的最小代价和. [思路] 最小权匹配,先O(n^2 ...

  5. yii2.0权限控制 ACF权限

    ACF是一种通过yii\filters\AccessControl类来实现的简单授权 有两种角色 ?:未经认证的游客用户 @:已认证的用户 ACF可同过对角色设置权限控制访问 1)记得引入yii\fi ...

  6. [转]从此爱上iOS Autolayout

    原文地址 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程.这篇文章两个月前就想写下来,但 ...

  7. Android 架构 1.架构

    项目分为了四个层级:模型层.接口层.核心层.界面层.模型层定义了所有的模型:接口层封装了服务器提供的API:核心层处理所有业务逻辑:界面层就处理界面的展示.几个层级之间的关系如下图所示: 层级关系:模 ...

  8. CMD_命令行

    一.bat执行一闪而过 最后一个end下一行,加PAUSE   二.cmd命令:不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 需将路径先切换到system32下  cd c:\WINDO ...

  9. elasticsearch term 查询二:Range Query

    Range Query 将文档与具有一定范围内字词的字段进行匹配. Lucene查询的类型取决于字段类型,对于字符串字段,TermRangeQuery,对于数字/日期字段,查询是NumericRang ...

  10. Python数据整合与数据准备-BigGorilla实例应用

    参考文档:http://www.biggorilla.org/walkt/ 一.BigGorilla应用主要步骤 如下图: 二.实例应用 1.数据获取 urllib是非常受欢迎的用于在网络上读取数据的 ...