16Mybatis_动态sql_if判断

mybatis的核心就是动态sql.

什么是动态sql:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

这篇文章讲解sql中的if语句。它可以对查询条件进行判断,如果输入参数不为空才进行查询条件的拼接。这篇文章的核心就是下面的这段代码。

<!-- 
<where></where>相当于sql语句中的where关键字。
这个标签还有一个功能就是自动会去掉第一个and.,比如下面两句sql代码,如果第一个满足的那么就会去掉and这个关键字。





-->

<
where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex= #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''" > and user.username=#{userCustom.username} </if> </if> </where>

下面给出u具体案例:

案例代码结构如下:

除了userMapper.xml和Mybatis_mappertest.java要修改外,其他的代码都不用变。

userMapper.xml代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- nanmespace:命名空间。 作用就是对sql进行分类话管理,理解Sal分离

注意:使用mapper代理方式,namespace有特殊重要的作用
-->

<mapper namespace="cn.itcast.mybatis.mapper.userMapper">
   
 <!-- 
 这里的id要和Mapp接口里面的函数名字一模一样。parameterType表示输入的类型,
 resultType表示输出的类型
 
  -->
    <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">
        SELECT id ,username FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#{userCustom.username} 
    </select>
    
    <!-- 
    定义resultMap
    将SELECT id id_,username username_ FROM USER 和User类中的属性做一个映射关系
    
    type:resultMap最终映射的java对象类型,可以使用别名
    id:对resultMap的唯一标识。
     -->
    <resultMap type="user" id="userResultMap">
        <!-- 
        id:表示查询结果集中唯一的标识。
        column:查询出来的列名
        property:type指定的pojo类型中的属性名
        最终resultMap对column和property作一个映射关系(对应关系)
        
        
         -->
        <id column="id_" property="id"/>
        <result column="username_" property="username"/>
    </resultMap>
    
        <select id="findUserByResultMap" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultMap="userResultMap">
        SELECT id id_,username username_ FROM USER 
    <!-- 
    
    where可以自动去掉条件中的第一个and
     -->
    <where>
        <if test="userCustom!=null">
            <if test="userCustom.sex!=null and userCustom.sex!=''">
                and  user.sex= #{userCustom.sex}
            </if>
            <if  test="userCustom.username!=null and userCustom.username!=''" >
                
                and user.username=#{userCustom.username} 
            </if>
            
            
        </if>
        
        
    </where>
    
    </select>
    
   
</mapper>

测试代码Mybatis_mappertest.java代码如下:

package cn.itcast.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;


import cn.itcast.mybatis.mapper.userMapper;
import cn.itcast.mybatis.po.User;
import cn.itcast.mybatis.po.UserCustom;
import cn.itcast.mybatis.po.UserQueryVo;

public class Mybatis_mappertest {
    
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setup() throws IOException
    {   String resource="SqlMapConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        //主要是生成SqlsessionFactory。
        this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testMaper()
    {
        SqlSession sqlSession=null;
        
        sqlSession=sqlSessionFactory.openSession();
        //生成代理类
        userMapper userMapper=sqlSession.getMapper(userMapper.class);
    //创建包装对象,设置查询条件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
     
        // 注意我把这里的sex注销掉了,也就是说sex没有值,那么我们用的是动态的sql语句,就是说sex不会被拼接进去吧
       // userCustom.setSex("1");
        userCustom.setUsername("王王");
        userQueryVo.setUserCustom(userCustom);
        
        userMapper.findUserByResultMap(userQueryVo);
        
        
    }

}

运行如下:

DEBUG [main] - ==>  Preparing: SELECT id id_,username username_ FROM USER WHERE user.username=?

看到没,这里得sql语句中没有 and user.sex= #{userCustom.sex}这条语句。也就是说没有拼接上去。

我们再改一下:干脆把整个userCustom都不输入进去。

结果如下:

DEBUG [main] - ==>  Preparing: SELECT id id_,username username_ FROM USER

看到没,这里的sql语句中什么where后面的语句都没有拼接上去了。

原文地址:https://www.cnblogs.com/shenxiaoquan/p/5779631.html