Mybatis 动态 SQL

Mybatis 动态Sql



提示:以下是本篇文章正文内容,下面案例可供参考

一、动态sql标签

标签描述
if判断条件
where添加条件
choose添加单个条件
set设置变量值
foreach批量操作
bind辅助标签
trim万能格式标签
sql定义公用 sql
include添加公用 sql

二、使用动态SQL

1.创建表格


Create Table

CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  `sex` int DEFAULT NULL,
  `dept` varchar(20) DEFAULT NULL
  `wage` double DEFAULT NULL
  `createtime` date DEFAULT NULL,
  `depentence` varchar(50) DEFAULT NULL,
  `deleteflag` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3

2. if 标签

根据 name 进行模糊查询

如果 if 标签内 test 中的表达式 返回为 true 怎会将标签内的语句填入查询语句

	<select id="selectByName" resultType="com.ylc.vo.Test2">
		select * from test where  1=1
		<if test="name != null and name != '' ">
			and name like #{name}
		</if>
		and deleteflag = 1
	</select>

3 where 标签

根据姓名、性别、部门 作为搜索条件查询数据

同 if 标签类似,如果判断条件为true if标签中的语句会被加入到 where子句中,where子句会自动生成。并且不需要顾虑 第一个 and ,程序会自动帮你删除 where 后的第一个 and

	<select id="select" resultType="com.ylc.vo.Test2">
		select * from test
		<where>
			<if test="name != null">
				and name like concat('%' #{name} '%')
			</if>
			<if test="sex != null ">
				and sex = #{sex}
			</if>
			<if test="dept != null">
				and dept = #{dept}
			</if>
		</where>
		and deleteflag = 1;
	</select>

4. choose 标签

根据 name或者dept 进行搜索数据

类似java 中的 swich 语句 ,when标签中 test 返回为 true 时 会将when标签中的语句添加到查询语句中。但只会选择一个条件,otherwise标签中的语句无论如何都会添加到查询语句中。同样不用顾虑 and 程序会自动删除

	<select id="selectOne">
		select * from test where 1=1
		<choose>
			<when test="name != null">
				and name=#{name }
			</when>
			<when test="dept != null">
				and dept =#{dept}
			</when>
			<otherwise>
				and deleteflag = 1
			</otherwise>
		</choose>
	</select>

5. set 标签

更新数据

如果 if 标签中的 test 返回为 ture则 会添加标签内的语句

	<update id="update">
		update test
		<set>
			<if test="name != null">
				name = #{name}
			</if>
			<if test="dept != null">
				dept = #{dept}
			</if>
			<if	test="wage != null">
				wage = #{wage}
			</if>
		</set>
		where id= #{id}
	</update>

6 foreach. 标签

foreach 标签解析

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
   #{item}
</foreach>

foreach 标签主要有以下属性,说明如下:、
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名字,表示在迭代过程中每次迭代到的位置。
open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)

批量删除数据 这里采用逻辑删除


	<delete id="deleteUsers">
		update test set deleteFlag = 0 where id in
		<foreach collection="userIds" item="id" open="(" separator="," close=")">
			#{id}
		</foreach>
	</delete>

7. 嵌套 foreach

           <foreach collection="supplierPositionList" item="param" index="index" separator="or" open="(" close=")">
                v.indicator = #{param.indicator}
                <choose>
                    <when test="param.positionList != null and param.positionList.size !=0 ">
                        and v.position in
                        <foreach collection="param.positionList" item="position" index="pIndex" separator="," open="(" close=")">
                            #{position}
                        </foreach>
                    </when>
                    <when test="param.positionList == null or param.positionList.size ==0 ">
                        and v.position in ('')
                    </when>
                </choose>
            </foreach>

8. bind 标签

根据部门进行 模糊查询

<bind name="",value="">
  1. name 该标签的标识符
  2. value 该标签的内容

每个数据库的拼接函数或连接符号都不同,例如 MySQL 的 concat 函数、Oracle 的连接符号“||”等。这样 SQL 映射文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码的移植。MyBatis 提供了 bind 标签来解决这一问题。
bind 标签可以通过 OGNL 表达式自定义一个上下文变量。
比如,按照网站名称进行模糊查询,SQL 映射文件如下。

	<select id="queryByDept" resultType="com.ylc.vo.Test2">
		<bind name="myDept" value="'%'+dept+'%'"/>
		select * from test where dept like #{myDept}
		and deleteflag =1;
	</select>

9. trim 标签

<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀字符" suffixOverrides="忽略后缀字符">
    SQL语句
</trim>

属性描述
prefix给SQL语句拼接的前缀 ,为trim包含的内容加上前缀
suffix给SQL语句拼接的后缀 ,为trim包含的内容加上后缀
prefixOverrides去除SQL语句前面的关键字或字符,该关键字或者字符由 prefixOverrides属性指定
suffxOverrides除SQL语句后面的关键字或字符,该关键字或者字符由 suffxOverrides属性指定

根据 name、dept 进行模糊查询

	<select id="queryMuch" resultType="com.ylc.vo.Test2">
		select * from test
		<trim prefix="where" prefixOverrides="and">
			<if test="name != null">
				and name=#{name }
			</if>
			<if test="dept != null">
				and dept =#{dept}
			</if>
		</trim>
		and deleteflag = 1
	</select>

10. sql 标签

sql 标签可以用于存储那些公共的经常会使用的 sqll 语句

	<sql id="selectTest">
		select * from test
	</sql>

11. include 标签

搭配 sql 标签使用

	<select id="queryByname" resultType="com.ylc.vo.Test2">
		<include refid="selectTest"/>
		<where>
			<if test="name != null">
				and name=#{name }
			</if>
		</where>
	</select>

参看文章
Mybatis的特性详解——动态SQL https://blog.csdn.net/weixin_48207312/article/details/126745586?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169397941616800226553902%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169397941616800226553902&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-126745586-null-null.142^v93^insert_down1&utm_term=动态sql&spm=1018.2226.3001.4187&ydreferer=aHR0cHM6Ly9zby5jc2RuLm5ldC9zby9zZWFyY2g%2Fc3BtPTEwMDEuMjEwMS4zMDAxLjQ0OTgmcT0lRTUlOEElQTglRTYlODAlODFzcWwmdD0mdT0%3D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值