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="">
- name 该标签的标识符
- 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>