动态sql的标签语言

if语句的使用 使得在mapper.xml文件里的sql语句得到极大的复用 因此这一过程也是动态的。

<select id="queryBlog" parameterType="map" resultType="com.pojo.Blog">
    select * from blog where 1=1
    <if test="title!=null">
        and  title=#{title}
    if>
    <if test="author!=null" >
        and author=#{author}
    if>
select>

和jstl标签类似(之后的when otherwise forEach等等) 因此MyBatis的动态sql标签语言在学习上会显得容易


对以上的动态sql语句的修改——在title为空之后拼接的sql语句是where and ... 这是sql上的语法错误
修改——套上`<where>`:
<select id="queryBlog" parameterType="map" resultType="com.pojo.Blog">
    select * from blog 
    <where>
    <if test="title!=null">
         title=#{title}
    if>
    <if test="author!=null" >
        and author=#{author}
    if>
    where>
select>

包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉该内容。

List<Blog> queryBlog(Map map);

利用map映射的方法实现。

标签和在使用的时候 作用一致 会根据需要删除某些逗号或者其他符号 为使整个sql语句的正确性。
以下是针对 某一张表的更新语句:
同样是在mapper接口处 创建方法
利用注解@Test 完成简单测试

  <update id="updeateBlog" parameterType="map" >
     update Blog
     <set>
         <if test="author!=null">
             author=#{author}
         if>
     set>
<where>
    id=#{id};
where>
    update>

或者,你可以通过使用trim元素来达到同样的效果

<trim prefix="SET" suffixOverrides=",">
  ...
trim>

注意,我们覆盖了后缀值设置,并且自定义了前缀值。
trim其实在一开始对于Java的学习就接触过,trim意为除去。
标签里所含的 prefix和jstl的taglib指令是一致的作用 用于标记
这一整体的trim标签的寓意为 前缀prefix 谁覆盖原有语句中的后缀(suffix)那个,就是一个除去替换的过程。

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
trim>

where替换前缀AND |OR

这里涉及的删除一方面是方便 二则是在提醒要注意sql语句的正确性 比如update 其set之后的各个要用逗号隔开。

在一开始的动态sql的学习就提到过 它的出现使得sql语句能够复用 提高效率 那么 choose、when、otherwise的例子能更好的解释这一点。示例:

 <select id="querybywant" parameterType="map" >
        select * from Blog
   <where>
    <choose>
        <when test="title!=null">
            title=#{title}
        when>
        <when test="author!=null">
            author=#{author}
        when>
        <otherwise>
            views=#{views}
        otherwise>
    choose>
   where>
    select>

类似 if else
动态sql本质还是sql语句只是在sql的层面执行我们的逻辑代码。

你可能感兴趣的:(mysql,sql,xml,java)