Ibatis動態調査例(〹と米ドル及びiterateなどの使い方)


最近はたくさんのダイナミックなクエリをしました。特に並べ替え、いくつかのステータスフィールドもあります。だから、全体的な動的なクエリをしました。
 
ibatisの中のsqlコード:
	<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'です。
   それに対して、xxを文字列としてsql文につづり合わせます。order byなどです。  topicIdさん、ドルでつづり合わせなくても大丈夫ですよ。外にカギカッコが付けられますよ。    例えばあなたの言葉はこう書きます。  ... order by菗xxx29858;(xxxはあなたが伝えた文字列topicId)は、ibatisが彼を翻訳してくれます。  order by'topicId'はこれで間違えました。$を使った結果はこのようになります。  order by topicId
②ここのiterate
<isPropertyAvailable property="marketIdList">
	<isNotNull property="marketIdList" prepend=" and marketId in ">
		<iterate property="marketIdList" conjunction="," close=")" open="(">
			#marketIdList[]#
		</iterate>
	</isNotNull>
</isPropertyAvailable>
 iterateのproperty属性に注意してください。上のisNotNullなどは全部この文がありますが、ここで必ずはっきり書いてください。そうしないとibatisはあなたのlistを見つけられません。
 
 
データアクセス層コード:
public List<Topic> getTopics(Map<String, Object> map) {

		return getSqlMapClientTemplate().queryForList("getTopics", map);
	}
 サービス層コード:
	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;
		}
	}
 
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コード:
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;
	}

}