简单了解MyBatis中的动态Sql语句Where的作用

先看效果

<select id="findListUser" resultType="user" parameterType="com.yueqingyun.domain.QuerySel">
        select * from user
        <if test="listid != null and listid.size()>0">
            <where>
                <foreach collection="listid" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </where>
        </if>
    </select>

上面的这一段配置,既是使用了Mybatis里面的foreach标签讲id循环遍历进去拼凑出一个完整的Sql语句
显示的是

select * from user where id in (41,42)
简单了解MyBatis中的动态Sql语句Where的作用

在运用到idea中输出的结果是:
简单了解MyBatis中的动态Sql语句Where的作用

所以证明这样写是正确的

然后我们再换成不用Where的写法

<select id="findListUser" resultType="user" parameterType="com.yueqingyun.domain.QuerySel">
        select * from user where 1=1
        <if test="listid != null and listid.size()>0">

                <foreach collection="listid" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>

        </if>
    </select>

这样写在idea中的输出结果是:
简单了解MyBatis中的动态Sql语句Where的作用
证明这样写也是没有问题的

我们再换成错误的写法

<select id="findListUser" resultType="user" parameterType="com.yueqingyun.domain.QuerySel">
        select * from user
        <if test="listid != null and listid.size()>0">
            
                <foreach collection="listid" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            
        </if>
    </select>

这样运行之后的结果是:
简单了解MyBatis中的动态Sql语句Where的作用

所以我们可以得出结论,在使用了where标签之后,他的语句是

select * from user WHERE id in ( ? , ? ) 

而在没有使用where标签之后,他的语句是

select * from user WHERE and id in ( ? , ? ) 

这个可以很明显的看出来,是Sql语句的语法错误

那么我们就可以猜想mybatis在底层编写的时候,是否在使用where标签的时候,就可以对where条件值做出了and或者or的处理.可以识别语句语法的 冲突?
而where 1=1这种技巧的出现,就是很明显为了解决and之前条件的单语法错误,所以在设计where标签的时候mybatis就已经想到了这种情况?

所以我再初步使用mybatis之后,我感觉where标签就是为了解决Sql语句的语法冲突的,他可以使我们编写sql语句的时候忽略最麻烦的第一个and,能大大减少项目带来的复杂度和检测冲突.所以,如果在报语法错误的时候,在判断自身sql无恙的时候,就可以看看where标签有没有嵌进去,.或者有没有做类似where 1=1的处理