MyBatis动态SQL特性详解

作者:CN丶1 时间:2022-10-03 03:21:50 

概述

动态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语句

<select id="selectByCondition" resultType="User">
   select *
   from user_table
   <!--需要使用where标签,否则两个条件为空时,会存在sql语法错误 -->
   <where>
       <if test="user != null and user != ''">
           user like #{user}
       </if>
       <if test="password != null and password != null">
           and password like #{password}
       </if>
   </where>
</select>

测试方法

/**
    * 动态条件查询:
    * 用户输入的可能不是全部参数,而是部分参数
    * 动态SQL
    */
   @Test
   public void ConditionSelectTest() throws IOException {
       //模拟前端传入参数
       String userName = "A";
       //String password = "4";
       //处理参数-配置为模糊查询形式
       userName = "%"+ userName + "%";
       //password = "%"+ password + "%";
       //封装成对象的形式传入
       User user = new User();
       user.setUser(userName);
       //user.setPassword(password);
       String resource = "mybatis-config.xml";
       InputStream is = Resources.getResourceAsStream(resource);
       SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
       SqlSession sqlSession = build.openSession();
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //调用方法
       List<User> users = mapper.selectByCondition(user);
       users.forEach(System.out::println);
   }

原始数据:

MyBatis动态SQL特性详解

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

User{user= 'AA ', password= '123456', balance=5500}

User{user='AB', password='123456', balance=3000}

User{user='AD', password=' 132456', balance=2000}

Process finished with exit code 0

动态修改

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

说明:

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

数据层接口方法

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

SQL映射文件-SQL语句

<update id="alterRecordByName">
   update user_table
   <!--set标签 代表的就是set-->
   <set>
       <!--if标签 判断用户是否输入,不输入就不进行修改-->
       <if test="password != null and password != ''">
           password = #{password},
       </if>
       <if test="balance != null ">
           balance = #{balance}
       </if>
   </set>
   where user = #{user};
</update>

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

测试方法

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

原始数据:

MyBatis动态SQL特性详解

执行方法后数据:成功。

MyBatis动态SQL特性详解

动态批量删除

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

数据层接口方法

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

SQL映射文件-SQL语句

<!--批量删除-->
<delete id="deleteByBalances">
   delete from user_table
   where balance in
   <foreach collection="balance" separator="," item="balance" open="(" close=")" >
       #{balance}
   </foreach>;
</delete>

foreach标签属性说明:

//collection:代表遍历对象

//item:代表每一次获取的对象

//separator:分隔符,数组中元素就是,为分隔符

//open,close:代表开始和结束位置需要填写的括号()

测试方法

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

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

原始数据:

MyBatis动态SQL特性详解

执行方法后数据:

MyBatis动态SQL特性详解

来源:https://blog.csdn.net/m0_60155232/article/details/127381884

标签:MyBatis,动态,SQL
0
投稿

猜你喜欢

  • Java创建树形结构算法实例代码

    2021-11-21 22:24:01
  • Android非异常情况下的Activity生命周期分析

    2022-10-29 04:06:12
  • 解析Java的设计模式编程之解释器模式的运用

    2022-01-04 04:02:18
  • 深入了解Java虚拟机栈以及内存模型

    2022-02-17 13:37:50
  • Activiti开发环境的搭建过程详解

    2021-08-16 07:13:05
  • Android第三方控件PhotoView使用方法详解

    2021-12-07 20:35:48
  • C#中文件名或文件路径非法字符判断方法

    2023-12-01 14:14:21
  • Android关于Button背景或样式失效问题解决方法

    2021-12-28 03:21:06
  • springboot连接不上redis的三种解决办法

    2022-03-21 20:57:23
  • Java如何给Word文档添加多行文字水印

    2023-11-10 07:40:58
  • C#实现查杀本地与远程进程的方法

    2023-08-10 08:01:30
  • Java中SSM+Shiro系统登录验证码的实现方法

    2022-06-09 17:05:14
  • spring boot使用thymeleaf跳转页面实例代码

    2021-09-14 09:46:16
  • Android使用onCreateOptionsMenu()创建菜单Menu的方法详解

    2023-05-13 06:21:01
  • pom文件中${project.basedir}的使用

    2021-12-24 04:24:11
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    2023-03-08 14:15:44
  • C#获取图片的后缀名解析

    2023-02-13 09:35:58
  • Springboot整合PageOffice 实现word在线编辑保存功能

    2022-12-03 22:38:18
  • Android从服务器获取图片的实例方法

    2022-08-27 04:03:46
  • Android基于ViewPager实现的应用欢迎界面完整实例

    2021-10-02 23:01:52
  • asp之家 软件编程 m.aspxhome.com