Mybatis动态SQL

# Mybatis动态SQL

# if判断条件

<!-- public List<Employee> getEmpsByConditionIf(Employee employee); -->
	 
	 <select id="getEmpsByConditionIf" resultType="com.finen.mybatis.bean.Employee">
	 	select * from tbl_employee
	 	<where>
	 		<!-- test:判断表达式; c:if test 
	 		从参数中取值进行判断
		 	-->
		 	<if test="id != null">
		 		id=#{id}
		 	</if>
		 	<if test="lastName != null and lastName != ''">
		 		and last_name like #{lastName}
		 	</if>
		 	<if test="email != null and email.trim()!=''">
		 		and email=#{email}
		 	</if>
		 	<if test="gender == 0 or gender == 1">
		 		and gender=#{gender}
		 	</if>
	 	</where>
	 </select>

1

# trim

<!-- public List<Employee> getEmpsByConditionTrim(Employee employee); -->
	 <select id="getEmpsByConditionTrim" resultType="com.finen.mybatis.bean.Employee">
	 	select * from tbl_employee
	 	<!-- 后面多出的and或者or where不能解决 -->
	 	<!-- 
	 		prefix="" :前缀,trim标签体中是整个字符拼串后的结果
	 				prefix给拼串后的整个字符串加一个前缀
	 		prefixOverrides="" 
	 				前缀覆盖:去掉整个字符串前面多余的字符
	 		suffix="" 后缀
	 				suffix给拼串后的整个字符串多余的字符
	 		suffixOverrides=""
	 				后缀覆盖:去掉整个字符串后面多余的字符
	 	 -->
	 	 <!-- 自定义字符串的截取规则 -->
	 	<trim prefix="where" suffixOverrides="and">
	 		<!-- test:判断表达式; c:if test 
	 		从参数中取值进行判断
		 	-->
		 	<if test="id != null">
		 		id=#{id} and
		 	</if>
		 	<if test="lastName != null and lastName != ''">
		 		last_name like #{lastName} and
		 	</if>
		 	<if test="email != null and email.trim()!=''">
		 		email=#{email} and
		 	</if>
		 	<if test="gender == 0 or gender == 1">
		 		gender=#{gender}
		 	</if>
	 	</trim>
	 </select>

# choose选择判断

<!-- public List<Employee> getEmpsByConditionChoose(Employee employee); -->
	 <select id="getEmpsByConditionChoose" resultType="com.finen.mybatis.bean.Employee">
	 	select * from tbl_employee
	 	<where>
	 		<!-- 如果带了id就用id查,如果带了lastName就用lastName查,只会进入其中一个 -->
	 		<choose>
	 			<when test="id != null">
	 				id = #{id}
	 			</when>
	 			<when test="email != null">
	 				last_name like #{lastName}
	 			</when>
	 			<when test="lastName != null">
	 				email = #{email}
	 			</when>
	 			<otherwise>
	 				gender = 0
	 			</otherwise>
	 		</choose>
	 	</where>
	 </select>

# set标签

<!-- public void updateEmp(Employee employee); -->
	 <update id="updateEmp" >
	 	update tbl_employee
	 	
	 	
		<!-- 
		Set
			<set>
				<if test="lastName != null">
					last_name = #{lastName},
				</if>
				<if test="email != null">
					email = #{email},
				</if>
				<if test="gender != null">
					gender = #{gender}
				</if>
			</set>
		-->
		<!-- Trim -->
		<trim prefix="set" suffixOverrides=",">
			<if test="lastName != null">
				last_name = #{lastName},
			</if>
			<if test="email != null">
				email = #{email},
			</if>
			<if test="gender != null">
				gender = #{gender}
			</if>
		
		</trim>
			
			where id=#{id}
	 </update>

# Foreach

<!-- 动态SQL-Foreach -->
	 <!-- public List<Employee> getEmpsByConditionForeach(List<Integer> list); -->
	 <select id="getEmpsByConditionForeach" resultType="com.finen.mybatis.bean.Employee">
	 	select * from tbl_employee where id in
	 	<!-- 
	 		collection:指定要遍历的集合
	 			list类型的参数会特殊处理封装在map中,map的key叫list
	 		item:将遍历出来的元素赋值给指定的变量
	 		separator:每个元素之间的分隔符
	 		open:遍历出所有结果拼接拼接处一个开始字符
	 		close:遍历出所有结果拼接拼接处一个结束字符
	 		index:索引,遍历list的时候是index就是索引,item就是当前值
	 					遍历map的时候index表示map的key,item就是map的值
	 		
	 		#{变量名}就能取出变量的值也就是当前遍历出的元素
	 	 -->
	 	 <foreach collection="ids" item="item_id" separator=","
	 	 	open="("
	 	 	close=")">
	 	 	#{item_id}
	 	 
	 	 </foreach>
	 </select>

