ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

[mybatis]mybatis动态sql的标签使用详解

2022-07-23 18:04:22  阅读:157  来源: 互联网

标签:map name age put perple sqlSession 详解 sql mybatis


动态sql

根据不同的环境生成不同的sql

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

    if

    • 使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。

    如果传入name就根据name查询,如果输入age就根据age查询,如果不输入就全部查询。

    这里还使用了一对标签主要作用是在判断条件时自动去掉一个或多个end,确保程序正常运行!

<select id="getPerpleByIf" parameterType="Map" resultType="pojo.perple">
    select * from perple 
    <where>
   <if test="name!=null" >
        name=#{name}
   </if>
    <if test="age!=null">
    and age=#{age}
    </if>
        </where>
@Test
public void test(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
    Map map= new HashMap();
   // map.put("name","tata");
    map.put("age","18");
    List<perple> perpleByIf = mapper.getPerpleByIf(map);
    for(perple perple:perpleByIf){
        System.out.println(perple);
    }
}
}

choose、when、otherwise

​ 不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

 <select id="getPerpleByChoose" parameterType="Map" resultType="pojo.perple">
        select * from perple
        <where>
            <choose>
                <when test="name!=null">
                    name=#{name}
                </when>
                <when test="age!=null">
                    age=#{age}
                </when>
                <otherwise>
                    birth=#{birth}
                </otherwise>
            </choose>
        </where>
    </select>
@Test
public void test1(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
    Map map= new HashMap();
 //   map.put("name","tata");
    map.put("age",13);
    map.put("birth","2022-1");
    List<perple> perpleByChoose = mapper.getPerpleByChoose(map);
    for(perple perple:perpleByChoose){
        System.out.println(perple);
    }
}

trim、where、set

set跟where标签作用相似,是为了在修改的时候根据传递的参数去掉多余的逗号!

 <update id="updateSet" parameterType="Map">
        update perple 
        <set>
            <if test="id!=null">
                id=#{id},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age} ,  
            </if>
            <if test="birth!=null">
                birth=#{birth},
            </if>
        </set> where id=#{id}
    </update>
@Test
public void test2(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
    Map map= new HashMap();
    //   map.put("name","tata");
   map.put("age",22);
   map.put("id",3);
   // map.put("birth","2022-1");
    mapper.updateSet(map);

    sqlSession.commit();
}

sql脚本抽取公共部分进行复用

1.使用sql标签进行抽取

<sql id="if">
        <if test="name!=null">
            name=#{name}
        </if>
        <if test="age!=null">
          and age=#{age}
    </if>
    </sql>

2.使用include插入

<select id="getPerple" parameterType="String" resultType="perple">
    select * from perple
    <where>
        <include refid="if"></include>
    </where>
</select>

foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。

sql语句

<select id="getPerpleByForeach" parameterType="Map" resultType="pojo.perple">
    select * from perple
    <where>
        <foreach collection="ids" item="id" open="and (" close= ")" separator="or">
            id=#{id}
        </foreach>
    </where>
</select>

测试类

@Test
public void test3(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
    Map map= new HashMap();
    ArrayList<Integer> ids = new ArrayList<Integer>();
    ids.add(2);
    ids.add(3);
    map.put("ids",ids);
    List<perple> foreach = mapper.getPerpleByForeach(map);
    for(perple f:foreach){
        System.out.println(f);
    }

}

动态sql测试的所有接口方法

//通过if语句的查询
List<perple> getPerpleByIf(Map map);

//通过choose语句的查询
List<perple> getPerpleByChoose(Map map);

//通过set标签更新
int updateSet(Map map);

//通过foreach查询123号
List<perple> getPerpleByForeach(Map map);

标签:map,name,age,put,perple,sqlSession,详解,sql,mybatis
来源: https://www.cnblogs.com/lumanmanqixiuyuanxi/p/16512594.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有