• Mybatis中的动态SQL


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

    一、if(单独使用较少)

    • if标签可通过test属性(即传递过来的数据)的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
    • 单独使用if时,通常在where后面添加一个恒成立条件1=1
    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select * from t_emp where 1=1
    4. <if test="empName != null and empName !=''">
    5. and emp_name = #{empName}
    6. </if>
    7. <if test="age != null and age !=''">
    8. and age = #{age}
    9. </if>
    10. <if test="sex != null and sex !=''">
    11. and sex = #{sex}
    12. </if>
    13. <if test="email != null and email !=''">
    14. and email = #{email}
    15. </if>
    16. </select>

    二、where         

    where元素主要是用于简化查询语句中where部分的条件判断,where元素可以再元素所在位置输出一个where关键字,而且还可以将后面条件多余的and或or关键字去掉,与其他元素搭配使用。

    • where和if一般结合使用:
      • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
      • 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and/or去掉
    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select * from t_emp
    4. <where>
    5. <if test="empName != null and empName !=''">
    6. and emp_name = #{empName}
    7. </if>
    8. <if test="age != null and age !=''">
    9. and age = #{age}
    10. </if>
    11. <if test="sex != null and sex !=''">
    12. and sex = #{sex}
    13. </if>
    14. <if test="email != null and email !=''">
    15. and email = #{email}
    16. </if>
    17. </where>
    18. </select>

    三、trim

    • trim用于去掉或添加标签中的内容
    • 常用属性
      • prefix:在trim标签中的内容的前面添加某些内容
      • suffix:在trim标签中的内容的后面添加某些内容
      • prefixOverrides:在trim标签中的内容的前面去掉某些内容
      • suffixOverrides:在trim标签中的内容的后面去掉某些内容
    • 若trim中的标签都不满足条件,则trim标签没有任何效果。
    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select * from t_emp
    4. <trim prefix="where" suffixOverrides="and|or">
    5. <if test="empName != null and empName !=''">
    6. emp_name = #{empName} and
    7. </if>
    8. <if test="age != null and age !=''">
    9. age = #{age} and
    10. </if>
    11. <if test="sex != null and sex !=''">
    12. sex = #{sex} or
    13. </if>
    14. <if test="email != null and email !=''">
    15. email = #{email}
    16. </if>
    17. </trim>
    18. </select>
    1. //测试类
    2. @Test
    3. public void getEmpByCondition() {
    4. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    5. DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
    6. List<Emp> emps= mapper.getEmpByCondition(new Emp(null, "张三", null, null, null, null));
    7. System.out.println(emps);
    8. }

    结果如下:

    四、choose、when、otherwise

    • choose、when、otherwise相当于if...else if..else
    • when至少要有一个,otherwise至多只有一个
    1. <select id="getEmpByChoose" resultType="Emp">
    2. select * from t_emp
    3. <where>
    4. <choose>
    5. <when test="empName != null and empName != ''">
    6. emp_name = #{empName}
    7. </when>
    8. <when test="age != null and age != ''">
    9. age = #{age}
    10. </when>
    11. <when test="sex != null and sex != ''">
    12. sex = #{sex}
    13. </when>
    14. <when test="email != null and email != ''">
    15. email = #{email}
    16. </when>
    17. <otherwise>
    18. did = 1
    19. </otherwise>
    20. </choose>
    21. </where>
    22. </select>
    1. @Test
    2. public void getEmpByChoose() {
    3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    4. DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
    5. List<Emp> emps = mapper.getEmpByChoose(new Emp(null, "张三", 23, "男", "123@qq.com", null));
    6. System.out.println(emps);
    7. }

    结果如下:

    • 相当于if a else if b else if c else d,只会执行其中一个

    五、foreach

    属性:

    • collection:设置要循环的数组或集合
    • item:表示集合或数组中的每一个数据
    • separator:设置循环体之间的分隔符,分隔符前后默认有一个空格,如,
    • open:设置foreach标签中的内容的开始符
    • close:设置foreach标签中的内容的结束符

    5.1  批量删除

    1. <!--int deleteMoreByArray(Integer[] eids);-->
    2. <delete id="deleteMoreByArray">
    3. delete from t_emp where eid in
    4. <foreach collection="eids" item="eid" separator="," open="(" close=")">
    5. #{eid}
    6. </foreach>
    7. </delete>
    1. @Test
    2. public void deleteMoreByArray() {
    3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    4. DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
    5. int result = mapper.deleteMoreByArray(new Integer[]{6, 7, 8, 9});
    6. System.out.println(result);
    7. }

    结果如下:

     其中的xml文件里的SQL语句也可以为:

    5.2  批量添加

    1. <!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
    2. <insert id="insertMoreByList">
    3. insert into t_emp values
    4. <foreach collection="emps" item="emp" separator=",">
    5. (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
    6. </foreach>
    7. </insert>
    1. @Test
    2. public void insertMoreByList() {
    3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    4. DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
    5. Emp emp1 = new Emp(null,"a",1,"男","123@321.com",null);
    6. Emp emp2 = new Emp(null,"b",1,"男","123@321.com",null);
    7. Emp emp3 = new Emp(null,"c",1,"男","123@321.com",null);
    8. List<Emp> emps = Arrays.asList(emp1, emp2, emp3);
    9. int result = mapper.insertMoreByList(emps);
    10. System.out.println(result);
    11. }

    结果如下:

    六、SQL标签(SQL片段)

    • sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
    • 声明sql片段:标签
    <sql id="empColumns">eid,emp_name,age,sex,email</sql>
    
    • 引用sql片段:标签
    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select <include refid="empColumns"></include> from t_emp
    4. </select>

  • 相关阅读:
    Java内存模型(JMM)详解
    set和map通过一颗红黑树进行封装
    2019我的Java面试跳槽经历
    虚拟摄像头之八: 从 Camera api2 角度看摄像头框架
    linux 中普通用户能够执行 ping 命令的机关
    控制语句之break、continue、return的用法(练习题)
    基于Springboot实现课程评分系统设计和实现
    【Docker 基础教程】Mysql主从服务搭建------Mysql容器闪退及容器名冲突系列问题
    如何实现一个动态添加待办及完成功能
    【HTML期末学生大作业】 制作一个简单HTML保护野生动物老虎网页设计专题(HTML+CSS)
  • 原文地址:https://blog.csdn.net/weixin_55772633/article/details/132984733