MyBatis动态SQL标签用法

    xiaoxiao2021-03-25  224

    1、动态SQL片段 通过SQL片段达到代码复用         <!--  动态条件分页查询 -->           < 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>  

    转载请注明原文地址: https://ju.6miu.com/read-1042.html

    最新回复(0)