一、mybatis 表達式簡介
對於mybatis3 ,提供了一種動態sql的方式。通過動態sql我們可以直接在mybatis 的xm映射文件中直接通過條件判斷的方式進行查詢添加的拼接。mybatis 項目地址為 http://github.com/mybatis/mybatis-3 。mybatis 3 提供如下條件判斷:
- if
- choose (when, otherwise)
- foreach
if語句如下:
<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> </select>
choose語句如下:
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
foreach語句如下
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
二、相關技巧
對於變量可以使用#{param} 方式進行拼接。mybatis 也支持${param} 的方式。這兩種方式的區別如下:
#{param} 表示讀取param參數的值,並將該值做字段的的值進行比較;
${param} 表示讀取param的值,並將param值當成數據庫表中的某個字段。
在數據量大的時候,我們會使用維度表。將統計結果定期統計到維度表,展示的時候,直接讀取維度表的數據。
維度表結構如下:
DROP TABLE IF EXISTS `wd`; CREATE TABLE `wd` ( `id` varchar(64) NOT NULL, `xl` varchar(2) NOT NULL, `xzqh` varchar(2) NOT NULL, `nld` varchar(2) NOT NULL, `total` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
統計的時候,需要根據xl(學歷),xzqh(行政區划),nld(年齡段)進行分組查詢。sql如下:
select ${param}, sum(total) from wd group by ${param}
parm 傳的值可以是 “xl”、“xzqh”,“nld” 這樣通過一個sql就可完成這個功能。只需要傳遞不同的參數,從而完成對不同字段的分組統計。這中凡是在使用圖表的時候進行分組統計,可以用的到。