小言_互联网的博客

MyBatis-动态SQL

296人阅读  评论(0)

目录

概述

动态多条件查询

动态修改

动态批量删除


概述

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

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

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

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

动态多条件查询


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

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

例如 <if> 、<choose>、<set>、<where>、<foreach>等,如何使用呢?看案例。 


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

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

 数据层接口方法

List<User> selectByCondition(User user);

SQL映射文件-SQL语句


  
  1. <select id="selectByCondition" resultType="User">
  2. select *
  3. from user_table
  4. <!--需要使用where标签,否则两个条件为空时,会存在sql语法错误 -->
  5. <where>
  6. <if test="user != null and user != ''">
  7. user like #{user}
  8. </if>
  9. <if test="password != null and password != null">
  10. and password like #{password}
  11. </if>
  12. </where>
  13. </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<User> 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标签 代表的就是set-->
  4. <set>
  5. <!--if标签 判断用户是否输入,不输入就不进行修改-->
  6. <if test="password != null and password != ''">
  7. password = #{password},
  8. </if>
  9. <if test="balance != null ">
  10. balance = #{balance}
  11. </if>
  12. </set>
  13. where user = #{user};
  14. </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. <!--批量删除-->
  2. <delete id="deleteByBalances">
  3. delete from user_table
  4. where balance in
  5. <foreach collection="balance" separator="," item="balance" open="(" close=")" >
  6. #{balance}
  7. </foreach>;
  8. </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. }

原始数据:

执行方法后数据:

 


转载:https://blog.csdn.net/m0_60155232/article/details/127381884
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场