一、MyBatis 框架 动态标签






1、if 标签


  • if 标签的相关属性
    • test 属性: 添加判断条件

XML 代码展示

     <select id="queryIf" parapeterType ="com.modules.dto.User"  resultType ="com.modules.dto.User">
     
            <!-- 因为有 where 就必须有查询条件,如果没有便会报错,所以加上 1=1条件 -->   
    		select id,username,password from user where 1=1
    		
    		    <!-- 判断传入的参数是否为空 -->   
    			<if test="id != null">
    				and id= #{id}
    			</if>
     </select>




2、where 标签



XML 代码展示

     <select id="queryWhere" parapeterType ="com.modules.dto.User"  resultType ="com.modules.dto.User">
    		select id,name.paw from user 
    		  <where >
    			<if test="id != null">
    				and id= #{id}
    			</if>
    		  </where >
     </select>




3、set 标签



XML 代码展示

	<update id="updateById" parameterType="com.demo_01.entity.User">
 	        update user 
     	        <set>
     	        	<if test="name != null">
   						username = #{username},
   					</if>
   					<if test="name != null">
   						password = #{password},
   					</if>
   					<if test="name != null">
   						age=#{age},
   					</if>
     	        </set>
 	          <where >
    			<if test="id != null">
    				and id= #{id}
    			</if>
    		  </where >
 	 </update>




4、trim 标签



  • trim 标签的相关属性

    • prefix 属性: 拼接前缀

    • suffix 属性: 拼接后缀

    • prefixOverrides 属性: 去除前缀

    • suffixOverrides 属性: 去除后缀


XML 代码展示

   <select id="count" result="java.lang.Integer">
   	select count(*) from user
   	<trim prefix ="where" prefixOverrides="and | or">
   		<if test="id != null">id = #{id}</if>
   		<if test="username != null"> and username = #{username}</if>
   	</trim>
   </select>
  • 如果 id 或者 username 有一个不为空,则在语句前加入 where。如果 where 后面紧随 and 或 or 就会自动会去除

  • 如果 id 或者 username 都为空,则不拼接任何东西




5、foreach 标签



  • foreach 标签的相关属性

    • collection 属性: 用来指定循环遍历的参数类型,如果参数类型为 List,则该值为 list。如果参数类型为数组,则该值为 array。

    • item 属性: 循环的key(可以自定义 key 值),通过 key.集合中的属性来获取数据

    • index 属性: 循环的下标顺序

    • open 属性: 指定循环开始的内容

    • close 属性: 指定循环结束的内容

    • separator 属性: 指定循环在每次迭代时所使用的分隔符(根据需求自定义使用什么)

XML 代码展示

   <select id="count" resultType="java.lang.Integer">
   	select count(*) from user where id in
     	<foreach collection="list" item="i" index="index" open="(" separator="," close=")">
           #{i.id}
     	</foreach>
   </select>




5.1、foreach 标签扩展 Oracle and MySQL 批量插入

XML 代码展示

   <sql id="base_column">id, question_id, answer</sql>
   
   <!-- oracle的批量插入 -->
   <insert id="insertBatchOracle" parameterType="list">
       insert into question_answer ( <include refid="base_column" /> ) 
       select question_answer_seq.NEXTVAL, A.* from (
           <foreach collection="list" item="item" separator="union all">
               select #{item.questionId}, #{item.answer} from dual
           </foreach>
       ) A 
   </insert>
   
   <!-- Mysql的批量插入,主键自增 -->
   <insert id="insertBatchMysql" parameterType="list">
       insert into question_answer ( <include refid="base_column" /> ) 
       values 
           <foreach collection="list" item="item" open="(" separator="union all" close=")">
               #{item.id}, #{item.questionId}, #{item.answer}
           </foreach>
   </insert>




6、choose 标签



XML 代码展示

 <select id="queryChoose" parapeterType ="com.modules.dto.User"  resultType ="com.modules.dto.User">        select * from user where 1 = 1 
        <choose>
            <when test="id != null">
                and id = #{id}
            </when>
            <when test="name != null">
                and name = #{name}
            </when>
            <otherwise>
                and paw = "123456"
            </otherwise>
        </choose>
    </select>




7、bind 标签



XML 代码展示

<select id="count" resultType="java.lang.Integer">
	select count(*) from user
	<where>
		<if test="name != null">
			<bind name="username" value="'%' + username + '%'"
			name = #{username}
		</if>
</select>




11-29 11:06