Mybatis---动态SQL(1)

Mybatis之动态Sql语句

本章节接着上一章的简单的对数据库的增查删改继续
还是熟悉的User.java实体类,内容还是一致(id,username,password)
*

1).动态Sql-----IF语句

*先在UserMapper.java中编写对应的接口(就用查询来写){这里的查询用到了万能Map}

 //根据任意一个条件查询满足该条件的全部用户(IF)
    List<User> queryUserIF(Map map);

*接下来编写Mapper.xml文件
如果不加if那sql语句应该是Select * from 表名字这种形式,加上IF就是加了一个IF标签,这样写我们就是实现动态的查询满足我们条件的所有结果。一个完整的IF标签应该是

<if test="">
</if>

具体在mapper.xml中应该这样写

 <select id="queryUserIF" parameterType="map" resultType="com.cjn.domain.User">
        select * from user  where 1=1
        <if test="id != null">
            and id = #{id}
        </if>
        <if test="username != null">
            and username = #{username}
        </if>
    </select>

写完了我们的Mapper接口还有我们的Mapper.xml文件接下来我们开始测试
先查询一个id让我们看看结果

 /**根据任意条件查询满足条件的全部用户(IF)**/
        @Test
        public void queryUserIF(){
            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.queryUserIF(map);
            for(User user : users){
                System.out.println(user);
            }
            //释放资源
            sqlSession.close();
        }

运行结果:
只查询id
只查询username

  /**根据任意条件查询满足条件的全部用户(IF)**/
        @Test
        public void queryUserIF(){
            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.queryUserIF(map);
            for(User user : users){
                System.out.println(user);
            }
            //释放资源
            sqlSession.close();
        }

运行结果:
在这里插入图片描述
可以看到只要是满足条件的结果尽数查出这个,就是动态性。

2).动态Sql-----Choose,When,otherwise语句

*这个主要是Choose语句(他的含义就跟Java中的Switch语句一样,Choose必须满足一个条件才可起作用,否则就会出现空值或者错误),我们还是用查询来测试
老样子还是先定义Mapper接口

 //根据任意一个条件查询满足该条件的全部用户(Choose,When,otherwise)
    List<User> queryUserChoose(Map map);

编写Mapper.xml文件
这里就用到了Choose标签,还有when标签,最后的otherwise标签的意思就和else语法差不多,
这里sql语句的意思是查询全部列表,是否符合给出的id还有username还有password的其中之一,或者符合全部。(注意上面的IF语句中有where标签是因为有1=1这个条件,这里去掉以后加上了where标签性质相同,也可将上述IF语句中的1=1去掉,用where标签包裹IF语句

 <!--根据条件查询满足该条件的全部用户-->
    <select id="queryUserChoose" parameterType="map" resultType="com.cjn.domain.User">
     select * from user
     <where>
         <choose>
             <when test="id != null">
                 id = #{id}
             </when>
             <when test="username != null">
                and username = #{username}
             </when>
             <otherwise>
                and password = #{password}
             </otherwise>
         </choose>
     </where>
    </select>

接下来咱们开始测试

  /**Choose只会选择第一个条件进行查询,自动忽略除了第一个以后的条件**/
        @Test
        public void queryUserChoose(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap map = new HashMap();
            map.put("id","1");
            List<User> users =  mapper.queryUserChoose(map);
            for(User user : users){
                System.out.println(user);
            }
            //释放资源
            sqlSession.close();
        }

下面是测试结果
在这里插入图片描述

3).动态Sql-----Set语句

通常set语句会在修改语句中出现,所以我们就用修改语句来实现,set标签会自动前置sql语句,并且会
删除无关逗号。(注意必须有一个修改条件可执行)
好了接下来我们继续,oldroad,先写Mapper接口

 int updateUser(Map map);

再写Mapper.xml文件

 <!--set语句更新-->
    <update id="updateUser" parameterType="map">
        update user
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password}
            </if>
        </set>
        where id = #{id}
    </update>

接下来开始测试

 /**Set语句更新**/
        @Test
    public void updateUser(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap map = new HashMap();
            map.put("username","南方");
            map.put("password","3333333");
            map.put("id","1");
           int i = mapper.updateUser(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();
        }

运行结果:
(注意这里我是将数据修改后添加了一步查询全部信息的操作)
在这里插入图片描述

4).动态Sql-----sql片段

接下来咱们说一种不常用的sql片段,就是sql标签
,sql标签的作用的话其实跟html中的div作用类似
。大家可以看到上述的几种sql语句中都出现了

 <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password}
            </if>

这个语句,这时候sql语句就有了他存在的意义
我们就可以定义一个SQL标签将他放入其中,等到时候使用,就可以直接拿出来用,一个完整的sql标签是下面这样(id的作用是为了方便引用):

<sql id="">
</sql>

下面我们结合IF查询例子来说明:
oldroad,先写Mapper接口:

//sql片段引入版本查询满足条件的全部用户
    List<User> queryUserIf(Map map);

在写Mapper.xml文件
先用sql标签定义公共部分
注意需要使用这段公共部分的时候,这时候就用一个include标签引用即可具体操作看一下语句。

 <sql id="if-id-username">
        <if test="id != null">
            and id = #{id}
        </if>
        <if test="username != null">
            and username = #{username}
        </if>
    </sql>

然后在写需要用的部分(注意这里的refid就是引用上述的sql的id名字):

 <!--(sql片段引用版本)根据条件查询满足该条件的全部用户-->
    <select id="queryUserIf" parameterType="map" resultType="com.cjn.domain.User">
        select * from user
       <where>
           <include refid="if-id-username"></include>
       </where>
    </select>

xml到这里就写完了,下面我们就开始测试:

 @Test
    public void queryUserIf(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap map = new HashMap();
        map.put("id","1");
        List<User> users =  mapper.queryUserIf(map);
        for(User user : users){
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

运行结果:
在这里插入图片描述
先到这里,剩下的在Mybatis—动态SQL(2)当中。
以上均是个人所学所得,若有错误欢迎私聊评论指正,谢谢

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值