• 初识Mybatis(二)动态SQL、缓存和逆向工程


    动态SQL

    Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。

    (比如多条件查询的设置,实现判空等)

    1、if

    创建DynamicSQLMapper接口,DynamicSQLMapper.xml文件

    1. DynamicSQLMapper接口:
    2. List<Emp> getEmpByCondition(Emp emp);
    3. DynamicSQLMapper.xml中:
    4. <select id="getEmpByCondition" resultType="Emp">
    5. select * from t_emp where
    6. <if test="empName != null and empName != ''">
    7. emp_name = #{empName}
    8. if>
    9. <if test="age != null and age != ''">
    10. and age = #{age}
    11. if>
    12. <if test="empName != null and empName != ''">
    13. and gender = #{gender}
    14. if>
    15. select>

    List集合作为方法的返回值,以防查出多个数据。

    以上用if条件作为sql的查询判断筛选结果,但存在问题,原意是判断如果查询条件中姓名不为空(即需要查询姓名)则将姓名条件赋值,后面对年龄、性别的if语句也是做同样的判断,实现最终sql语句的拼接。

    创建测试方法DynamicSQLMapperTest

    1. public void testGetEmpByCondition(){
    2. SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    3. DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
    4. Emp emp = new Emp(null, "大大", 7, "女");
    5. List empByCondition = mapper.getEmpByCondition(emp);
    6. empByCondition.forEach(System.out::println);
    7. }

    从赋值条件可以看出,是实现查询姓名为大大、年龄为7、性别为女的记录。如下得到对应的查询结果,我们可以知道如果只有性别做了指定,到那时其余为空,则我们将查询到男或女的所有数据。(这个实现其实就是if的逻辑,如果我们设定的条件不为空则会拼接到sql语句,进行条件查询)

    但是如果第一个条件(上述代码为对empName是否赋值的判断)不成立,where后则会直接凭借下一个语句,为符合和语法(where后面不可以直接加and),一般会在where语句后加上一个恒成立条件,拼接较为完善的sql语句

    2、where

    where和if一般结合使用:


    a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

    eg:上述条件都不满足,则会执行select * from t_emp


    b>若where标签中的if条件满足,则where标签会自动添加where关键字,

    eg:第一个条件满足,但前面没有where会自动添加即select * from t_emp  where emp_name = #{empName}

    并将条件最前方多余的and去掉 ,eg:第一个条件不满足,后面带有and的条件满足,则自动去掉and拼接,

    select * from t_emp  where age = #{age} and gender = #{gender} (后面两个都满足)
    注意:where标签不能去掉条件最后多余的and(即把and放在条件后面时,age = #{age} and)

    3、trim

    trim用于去掉或添加标签中的内容
    常用属性:
    prefix:在trim标签中的内容的前面添加某些内容
    prefixOverrides:在trim标签中的内容的前面去掉某些内容
    suffix:在trim标签中的内容的后面添加某些内容
    suffixOverrides:在trim标签中的内容的后面去掉某些内容