• mybatis单框架之动态sql


    mybatis单框架之动态sql

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

    1.1 接口方法

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

    1.2 xml文件中select标签

     
    <select id="find" resultType="Emp">
        select * from emp
        <if test="ename!=null and ename!=''">
            where ename like '%${ename}%'
        if>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.4 测试运行截图

    在这里插入图片描述

    1.5 总结

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

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

    2.1 接口方法

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

    2.2 xml文件中select标签

      
       <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.4 测试运行截图

    在这里插入图片描述

    2.5 总结

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

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

    3.1 接口方法

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

    3.2 xml文件中select标签

      
        <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.4 测试运行截图

    在这里插入图片描述

    3.5 总结

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

    4 修改(传什么改什么)

    4.1 接口方法

     int update(Emp e);
    
    • 1

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.4 测试运行

    4.4.1 修改之前数据表的内容

    在这里插入图片描述

    4.4.2 测试运行截图

    在这里插入图片描述

    4.4.3 修改之后数据表的内容

    在这里插入图片描述

    4.5 总结

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

    5 范围查找(in标签)

    5.1 集合形式

    5.1.1 接口方法
    List<Emp> for1(List<Integer> deptnos);
    
    • 1
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    5.1.4 测试运行截图

    在这里插入图片描述

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

    5.2 数组形式

    5.2.1 接口方法
    List<Emp> for2(String[] jobs);
    
    • 1
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    5.2.4 测试运行截图

    在这里插入图片描述

    5.2.5 总结
     a 如果是数组,则foreach标签里面的collection属性要写array
     是在in单词后面写forEach标签 
     b open标签是首字母, close标签是尾字母,separator是()之间的值以什么符号进行分隔,item就是别名
     c 在foreach标签里面写上#{别名}
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Android 13 新特性及适配指南
    6、堆(新生区,永久区,堆内存调优(jvm调优))
    五子棋对战简单介绍
    动视是否磨灭了暴雪的灵魂?
    「C++程序设计 (面向对象进阶)」学习笔记・二
    高速专线不打烊 DPDK Hotplug助你实现设备动态管理
    透过源码理解Flutter InheritedWidget
    [附源码]java毕业设计星期八酒店管理系统
    使用数据库实现增删改查
    Mac版Word设置从第K页开始显示页码
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/127775539