错误方式一:
在mybatis的动态sql语句中使用 <if> 标签可以判断sql中的条件是否成立。

    <select id="getPerson" resultType="com.lzj.bean.Employee">
        select * from tbl_employee
        where
            <if test="id!=null">
                id=#{id}
            <if test="lastName!=null and lastName!=''">
                and last_name like #{lastName}
            <if test="email!=null and email.trim()!=''">
                and email=#{email}
            <if test="gender==0 or gender==1">
                and gender=#{gender}
     </select>

在上面的动态sql语句中存在一个问题,当第一条sql判断语句

            <if test="id!=null">
                id=#{id}

失败时,即id值为null,而lastName、email和gender判断成功后,最后sql语句就会变为:
select * from tbl_employee where and last_name like #{lastName} and email=#{email} and gender=#{gender}
where后面多一个and,执行sql时会失败。

改正方式一:
在where条件后面加了一条判断1=1,然后在id的判断后加上and关键字,这样当下面if条件中的任何一个判断失败后,都不会影响整个sql语句。

    <select id="getPerson" resultType="com.lzj.bean.Employee">
        select * from tbl_employee
        where 1=1
            <if test="id!=null">
                and id=#{id}
            <if test="lastName!=null and lastName!=''">
                and last_name like #{lastName}
            <if test="email!=null and email.trim()!=''">
                and email=#{email}
            <if test="gender==0 or gender==1">
                and gender=#{gender}
     </select>

错误方式二:
有些人习惯在每个if判断中的数据库字段的后面加and关键字,例如

    <select id="getPerson" resultType="com.lzj.bean.Employee">
        select * from tbl_employee
        where
            <if test="id!=null">
                id=#{id} and
            <if test="lastName!=null and lastName!=''">
                last_name like #{lastName} and
            <if test="email!=null and email.trim()!=''">
                email=#{email} and
            <if test="gender==0 or gender==1">
                gender=#{gender}
     </select>

但是上述情况存在一个弊端,当最后一个if判断gender失败时,sql语句就变成了:
select * from tbl_employee where id=#{id} and last_name like #{lastName} and email=#{email} and
where条件的最后多一个and,sql语句执行的时候也会失败。
改正方式二:
在最后一个if语句中库表字段后加and关键字,然后在最后加1=1判断

    <select id="getPerson" resultType="com.lzj.bean.Employee">
        select * from tbl_employee
        where
            <if test="id!=null">
                id=#{id} and
            <if test="lastName!=null and lastName!=''">
                last_name like #{lastName} and
            <if test="email!=null and email.trim()!=''">
                email=#{email} and
            <if test="gender==0 or gender==1">
                gender=#{gender} and
            1=1
     </select>

建议方式:

<where><if> 进行组合,当条件不成立时,if条件后的内容包括and也不会存在,因此不会对整个sql语句产生影响。注意and关键字要放在每个<if>语句中的库表字段赋值的前面。因为,一旦判断不成功,<where> 会把对应的and关键字去掉(还有or关键字)。

<select id="getPerson" resultType="com.lzj.bean.Employee">
    select * from tbl_employee
    <where>
        <!-- test:判断表达式(OGNL)
        遇见特殊符号应该去写转义字符:&&、''等字符
        <if test="id!=null">
            id=#{id}
        <if test="lastName!=null and lastName!=''">
            and last_name like #{lastName}
        <if test="email!=null and email.trim()!=''">
            and email=#{email}
        <!-- ognl会进行字符串与数字的转换判断  "0"==0 -->
        <if test="gender==0 or gender==1">
            and gender=#{gender}
    </where>
 </select>
上述很多特殊字符可以写成转义的形式,例如
 <select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.bean.Employee">
    select * from tbl_employee
    <!-- where -->
    <where>
        <if test="id!=null">
            id=#{id}
        <if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
            and last_name like #{lastName}
        <if test="email!=null and email.trim()!=&quot;&quot;">
            and email=#{email}
        <if test="gender==0 or gender==1">
            and gender=#{gender}
    </where>
 </select>
注意,`<if>`失败后, `<where>` 关键字只会去掉库表字段赋值前面的and,不会去掉后面的and关键字,即注意,`<where>` 只会去掉`<if>` 语句中的最开始的and关键字。所以下面的形式是不可取的
<select id="getPerson" resultType="com.lzj.bean.Employee">
    select * from tbl_employee
    <where>
        <if test="id!=null">
            id=#{id} and
        <if test="lastName!=null and lastName!=''">
            last_name like #{lastName} and
        <if test="email!=null and email.trim()!=''">
            email=#{email} and
        <if test="gender==0 or gender==1">
            gender=#{gender}
    </where>
 </select>

