-->
<sql id="sql_count"> select count(*)
</sql> <sql id="sql_select"> select *
</sql> <sql id="sql_where"> from icp
<dynamic prepend="where"> <isNotEmpty prepend="and" property="name"> name like ‘%$name$%‘
</isNotEmpty> <isNotEmpty prepend="and" property="path"> path like ‘%path$%‘
</isNotEmpty> <isNotEmpty prepend="and" property="area_id"> area_id = #area_id#
</isNotEmpty> <isNotEmpty prepend="and" property="hided"> hided = #hided#
</isNotEmpty> </dynamic> <dynamic prepend=""
> <isNotNull property="_start"> <isNotNull property="_size"> limit #_start#, #_size#
</isNotNull> </isNotNull> </dynamic> </sql> <select id="findByParamsForCount" parameterClass="map" resultClass="int"> <include refid="sql_count"/> <include refid="sql_where"/> </select> <select id="findByParams" parameterClass="map" resultMap="icp.result_base"> <include refid="sql_select"/> <include refid="sql_where"/> </select>
2、数字范围查询
所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
<isNotEmpty prepend="and" property="_img_size_ge"> <![CDATA[
img_size >= #_img_size_ge#
]]>
</isNotEmpty> <isNotEmpty prepend="and" property="_img_size_lt"> <![CDATA[
img_size
< #_img_size_lt#
]]
> </isNotEmpty>
多次使用一个参数也是允许的
<isNotEmpty prepend="and" property="_now"> <![CDATA[
execplantime >= #_now#
]]>
</isNotEmpty> <isNotEmpty prepend="and" property="_now"> <![CDATA[
closeplantime
<= #_now#
]]
> </isNotEmpty>
3、时间范围查询
<isNotEmpty prepend="" property="_starttime"
> <isNotEmpty prepend="and" property="_endtime"> <![CDATA[
createtime >= #_starttime#
and createtime
< #_endtime#
]]
> </isNotEmpty> </isNotEmpty>
4、in查询
<isNotEmpty prepend="and" property="_in_state"> state in (‘$_in_state$‘)
</isNotEmpty>
5、like查询
<isNotEmpty prepend="and" property="chnameone"> (chnameone like ‘%$chnameone$%‘ or spellinitial like ‘%$chnameone$%‘)
</isNotEmpty> <isNotEmpty prepend="and" property="chnametwo"> chnametwo like ‘%$chnametwo$%‘
</isNotEmpty>
6、or条件
<isEqual prepend="and" property="_exeable" compareValue="N"> <![CDATA[
(t.finished=‘11‘ or t.failure=3)
]]>
</isEqual>
<isEqual prepend="and" property="_exeable" compareValue="Y"> <![CDATA[
t.finished in (‘10‘,‘19‘) and t.failure
<3 ]]
> </isEqual>
7、where子查询
<isNotEmpty prepend="" property="exprogramcode"
> <isNotEmpty prepend="" property="isRational"
> <isEqual prepend="and" property="isRational" compareValue="N"> code not in
(select t.contentcode
from cms_ccm_programcontent t
where t.contenttype=‘MZNRLX_MA‘
and t.programcode = #exprogramcode#)
</isEqual> </isNotEmpty> </isNotEmpty>
<select id="findByProgramcode" parameterClass="string" resultMap="cms_ccm_material.result"> select *
from cms_ccm_material
where code in
(select t.contentcode
from cms_ccm_programcontent t
where t.contenttype = ‘MZNRLX_MA‘
and programcode = #value#)
order by updatetime desc
</select>
9、函数的使用
<!--
添加 -->
<insert id="insert" parameterClass="RuleMaster"> insert into rulemaster(
name,
createtime,
updatetime,
remark
) values (
#name#,
now(),
now(),
#remark#
)
<selectKey keyProperty="id" resultClass="long"> select LAST_INSERT_ID()
</selectKey> </insert> <!--
更新 -->
<update id="update" parameterClass="RuleMaster"> update rulemaster set
name = #name#,
updatetime = now(),
remark = #remark#
where id = #id#
</update>
10、map结果集
<!-- 动态条件分页查询 --> <sql id="sql_count"> select count(a.*) </sql> <sql id="sql_select"> select a.id vid, a.img imgurl, a.img_s imgfile, b.vfilename vfilename, b.name name, c.id sid, c.url url, c.filename filename, c.status status </sql> <sql id="sql_where"> From secfiles c, juji b, videoinfo a where a.id = b. videoid and b.id = c.segmentid and c.status = 0 order by a.id asc,b.id asc,c.sortnum asc <dynamic prepend=""> <isNotNull property="_start"> <isNotNull property="_size"> limit #_start#, #_size# </isNotNull> </isNotNull> </dynamic> </sql> <!-- 返回没有下载的记录总数 --> <select id="getUndownFilesForCount" parameterClass="map" resultClass="int"> <include refid="sql_count"/> <include refid="sql_where"/> </select> <!-- 返回没有下载的记录 --> <select id="getUndownFiles" parameterClass="map" resultClass="java.util.HashMap"> <include refid="sql_select"/> <include refid="sql_where"/> </select>
11、trim
trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。
where例子的等效trim语句:
Xml代码
<!-- 查询学生list,like姓名,=性别 -->
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="studentName!=null and studentName!=‘‘ ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName}),‘%‘)
</if>
<if test="studentSex!= null and studentSex!= ‘‘ ">
AND ST.STUDENT_SEX = #{studentSex}
</if>
</trim>
</select>
set例子的等效trim语句:
Xml代码
<!-- 更新学生信息 -->
<update id="updateStudent" parameterType="StudentEntity">
UPDATE STUDENT_TBL
<trim prefix="SET" suffixOverrides=",">
<if test="studentName!=null and studentName!=‘‘ ">
STUDENT_TBL.STUDENT_NAME = #{studentName},
</if>
<if test="studentSex!=null and studentSex!=‘‘ ">
STUDENT_TBL.STUDENT_SEX = #{studentSex},
</if>
<if test="studentBirthday!=null ">
STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
</if>
<if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!=‘‘ ">
STUDENT_TBL.CLASS_ID = #{classEntity.classID}
</if>
</trim>
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
</update>
12、choose (when, otherwise)
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
if是与(and)的关系,而choose是或(or)的关系。
例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:
Xml代码
<!-- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->
<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<where>
<choose>
<when test="studentName!=null and studentName!=‘‘ ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName}),‘%‘)
</when>
<when test="studentSex!= null and studentSex!= ‘‘ ">
AND ST.STUDENT_SEX = #{studentSex}
</when>
<when test="studentBirthday!=null">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
</when>
<when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!=‘‘ ">
AND ST.CLASS_ID = #{classEntity.classID}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
MyBatis动态SQL标签用法
标签:ssi mil mybatis set hash ide last sql long