什么是动态sql

  MyBatis的强大特性之一便是动态sql,之前我们在用JDBC的时候,根据不同条件拼接SQL语句是很痛苦的事情,利用MyBatis的动态sql特性便可以解决这个问题。

动态sql的组成元素

  在学习动态sql之前,先来了解下ONGL,什么是ONGL呢?它和EL表达式差不多,是一种功能强大的表达式语言,用来获取和设置Java对象的属性。动态sql的实际使用元素并不多,无非就那几种,但是它们带来了灵活性的同时,很大程度上提高了程序的可读性和可维护性。下面看下组成元素:
1)if元素:简单的条件判断
2)choose(when、otherwise)元素:相当于java中的switch
3)trim、where、set元素:重点,见代码详解


  1. sql映射文件


    

    
    
        update tbl_employee
        
            
                last_name=#{lastName},
            
            
                email=#{email},
            
            
                gender=#{gender}
            
        
        
            
                id=#{id}
            
        
    

  2.测试的接口方法

//携带了那个字段查询条件就带上这个字段的值
    public List getEmpsByConditionIf(Employee employee);

    //更新操作
    public void updateEmp(Employee employee);

  3. 测试类

@Test
    public void testDynamicSQL() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperDynamicSQL mapperDynamicSQL = openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(3, "xiaoli", null, null);

            //测试where标签
//          List emps = mapperDynamicSQL.getEmpsByConditionIf(employee);
//          for(Employee emp: emps) {
//              System.out.println(emp);
//          }

            //测试set标签
//          mapperDynamicSQL.updateEmp(employee);
//          openSession.commit();   //手动提交数据
        } finally {
            openSession.close();
        }
    }

4)foreach元素:重点,见代码详解


  1. sql映射文件

  2.测试的接口方法

//测试foreach
    public List getEmpsByConditionForeach(@Param("ids")List ids);

  3. 测试类

@Test
    public void testDynamicSQL() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperDynamicSQL mapperDynamicSQL = openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(3, "xiaoli", null, null);

            //测试foreach标签
            List ids = new ArrayList<>();
            ids.add(1);
            ids.add(2);
            ids.add(3);
            ids.add(4);
            List emps = mapperDynamicSQL.getEmpsByConditionForeach(ids);
            for(Employee emp :  emps) {
                System.out.println(emp);
            }

        } finally {
            openSession.close();
        }
    }

 以上代码均未给出mybatis的主配置文件,自行添加

5)test元素:判断真假

总结

  要抓住重点:常用的无非就是if,where,set,foreach一定要掌握。