• MyBatis-动态SQL


    目录

    概述

    动态多条件查询

    动态修改

    动态批量删除


    概述

    动态SQL:SQL语句会随着用户输入或外部条件的变化而变化 。

    例如:我们在做多条件查询的时候,编写SQL语句的查询操作,我们并不知道用户实际操作时会选择多少条件进行查询,假如有三个条件(日期,大小,名字)供用户选择后查询,如果用户只选择了一个条件(大小)进行查询,那么我们应该动态的进行SQL语句的编写。

    再例如:当做信息修改时,可修改信息有 用户名,密码,性别,爱好。用户如果全部修改,这当然没什么好说的。但是如果用户只修改某些信息,并没有全部修改。如果我们还用修改全部的那一套SQL语句,那么没有修改到的信息在SQL语句中对应值就会为null。这明显有问题,所以我们需要使用到动态SQL。

    再再例如:我们做批量删除,我们在编写SQL语句时,并不知道用户实际操作时选择多少条数据,所以我们使用SQL语句就可以解决这样的问题。

    动态多条件查询


    环境准备:mybatis环境正常,完善数据表和pojo类。 

    我们在做动态多条件时,SQL语句中需要判断用户输入了哪些条件,没有输入哪些条件,但是我们不能使用Java的判断语法,MyBatis对动态SQL有很强大的支撑,给我们提供了一系列的标签供我们使用。

    例如 等,如何使用呢?看案例。 


    现有一张数据表,表中有三个字段:用户名,密码,账户余额。 

    案例需求:用户通过用户名,密码这两条件进行模糊查询,也可以只用单个条件进行查询,在此演示只通过用户名中包含"A"为条件进行查询用户信息。

     数据层接口方法

    List selectByCondition(User user);

    SQL映射文件-SQL语句

    1. <select id="selectByCondition" resultType="User">
    2. select *
    3. from user_table
    4. <where>
    5. <if test="user != null and user != ''">
    6. user like #{user}
    7. if>
    8. <if test="password != null and password != null">
    9. and password like #{password}
    10. if>
    11. where>
    12. select>

    测试方法 

    1. /**
    2. * 动态条件查询:
    3. * 用户输入的可能不是全部参数,而是部分参数
    4. * 动态SQL
    5. */
    6. @Test
    7. public void ConditionSelectTest() throws IOException {
    8. //模拟前端传入参数
    9. String userName = "A";
    10. //String password = "4";
    11. //处理参数-配置为模糊查询形式
    12. userName = "%"+ userName + "%";
    13. //password = "%"+ password + "%";
    14. //封装成对象的形式传入
    15. User user = new User();
    16. user.setUser(userName);
    17. //user.setPassword(password);
    18. String resource = "mybatis-config.xml";
    19. InputStream is = Resources.getResourceAsStream(resource);
    20. SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
    21. SqlSession sqlSession = build.openSession();
    22. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    23. //调用方法
    24. List users = mapper.selectByCondition(user);
    25. users.forEach(System.out::println);
    26. }

    原始数据:

     

     执行方法:查询user中存在"A"的记录信息。

    动态修改

    案例需求:通过用户名进行修改密码或账户余额。可以只是修改一个,也可以修改全部。

     说明:

    当前案例,只是对于数据层的测试,不做业务层和表现层的功能实现,所以我们都是通过模拟前端传入数据来进行测试。

    数据层接口方法 

    1. //动态修改
    2. void alterRecordByName(User user);

     SQL映射文件-SQL语句

    1. <update id="alterRecordByName">
    2. update user_table
    3. <set>
    4. <if test="password != null and password != ''">
    5. password = #{password},
    6. if>
    7. <if test="balance != null ">
    8. balance = #{balance}
    9. if>
    10. set>
    11. where user = #{user};
    12. update>

    if标签中的test属性,用于填写条件判断。 

     测试方法 

    1. /**
    2. * 修改部分-动态SQL
    3. */
    4. @Test
    5. public void testAlterCondition() throws IOException {
    6. //模拟前端传入参数
    7. String userName = "BB";
    8. //密码和账户余额修改任意,当前只修改账户余额
    9. //String password = "123456";
    10. int balance = 5000;
    11. //封装成对象的形式传入,只将账户余额进行对象封装,密码不变
    12. User user = new User();
    13. user.setUser(userName);
    14. // user.setPassword(password);
    15. user.setBalance(balance);
    16. String resource = "mybatis-config.xml";
    17. InputStream is = Resources.getResourceAsStream(resource);
    18. SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
    19. //获取SqlSession对象的时候,openSession空参时:autoCommit = false
    20. SqlSession sqlSession = build.openSession();
    21. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    22. mapper.alterRecordByName(user);
    23. System.out.println("修改成功...");
    24. //需要手动提交,或者设置:openSession(true)
    25. sqlSession.commit();
    26. }

    原始数据:

     

     执行方法后数据:成功。

    动态批量删除

    案例需求:根据传进来的账户余额锁定用户,都进行删除。

     数据层接口方法

    1. //参数为数组,可接收多个值
    2. void deleteByBalances(@Param("balance") int[] balance);

    SQL映射文件-SQL语句

    1. <delete id="deleteByBalances">
    2. delete from user_table
    3. where balance in
    4. <foreach collection="balance" separator="," item="balance" open="(" close=")" >
    5. #{balance}
    6. foreach>;
    7. delete>

     foreach标签属性说明:

    //collection:代表遍历对象
    //item:代表每一次获取的对象
    //separator:分隔符,数组中元素就是,为分隔符
    //open,close:代表开始和结束位置需要填写的括号()

     测试方法 

    删除账户余额为2000,3000的。 

    1. /**
    2. * 批量删除
    3. */
    4. @Test
    5. public void testDeletes() throws IOException {
    6. //模拟前端传入参数
    7. int[] balances = new int[]{2000,3000};
    8. String resource = "mybatis-config.xml";
    9. InputStream is = Resources.getResourceAsStream(resource);
    10. SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
    11. //获取SqlSession对象的时候,openSession空参时:autoCommit = false(默认)
    12. SqlSession sqlSession = build.openSession();
    13. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    14. mapper.deleteByBalances(balances);
    15. System.out.println("删除成功---->");
    16. //需要手动提交,或者设置:openSession(true)
    17. sqlSession.commit();
    18. }

    原始数据:

    执行方法后数据:

     

  • 相关阅读:
    【Spark】scala基础操作(持续更新)
    使用uniapp写小程序,真机调试的时候不显示log
    jQuery突出显示图片
    C++11:移动语义和完美转发
    struts2漏洞复现
    枚举类型enum用法笔记
    架构风格相关内容
    神经网络优化图片大全,神经网络优化图片下载
    Web开发-session介绍
    【LeetCode】【剑指offer】【二维数组中的查找】
  • 原文地址:https://blog.csdn.net/m0_60155232/article/details/127381884