# foreach批量操作

<!-- 批量保存 -->
	 <!-- public void addEmps(@Param("emps")List<Employee> emps); -->
	 <!-- MySQL下批量保存,可以foreach遍历 -->
	 <!-- 首选方式 -->
	 <insert id="addEmps">
	 	insert into tbl_employee(last_name, email, gender, d_id)
	 	values
	 	<foreach collection="emps" item="emp" separator=",">
	 		(#{emp.lastName}, #{emp.email}, #{emp.gender}, #{emp.dept.id})
	 	</foreach>
	 </insert>
	 
	 <!-- 这种方式需要数据库连接属性allowMultiQueries=true
	 		这种分号分隔多个sql可以用于其他的批量操作(删除,修改)
	  -->
	 <insert id="addEmps">
	 	<foreach collection="emps" item="emp" separator=";">
	 		insert into tbl_employee(last_name, email, gender, d_id)
	 		values(#{emp.lastName}, #{emp.email}, #{emp.gender}, #{emp.dept.id})
	 	</foreach>
	 </insert>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mybatis--动态SQL

    SuperHeroes
  • Mybatis - 动态sql

    learn from:http://www.mybatis.org/mybatis-3/dynamic-sql.html mybatis支持动态拼接sql语句。...

    Ryan-Miao
  • Mybatis 动态 SQL

    Mybatis 动态SQL,通过 ●if ●choose (when, otherwise) ●trim (where, set) ●foreach ...

    赵哥窟
  • Mybatis动态SQL

    通过修改对象属性的方式,可以满足大多数的数据传输对象(Data Transfer Object,DTO)以及绝大部分领域模型的要求。 但有些情况下你想使用不可变...

    端碗吹水
  • Mybatis动态sql ,foreatch

    用户5927264
  • mybatis动态sql语句

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • Mybatis动态SQL示例

    <if> 不用我说的吧 <where> 可以帮你处理AND和OR的问题 (比如查询的时候) <set> 可以帮你处理逗号的问题(比如更新数据的时候) <trim...

    乐心湖
  • MyBatis 动态 SQL 详解

    MyBatis 令人喜欢的一大特性就是动态 SQL。 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 S...

    一个优秀的废人
  • MyBatis动态SQL,写SQL更爽

    MyBatis 令人喜欢的一大特性就是动态 SQL。在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 SQ...

    程序员白楠楠
  • MyBatis动态SQL,写SQL更爽

    MyBatis 令人喜欢的一大特性就是动态 SQL。在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 SQ...

    架构师修炼
  • MyBatis动态SQL,写SQL更爽

    链接:https://www.cnblogs.com/homejim/p/9909657.html

    良月柒
  • mybatis动态sql之bind标签

    这样肯定是不行的,#{}只是个占位符,"%#{lastName}%"会被当做一整个字符串。

    西西嘛呦
  • 快速学习-MyBatis动态SQL

    cwl_java
  • mybatis动态sql之foreach补充(二)

    西西嘛呦
  • mybatis动态sql之foreach补充(三)

    这里需要注意index属性和item属性。index属性里的值是Map的键,item的值是Map的值。

    西西嘛呦
  • mybatis动态sql之foreach补充(一)

    说明,现在我们使用public List<Employee> getEmpByForeach2(List<Employee> employee);,传入的是一个...

    西西嘛呦
  • Mybatis【13】-- Mybatis动态Sql标签的使用

    mybatis有一个强大的特性,其他框架在拼接sql的时候要特别谨慎,比如哪里需要空格,还要注意去掉列表最后一个列名的逗号,mybtis的动态sql可以帮助我们...

    秦怀杂货店
  • MyBatis------->动态sql(where、set、if、delete)标签

    在if判断中,如果为null,无法判断是否是数据库本身默认的null,使用包装类避免这种错误

  • Mybatis之动态sql

    爱撒谎的男孩

扫码关注云+社区

领取腾讯云代金券