``
因为,
失败后,`不会自动去掉后面的and关键字,这种形式与错误方式二种原理相同。

C#语言中也是如此。当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了。这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题。一旦之前的条件为真,就会继续执行,执行到抛出异常的条件时,程序就爆了,哈哈。 我们可以写个简单的demo试试。下面的这段代码是坑爹的,之后我会说明原因,但大家可以先从直观的层面上理解一下,最后我会给出正确的测试方法。 代码如下: static void Main(string[] args) { DataSet ds = null; if (false && ds.Tables[0].Rows.Count > 0) { 1、对应注解@lSelect2、对应注解@Update3、对应注解@Insert4、对应注解@Delete5、在某些条件根据入参有无决定是可使用以避免1=1这种写法,也会根据是否为where条件后第一个条件参数自动去除and6、:类似于java中的条件判断if,没有标签7、标签8、:可以对数组、Map或实现了Iterable接口(如List、Set)的对象遍历。可实现in、批量更新、批量插入等。9、:映射结果集10、:映射结果类型,可是java实体类或Map、List等类型。 该语句的用途是根据某变量不同的值(值1,值2,…if语句是在PDV执行之后才执行,针对待处理数据进行筛选或赋值,而where语句是在PDV执行之前就已经被执行,当数据被读取至缓冲区的时候就已经被筛选完成。if语句和where语句是SAS中最常用的逻辑判断语句,主要用于数据筛选和条件赋值。需要注意的是,where语句只能用于数据筛选,而不能用于条件赋值。理论上,else的语句可以无限长,囊括所有条件判断和操作,但如果条件判断过多,为了简化程序,可以使用。 mybatis中if和where用于动态sql条件拼接,在查询语句中如果缺失某个条件,通过if和where标签可以动态的改变查询条件,用法示例入下: mapper代码: public interface UserMapper { //mybits的if和where的使用 public List<User> findUserList(UserQueryVO vo); xml配置: <?xml version="1.0" encoding="UTF-8"?> 当标签判断失败后,标签关键字可以自动去除掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即标签只会去掉标签语句中的最开始的and关键字。所以上面的写法(and写在后面)是不符合mybatis规范的。 1.if标签--单条件判断:判断完第一个条件,对下一个条件进行判断,看是否能满足条件,满足则执行假如第一个满足条件,则开始执行,并不会判断下一个条件,如第一个不满足则判断下一个,满足则执行我们观察到上面的sql都加了 where 1=1 ,如果不使用where 1=1 那么你的动态sql可能会出错。 我们能不能不加where 1=1呢! 可以 那么我们就可以使用where标签,作用:可以自动为你添加where关键字,并且可以帮你去除第一个and |or这个配合if标签一起用,一般用在修改语句。如果传递的参数 在平时写项目的过程中,经常会使用到该技术,这里就记录一下啦!它主要的功能就是将结果集根据用户输入的条件筛选出最接近用户想要的结果。与普通查询不同的就是用户可以根据自己的需要,选择性的输入条件得到其结果,这也是其动态的核心。 话不多说直接上代码: SELECT store_adjust WHERE <if test="id != null and id != ''"> AN... 我们在使用mybatis写sql语句的时候,经常会遇到很多sql都会有拥有某些相同的查询条件,如果只是一个两个还感觉不到什么,可是如果查询语句特别多,而且又都拥有共同的查询条件的时候,我们可以考虑将中相同的条件抽取出来,然后封装一下,在需要的时候直接引用就可以了。 以我最近接受的代码为例: 1.未抽取前 <select id="selectVtRecordPage" parameterTyp... 创建数据表employee和dept。CREATE TABLE dept(d_no         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,d_name       VARCHAR(50),d_location     VARCHAR(100));由于employee表dept_no依赖于父表dept的主键d_no,因此需要先创建dept表,然后创建empl... 逻辑运算符 &&完成一件事有n个步骤,每个步骤都得搞定,此件事才能搞定,各个步每个步骤都得搞定,此件事才 能搞定,各个步骤之间的关系就是与.左边的表达式如果是false,则右边就不执行了 ||完成一件事有n个方法,每个方法都能搞定这件事,各个方法间的关系称为或.左边的表达式如果是true,则右边不执行了! !非true,则false;非false则true ​ 偶数个非是他本身 逻辑运算符的结果依然是布尔值