zoukankan      html  css  js  c++  java
  • 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后面的语句都没有拼接上去了。

  • 相关阅读:
    SPFA算法——香甜的黄油
    并查集及应用
    背包问题——装箱问题(洛谷1049)用true模板
    划分类动态规划——乘积最大(洛谷1018,codevs1017)
    多源最短路Floyed——多源最短路(CODEVS1077)(可能Floyed模板)
    并查集——亲戚(洛谷1551)(可做并查集模板)
    最小生成树Kruskal——最优布线问题(codevs 1231) (可做Kruscal模板)
    最小生成树Prim——最短网络(洛谷1546)(USACO 3.1.1)可当Prim模板
    lsy263 の CSP-S 2019游记
    About Me
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/5779631.html
Copyright © 2011-2022 走看看