Mybatis笔记 04:动态SQL

1. if 判断

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	where
		<if test="id != null and id != ''">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>
</select>
  • 其中test属性的值为判断条件,使用OGNL表达式(OGNL官网
  • test内部的条件判断的是接收的参数的值
  • OGNL可以自动进行数字和字符串之间的转换

此时存在一个问题,如果不传入id时,语句就会出现where and last_name =这种类似的语法错误

其中一种解决方式为:

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	where 1=1
		<if test="id != null and id != ''">and 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>
</select>

此时任何一个条件前都会有1=1这个条件,每个条件都可以带上and

2. where标签

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	<where> 
		<if test="id != null and id != ''">and 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>

此时Mybatis会自动去掉第一个多余的and或or,但是如果将and写在了查询条件的后面来达到拼接的效果,where标签无效,此时的语句仍有可能出现语法错误

3. trim标签

自定义字符串的截取规则,trim标签体中是整个字符串拼串后的结果

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	<trim prefix="where" suffixOverrides="and">
		<if test="id != null and id != ''">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} and</if>
    </trim> 
</select>
  • prefix属性:给拼串后的整个字符串加一个前缀
  • prefixOverrides属性:前缀覆盖,去掉整个字符串前面多余的字符
  • suffix属性:给拼串后的整个字符串加一个后缀
  • suffixOverrides属性:后缀覆盖,去掉整个字符串后面多余的字符

4. choose标签

类似分支选择switch-case-break,每次只进入一个分支

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	<where>
    	<choose>
    		<when test="id != null">id = #{id}</when>
    		<when test="lastName != null">last_name like #{lastName}</when>
    		<when test="email != null">email like #{email}</when>
    		<otherwise>gender = 0</otherwise>
    	</choose>
    </where>
</select>

5. set标签

<update id="updateEmployees">
	update tbl_employee
	<set>
    	<if test="lastName != null">last_name = #{lastName},</if>
    	<if test="email != null">email = #{email},</if>
    	<if test="gender != null">gender = #{gender},</if>
    </set>
    where id = #{id}
</update>

此时mybatis会去掉多余的逗号

6. foreach标签

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select id, last_name, email, gender
	from tbl_employee
	where id in 
	<foreach collection="list" item="item_id" open="(" close=")" separator=",">
		#{item_id}
	</foreach>
</select>
  • collection属性:指要遍历的集合
  • item属性:将当前遍历出的元素赋值给指定的变量
  • separator属性:每个元素之间的分隔符
  • open属性:遍历出所有结果拼接一个开始的字符
  • close属性:遍历出所有结果拼接一个结束的字符
  • index属性:遍历list时的索引(遍历map的时候表示的是map的key,item是值)
  • #{变量名}:取出变量的值,即当前遍历出的元素

此时的SQL语句为:

select id, last_name, email, gender from tbl_employee where id in ( ? , ? , ? )

用foreach实现批量插入

<insert id="insertEmployees">
	insert into tbl_employee (last_name, email, gender, dept_id) values
	<foreach collection="list" separator="," item="item">
		(#{item.lastName}, #{item.email}, #{item.gender}, #{item.dept.id})
	</foreach>
</insert>
<insert id="insertEmployees">
	<foreach collection="list" separator=";" item="item">
		insert into tbl_employee (last_name, email, gender, dept_id) values
		(#{item.lastName}, #{item.email}, #{item.gender}, #{item.dept.id})
	</foreach>
</insert>

第二种方式需要数据库连接支持执行用分号分隔的多条SQL语句,需要在URL后加上参数allowMultiQueries=true,同时该种方式由于语句独立,还可以实现批量删除和批量修改的操作

7. 两个内置参数

  • _parameter:代表整个参数
  • _databaseId:如果配置了databaseIdProvider标签,该参数的值就是当前数据库的别名
<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	<if test="_databaseId = mysql">
		select * from tbl_employee
		<if test="_parameter != null">
			where id = {_parameter.id}
		</if>
	</if>
</select>

8. bind标签

可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值

<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	<bind name="_lastName" value=" '%' + lastName + '%' "/>
	select * from tbl_employee where last_name like #{_lastName}
</select>

9. sql标签

抽取可重用的SQL片段,方便后面引用

<sql id="columns">
	id, last_name, email, gender, ${newColumn}
</sql>
<select id="selectEmployees" resultType="com.dudu.domain.Employee">
	select
	<include refid="columns">
		<property name="newColumn" value="dept_id"/>
	</include>
	from tbl_employee
	where last_name like #{lastName}
</select>
  • 通过include标签在语句中引用
  • sql标签内部也可以写动态标签
  • 通常情况下都会将要查询的列名或插入用的列名抽取出来
  • 可以在include标签内自定义一些property,sql标签内部就可以使用自定义的属性${}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值