Mybatis---动态SQL(2)


Mybatis—动态SQL(2)


我们接着上一章节讲,上一章节我们讲到了SQL片段,动态sql还剩下bind模糊查询,还有foreach,还有一个trim,好了废话不多开始
*

1).concat模糊查询

在讲bind模糊查询之前我们先讲一个用到concat的模糊查询,可以用来对比一下。
我们先写Mapper接口;

 List<User> queryUser1(@Param("username") String username,
                             @Param("password") String password);

在编写接口对应的xml文件:
注意这里的concat("%",#{username},"%")语句只适合mysql数据库,如果底层换成其他数据库就不行了

 <!--concat("%",#{username},"%")只会支持mysql,如果底层是其他数据库就不行了-->
    <select id="queryUser1" resultType="com.cjn.domain.User">
         select * from user where username like concat("%",#{username},"%") and password like concat("%",#{password},"%")
    </select>

接下来咱们开始测试:

 @Test
    public void queryUser1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list =  mapper.queryUser1("南","3");
        for(User user : list){
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

运行结果:
在这里插入图片描述
*

2).Bind模糊查询

接下来咱们开始用bind编写,bind标签适合所有数据库语言
先写Mapper接口:

//bind模糊查询
    List<User> queryUserBind(@Param("username") String username,
                          @Param("password") String password);

再写对应的xml文件:
注意这里的bind标签中name属性是方便下面的sql语句引用。

 <select id="queryUserBind" resultType="com.cjn.domain.User">
        <bind name="bindusername" value="'%'+username+'%'"/>
        <bind name="bindpassword" value="'%'+password+'%'"/>
         select * from user where username like #{bindusername} and password like #{bindpassword}
    </select>

在编写测试类:

  /**bind模糊查询**/
    @Test
    public void queryUserBind(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list =  mapper.queryUserBind("南","3");
        for(User user : list){
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

运行结果:
在这里插入图片描述

3).Foreach标签

foreach标签查询满足条件的结果
oldroad,编写mapper接口:

    List<User> queryUserForeach(Map map);

再写对应的mapper.xml文件:

 <!--foreach标签的使用,查询1-3号用户-->
    <!--静态查询语句为
         select * from user where 1=1 and (id=1 or id=2 or id=3)
    -->
    <!--先传递一个万能map,这个map里面可以存在一个集合-->
    <!--collection是要遍历集合,item是集合中单个元素的名称,open为拼接sql语句开始,close为结束-->
    <!--separator为连接符-->
    <select id="queryUserForeach" parameterType="map" resultType="com.cjn.domain.User">
        select * from user
        <where>
            <foreach collection="idlist" item="id" open="and (" close=")" separator="or">
                id = #{id}
            </foreach>
        </where>
    </select>

测试:

 /**foreach查询id为1-3的用户**/
    @Test
    public void queryUserForeach(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap map = new HashMap();
        ArrayList<Integer> idlist = new ArrayList<Integer>();
        idlist.add(1);
        idlist.add(2);
        idlist.add(3);
        map.put("idlist",idlist);
        List<User> users= mapper.queryUserForeach(map);
        for(User user : users){
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

运行结果:
在这里插入图片描述

4).Trim标签(代替Where标签)

Trim标签可以用来替换where标签还有set标签
先替换where标签
mapper接口:

//trim标签(根据需求组织sql语句,可以代替where还有set标签)
    //trim标签实现查询满足任意一个条件的全部用户(代替WHERE)
    List<User> queryUserTrim(Map map);

mapper.xml文件:

<!--Trim标签实现查询满足任意一个条件的全部用户(代替WHERE)-->
    <!--prefix标签前缀,是指配置的where-->
    <!--prefixOverrides是指要处理的字符,会删除多余的and还有or-->
    <select id="queryUserTrim" parameterType="map" resultType="com.cjn.domain.User">
        select * from user
        <trim prefix="WHERE" prefixOverrides="AND | OR">
        <if test="id != null">
            and id = #{id}
        </if>
        <if test="username != null">
            and username = #{username}
        </if>
        </trim>
    </select>

测试类的编写:

 /**trim标签实现查询满足任意一个条件的全部用户(代替WHERE)**/
    @Test
    public void queryUserTrim(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap map = new HashMap();
        //map.put("id","1");
        map.put("username","南方");
        List<User> users =  mapper.queryUserTrim(map);
        for(User user : users){
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

运行结果:
在这里插入图片描述

5).Trim标签(代替Set标签)

下面是代替Set标签
mapper接口:

//trim标签实现更新满足任意一个条件的用户(代替set)
    int updateUserTrim(Map map);

接口对应的Mapper.xml文件
注意suffixOverrides属性作用是去掉多余的后缀比如逗号

<!--trim标签实现更新满足任意一个条件的用户(代替set)-->
    <!--suffixOverrides标签作用是去掉多余的后缀比如逗号-->
    <update id="updateUserTrim" parameterType="map">
        update user
        <trim prefix="SET" suffixOverrides=",">
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password}
            </if>
        </trim>
        where id = #{id}
    </update>

测试类:

 /**trim标签实现更新满足任意一个条件的用户(代替set)**/
    @Test
    public void updateUserTrim(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap map = new HashMap();
        map.put("username","南方");
        map.put("password","1");
        map.put("id","1");
        int i = mapper.updateUserTrim(map);
        if(i!=0){
            System.out.println("修改成功!!");
            User user=new User();
            List<User> users = mapper.findAll();
            if(user != null){
                System.out.println(users);
            }
        }else{
            System.out.println("修改失败!!");
        }
        //如果mybatis进行更新操作,提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

运行结果:
同样我在修改操作之后添加了一个查询全部列表的操作。
在这里插入图片描述

好了,Mybatis之动态Sql就更新到这里,谢谢观看
以上均是个人所学所得,若有错误欢迎评论指正

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值