mybatis中SQL一些常用例子

 

   模糊查询(CONCAT只能连接两个字符串,||可以连接多个字符串)

  • SELECT * FROM  table_name WHERE column LIKE CONCAT('%',#{params},'%')
  • SELECT *  FROM  table_name  WHERE UPPER  column LIKE '%' || #{params} || '%'

   foreach循环

 (Coll为入参map的key,对应的value是个集合,item处为别名,#{valueitem}为别名的值)

  • <foreach collection="Coll" item="valueitem"
  • open="(" separator="," close=")">#{valueitem} </foreach>

   下面引入简化的例子之一:

 

<select id="getReportStats" parameterType="java.util.Map" resultMap="VoResultMap">
SELECT code,name FROM table_name
<where>
<if test="codeLists!=null and codeLists.size>0">
AND code IN
<foreach collection="codeLists" item="codevalue" open="(" separator="," close=")">#{codevalue} </foreach>
</if>

<if test="nameLists!=null and nameLists.size>0 ">
<foreach collection="nameLists" item="name" open="(" separator="," close=")">#{name} </foreach>
</if>
</where>
</select>

    以上是我在项目中传入了两个list的迭代,需要注意下它的判断条件写法,

    以及判断关键字不能大写(踩过的坑,不要问为什么),

    同时引入一篇关于map嵌套foreach循环的例子

http://www.cnblogs.com/yg_zhang/p/4314602.html 写道

 

<select id="getByMap" resultMap="BpmDefUser">

<foreach collection="relationMap" index="key" item="ent" separator="union">
SELECT *
FROM BPM_DEF_USER
where RIGHT_TYPE=#{key}
and OWNER_ID in
<foreach collection="ent" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</foreach>

</select>

    index 作为map 的key。item为map的值,这里使用了嵌套循环,嵌套循环使用ent。

    

    时间日期的范围性查找

    第一种方法:

    使用转义字符

    <if test="startDate != null"> AND flt_date &gt;= #{startDate,jdbcType=TIMESTAMP} </if>

    <if test="endDate != null"> AND flt_date &lt;= #{endDate,jdbcType=TIMESTAMP} </if>

   第二种方法:

   因为这个是xml格式的,所以不允许出现类似“>”这样的字符,

   但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析 

<if test="startDate!=null"> AND pih.oper_time<![CDATA[>=]]>#{startDate,jdbcType=TIMESTAMP} </if>

<if test="endDate!=null"> AND pih.oper_time<![CDATA[<=]]>#{endDate,jdbcType=TIMESTAMP} </if>

  MyBatis中关于resultType和resultMap的区别

  MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是     直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前     定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。

   <where>条件中不必加1=1作为拼接条件,否则影响查询的效率

 选择型sql

	<choose>
 		    <when test="carrierStatus=='STASUS_ENTER'">
		    	AND tt.audit_status='STASUS_ENTER'  //注意此处的赋值
	 			<if test="timeStart!=null"> AND cc.enter_time<![CDATA[>=]]>#{timeStart,jdbcType=TIMESTAMP} </if>
	 			<if test="timeEnd!=null"> AND cc.enter_time<![CDATA[<=]]>#{timeEnd,jdbcType=TIMESTAMP} </if>
		    </when>
            
		    <when test="carrierStatus=='STASUS_UNLOADING'">
		    	AND tt.audit_status='STASUS_UNLOADING'
	 			<if test="timeStart!=null"> AND cc.unloading_time<![CDATA[>=]]>#{timeStart,jdbcType=TIMESTAMP} </if>
	 			<if test="timeEnd!=null"> AND cc.unloading_time<![CDATA[<=]]>#{timeEnd,jdbcType=TIMESTAMP} </if>
		    </when>
            
		    <when test="carrierStatus=='STASUS_EXIT'">//双等号比较
		    	AND tt.audit_status='STASUS_EXIT'
	 			<if test="timeStart!=null"> AND cc.exit_time<![CDATA[>=]]>#{timeStart,jdbcType=TIMESTAMP} </if>
	 			<if test="timeEnd!=null"> AND cc.exit_time<![CDATA[<=]]>#{timeEnd,jdbcType=TIMESTAMP} </if>
		    </when>
		    
		     <when test="carrierStatus==null or carrierStatus==''">//双等号比较
			    <if test="timeStart!=null"> AND cc.enter_time<![CDATA[>=]]>#{timeStart,jdbcType=TIMESTAMP} </if>
	 			<if test="timeEnd!=null"> AND cc.enter_time<![CDATA[<=]]>#{timeEnd,jdbcType=TIMESTAMP} </if>
		    </when>
		</choose>

 

 

猜你喜欢

转载自391321729.iteye.com/blog/2334537