mybatis单框架之动态sql

mybatis单框架之动态sql

1 实现单条件模糊查找(if语句)

1.1 接口方法

/*传入就按照名字查 没有就查全部*/
List<Emp> find(String ename);

1.2 xml文件中select标签

 <!--nysql数据库是不区分大小写的 要想区分加上binary关键字-->
<select id="find" resultType="Emp">
    select * from emp
    <if test="ename!=null and ename!=''">
        where ename like '%${ename}%'
    </if>
</select>

1.3 测试代码

@Test
public void t1(){
    SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
    SqlSession sqlSession = sf.openSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    List<Emp> emps = mapper.find("a");
    emps.forEach(System.out::println);
    sqlSession.commit();
}

1.4 测试运行截图

在这里插入图片描述

1.5 总结

其中if标签的内容使用的属性名都是来源于传过来的参数

2 实现单条件模糊查找(if语句)

2.1 接口方法

 List<Emp> find(@Param("ename") String ename,@Param("job") String job);

2.2 xml文件中select标签

  <!--是不区分大小写的 要想区分加上binary
    where配合if使用 有一个才带上where
    -->
   <select id="find" resultType="Emp">
       select * from emp
       <where>
           <if test="ename!=null and ename!=''">
               ename like '%${ename}%'
           </if>
           <if test="job!=null and job!=''">
               and job like '%${job}%'
           </if>
       </where>
   </select>

2.3 测试代码

 @Test
    public void t1(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> emps = mapper.find("a","m");
        emps.forEach(System.out::println);
        sqlSession.commit();
    }

2.4 测试运行截图

在这里插入图片描述

2.5 总结

a where标签里面的if标签没有一个符合条件时,WHERE是不会增加的,就是查全部,只要有一个符合条件,则会加上where
b where标签一般于if搭配着使用
c 多个条件时,and标签写在第二个if标签里面的前头

3 多选一(choose标签,相当于switch)

3.1 接口方法

 List<Emp> choose(@Param("ename") String ename,@Param("job") String job);

3.2 xml文件中select标签

  <!--choose 类似于switch或多重if-->
    <select id="choose" resultType="Emp">
        select * from emp
        <choose>
            <when test="ename!=null">
                where ename like '%${ename}%'
            </when>
            <when test="job!=null">
                where job like '%${job}%'
            </when>
            <otherwise>
                order by sal desc
            </otherwise>
        </choose>
    </select>

3.3 测试代码

 @Test
    public void t1(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class)
        List<Emp> emps = mapper.choose(null, null);
        emps.forEach(System.out::println);
        sqlSession.commit();
    }

3.4 测试运行截图

在这里插入图片描述

3.5 总结

a choose标签和when标签或者otherwise搭配使用
b when标签test属性里面写的规则和if一致,传入是是一个变量,就写变量名,若传入的是一个对象,则写对象里面的属性即可
如传入emp对象 emp对象里面的ename、mgr等都能在test属性里面使用
c choose标签只会执行里面的一个条件

4 修改(传什么改什么)

4.1 接口方法

 int update(Emp e);

4.2 xml文件中select标签

  <update id="update">
        update emp
        <set>
            <if test="ename!=null">
                ename=#{ename}
            </if>
            <if test="job!=null">
                ,job=#{job}
            </if>
            <if test="hiredate!=null">
                ,hiredate=#{hiredate}
            </if>
        </set>
        where empno=#{empno}
    </update>

4.3 测试代码

@Test
    public void t1(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp e=new Emp();
        e.setEmpno(8890);
        e.setEname("小红");
        int update = mapper.update(e);
        sqlSession.commit();
    }

4.4 测试运行

4.4.1 修改之前数据表的内容

在这里插入图片描述

4.4.2 测试运行截图

在这里插入图片描述

4.4.3 修改之后数据表的内容

在这里插入图片描述

4.5 总结

a set标签里面的if标签只要有一个符合条件,则会加上set标签,没有一个符合条件的时候,会一个在修改提前进行判断的,不会让其执行这条语句的
b set标签一般于if搭配着使用
c 多个条件时,逗号写在第二个if标签里面的前头

5 范围查找(in标签)

5.1 集合形式

5.1.1 接口方法
List<Emp> for1(List<Integer> deptnos);
5.1.2 xml文件中select标签
 <select id="for1" resultType="Emp">
        select * from emp WHERE deptno in
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
 </select>
5. 1.3 测试代码
 @Test
    public void t1(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class)
        Integer[] id={10,15,20,25};
        List<Emp> emps = mapper.for1(Arrays.asList(id));
        emps.forEach(System.out::println);
        sqlSession.commit();
    }
5.1.4 测试运行截图

在这里插入图片描述

5.1.5 总结
采用Arrays.asList(数组引用)转换成的集合只能查询,不能删除和修改
如果想要进行增删,再new ArrayList()一次就行
 List<集合存放的数据类型> emps01=new ArrayList(aslist转换后的引用)
 是在in单词后面写forEach标签
 如果是集合foreach标签里面的collection属性要写list

5.2 数组形式

5.2.1 接口方法
List<Emp> for2(String[] jobs);
5.2.2 xml文件中select标签
<select id="for2" resultType="Emp">
        select * from emp WHERE job in
        <foreach collection="array" item="j" open="(" close=")" separator=",">
            #{j}
        </foreach>
</select>
5.2.3 测试代码
@Test
    public void t1(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        String[] jobs={"A","ANALYST","CLERK"};
        List<Emp> emps = mapper.for2(jobs);
        emps.forEach(System.out::println);
        sqlSession.commit();
    }
5.2.4 测试运行截图

在这里插入图片描述

5.2.5 总结
 a 如果是数组,则foreach标签里面的collection属性要写array
 是在in单词后面写forEach标签 
 b open标签是首字母, close标签是尾字母,separator是()之间的值以什么符号进行分隔,item就是别名
 c 在foreach标签里面写上#{别名}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值