这篇文章主要讲述Mybatis动态SQL各种标签的用法详解,学习Mybatis动态sql看这一篇博客足够了。
目录
什么是静态SQL?
如果嵌入了SQL语句,而这个SQL语句的主体结构已经明确,例如在Java的一段代码中有一个待执行的SQL“select * from t1 where c1>5”,在Java编译阶段,就可以将这段SQL交给数据库管理系统去分析,数据库软件可以对这段SQL进行语法解析,生成数据库方面的可执行代码,这样的SQL称为静态SQL。
什么是动态SQL?
如果嵌入的SQL没有明确给出,如在Java中定义了一个字符串类型的变量sql:String sql;,然后采用preparedStatement对象的execute方法去执行这个sql,该sql的值可能等于从文本框中读取的一个SQL或者从键盘输入的SQL,但具体是什么,在编译时无法确定,只有等到程序运行起来,在执行的过程中才能确定,这种SQL叫做动态SQL。MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作。
动态SQL标签详解
IF标签的用法
在开发中有时候我们会有很多条件查询,而这些条件我们可填也可不填,这个时候我们可以使用IF标签来解决。
test:判断表达式(OGNL),OGNL语法可以参照官方文档。
<select id="getEmpsByConditionIf" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee where
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null">
and last_name = #{lastName}
</if>
</select>
where标签的用法
针对于上面的sql写法,假如id传值为空,会直接出现下面的sql语法错误,这个时候可以用where标签。where标签可以帮我们去掉前面多余的and,切记他只会去掉前面的,假如and写在后面是不行的。
select * from tbl_employee where and last_name like ?
<select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee
<where>
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null">
and last_name like #{lastName}
</if>
</where>
</select>
这个时候会发现即使id值不传只传lastName值,他会把lastName里面的and给去掉。
失效示例:在这种情况是没有用的。
<if test="lastName!=null">
last_name like #{lastName} and
</if>
在实际开发当中还有一种比较省事的方法,也可以避免这种问题,那就是直接where 1=1
<select id="getEmpsByConditionIf" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee where 1=1
<if test="id!=null">
and id=#{id}
</if>
<if test="lastName!=null">
and last_name like #{lastName}
</if>
</select>
trim标签的用法
trim可以帮我们完成后面多出的and或者or where标签不能解决,还可以用来切除字符串等等。
trim一共给我们提供了四个属性:
prefix:前缀,prefix给拼串后的整个字符串加一个前缀 。
prefixOverrides:前缀覆盖,去掉整个字符串前面多余的字符
suffix:后缀,suffix给拼串后的整个字符串加一个后缀
suffixOverrides:后缀覆盖:去掉整个字符串后面多余的字符
示例:用prefix前缀和suffixOverrides后缀覆盖来替代了where条件,这样也可以避免多个and报错问题。对于我们来说只需要知道他的这几个属性就行了,实际开发当中根据业务场景来进行完成一些特定功能。
<select id="getEmpsByConditionTrim" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee
<!-- 自定义字符串的截取规则 -->
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null">
last_name like #{lastName} and
</if>
</trim>
</select>
choose的用法
和case when功能差不多,都是只会走一种,不管when条件里面有几个满足了,都只走第一个,如果when所有条件都没有满足,就会走otherwise。
<select id="getEmpsByConditionChoose" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee
<where>
<!-- 如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个 -->
<choose>
<when test="id!=null">
id=#{id}
</when>
<when test="lastName!=null">
last_name like #{lastName}
</when>
<otherwise>
gender = 0
</otherwise>
</choose>
</where>
</select>
set标签的用法
修改的时候有时候我们只想修改表当中的一部分属性,而另一部分属性并不想改,我们传的空,这个时候可以使用set。
有的人该说了我光用 if 标签不就行了,这个是不行的,光用if条件假如gender属性传的为空,这个时候sql后面就会多个逗号,就会报错的。set标签主要就是可以帮我们把后面多余的逗号去掉。用trim也是可以的。
<update id="updateEmp">
<!-- Set标签的使用 -->
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>
foreach标签的用法
foreach循环遍历的意思,一般可用于查询,或者批量新增等功能。
foreach一共有六个属性:
collection:指定要遍历的集合:list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值
使用foreach接口传值方式,List数组。
public List<Employee> getEmpsByConditionForeach(@Param("ids")List<Integer> ids);
多个查询
<select id="getEmpsByConditionForeach" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee
<foreach collection="ids" item="item_id" separator=","
open="where id in(" close=")">
#{item_id}
</foreach>
</select>
当list传两个数据的时候,执行出来的sql语句:
select * from tbl_employee where id in( ? , ? )
bind标签的用法
他的主要作用就是可以将后台传过来的参数进行特殊处理,并且可以多处调用。
<select id="getEmpsTestInnerParameter" resultType="com.gzl.mybatis.bean.Employee">
<!-- bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 -->
<bind name="lastName" value="'%'+lastName+'%'"/>
<if test="_databaseId=='mysql'">
select * from tbl_employee
<if test="_parameter!=null">
where last_name like #{lastName}
</if>
</if>
</select>
sql标签的用法
一般用来封装可重用的sql,然后我们可以使用include标签来进行调用。
<sql id="insertColumn">
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null && lastName!=""">
and last_name like #{lastName}
</if>
</sql>
调用方法: include 标签当中的refid属性填写sql的id名,即可调用。
<select id="getEmpsByConditionIf" resultType="com.gzl.mybatis.bean.Employee">
select * from tbl_employee
<!-- where -->
<where>
<include refid="insertColumn"></include>
</where>
</select>
include还可以自定义一些property
<include refid="insertColumn">
<property name="testColomn" value="abc"/>
</include>
总结
总体来说Mybatis当中提供的这些标签有一些在实际开发当中还是会经常用到的,比如if、sql等
如果您还有什么疑问也可以评论在下方,或者私信都是可以的。
感觉小编整理的还可以的,确实您也学到了,麻烦帮小编点个关注或者点个赞,哈哈哈