MyBatis 常用写法
https://www.cnblogs.com/zt19994/p/9999696.html
MyBatis 常用写法
1、forEach 循环
forEach 元素的属性主要有 item, idnex, collection, open, separator, close。
- collection:传入的 List 或 Array 或自己封装的 Map。
- item:集合中元素迭代时的别名。
- idnex:集合中元素迭代是的索引。
- open:where 后面表示以什么开始,如以‘(’开始。
- separator:表示在每次进行迭代是的分隔符。
- close:where后面表示以什么结束,如以‘)’结束。
//mapper中需要传递一个容器
public List<User> queryByIdList(List<Integer> userIdList);
<select id="queryByIdList" resultMap="BaseResultMap" parameterType="map">
SELECT * FROM user
WHERE userId IN
<foreach collection="userIdList" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
<select id="listEoCollectAndQuarter" resultMap="listEoCollectAndQuarter"> select distinct d.id,q.`quarter`,q.revenve,q.product_value, d.company_auth, d.company, d.`year`, d.year_revenue, d.year_produce_value, year_profit_rate,year_person_num, year_research_person_num, year_research_put from eo_collect d left join eo_collect_quarter q on q.collect_id = d.id where 1=1 <if test="company != null and company != ''"> and d.company like concat('%',concat(#{company,jdbcType=VARCHAR},'%')) </if> <foreach close=")" collection="olists" index="index" item="oitem" open="and( 1!=1 " separator=""> or d.company_auth = #{oitem} </foreach> <if test="olists.size == 0"> and d.company_auth= "11111111111111111111111111111111111111111" </if> <if test="yearList != null and yearList.size() != 0"> <foreach close=")" collection="yearList" index="yearIndex" item="yearItem" open="and( 1!=1" separator=""> or d.`year` = #{yearItem} </foreach> </if> <if test="companyList != null and companyList.size() != 0"> <foreach close=")" collection="companyList" index="companyIndex" item="companyItem" open="and( 1!=1" separator=""> or d.company = #{ companyItem,jdbcType=VARCHAR} </foreach> </if> <if test="quarterList != null and quarterList.size() != 0"> <foreach close=")" collection="quarterList" index="quarterIndex" item="quarterItem" open="and( 1!=1" separator=""> or q.quarter = #{ quarterItem,jdbcType=INTEGER} </foreach> </if> and d.is_deleted =0 order by d.gmt_created_on desc </select>
2、concat 模糊查询
//模糊查询使用concat拼接sql
<select id="queryByName" resultMap="BaseResultMap" paramterType"string">
SELECT * FROM user
<where>
<if test="name != null">
name like concat('%', concat(#{name}, '%'))
</if>
</where>
</select>
3、if + where 标签
用 if 标签判断参数是否有效来进行条件查询。
<select id="getUserList" resultMap="BaseResultMap" paramterType="com.demo.User">
SELECT * FROM user
<where>
<if test="userId !=null and userId!= ''">
userId= #{userId}
</if>
<if test="name !=null and name!= ''">
AND name= #{name}
</if>
<if phone="userId !=null and phone!= ''">
AND phone= #{phone}
</if>
</where>
</select>
where 动态语句中,where 标签会自动去掉 AND 或 OR。防止 WHERE AND 错误。
4、if + set
使用 set 标签可以动态的配置 SET 关键字,使用 if + set 标签,如果某项为 null 则不进行更新。
<update id="updateUser" paramterType="com.demo.User">
UPDATE user
<set>
<if test=" name != null and name != ''">
name = #{name},
</if>
<if test=" phone != null and phone != ''">
phone = #{phone},
</if>
</set>
WHERE userId = #{userId}
</update>
5、if + trim 代替 where/set 标签
trim 可以更灵活的去处多余关键字的标签,可以实现 where 和 set 的效果。
<select id="getUserList" resultMap="BaseResultMap" paramterType="com.demo.User">
SELECT * FROM user
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userId !=null and userId!= ''">
userId= #{userId}
</if>
<if test="name !=null and name!= ''">
AND name= #{name}
</if>
<if phone="userId !=null and phone!= ''">
AND phone= #{phone}
</if>
</trim>
</select>
<update id="updateUser" paramterType="com.demo.User">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test=" name != null and name != ''">
name = #{name},
</if>
<if test=" phone != null and phone != ''">
phone = #{phone},
</if>
</trim>
WHERE userId = #{userId}
</update>
5、choose(when, otherwise)标签
choose 标签是按顺序判断其内部 when 标签中的 test 条件是否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满足,则执行 otherwise 中的 sql。类似 java 中的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
<select id="selectCustomerByCustNameAndType" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM user
<choose>
<when test="Utype == 'name'">
WHERE name = #{name}
</when>
<when test="Utype == 'phone'">
WHERE phone= #{phone}
</when>
<when test="Utype == 'email'">
WHERE email= #{email}
</when>
<otherwise>
WHERE name = #{name}
</otherwise>
</choose>
</select>
个人学习笔记,记录日常学习,便于查阅及加深,仅为方便个人使用。