MyBatis动态SQL特性详解

 更新时间:2022年11月16日 10:18:36   作者:CN丶1  
动态SQL可以省略很多拼接SQL的步骤,使用类似于JSTL方式,下面这篇文章主要给大家介绍了关于Mybatis动态SQL特性的相关资料,文字通过实例代码介绍的非常详细,需要的朋友可以参考下

概述

动态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);
    }

原始数据:

执行方法:查询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();
    }

原始数据:

执行方法后数据:成功。

动态批量删除

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

数据层接口方法

//参数为数组,可接收多个值
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中的前++和后++的区别示例代码详解

    java中的前++和后++的区别示例代码详解

    这篇文章主要介绍了java中的前++和后++的区别示例代码详解,其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加,本文通过代码给大家详细解说,感兴趣的朋友跟随小编一起看看吧
    2020-06-06
  • 微服务之Feign的介绍与使用小结

    微服务之Feign的介绍与使用小结

    Feign 是一个声明式的伪RPC的REST客户端,它用了基于接口的注解方式,很方便的客户端配置,Spring Cloud 给 Feign 添加了支持Spring MVC注解,并整合Ribbon及Eureka进行支持负载均衡,这篇文章主要介绍了微服务之Feign的介绍与使用,需要的朋友可以参考下
    2022-07-07
  • Java使用OpenOffice将office文件转换为PDF的示例方法

    Java使用OpenOffice将office文件转换为PDF的示例方法

    OpenOffice是一个开源的办公套件,它包含了文档处理、电子表格、演示文稿以及绘图等多种功能,类似于Microsoft Office,本文将给大家介绍Java使用OpenOffice将office文件转换为PDF的示例方法,需要的朋友可以参考下
    2024-09-09
  • 一篇文章大家彻底学会Java之格式化输出

    一篇文章大家彻底学会Java之格式化输出

    Java提供了多种格式化输出的方式,包括String.format()、System.out.printf()和Formatter类,这些方法支持数字、日期、字符串等多种格式化操作,这篇文章主要介绍了Java格式化输出的相关资料,需要的朋友可以参考下
    2025-04-04
  • 多线程(多窗口卖票实例讲解)

    多线程(多窗口卖票实例讲解)

    下面小编就为大家带来一篇多线程(多窗口卖票实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring Security中successHandler和failureHandler使用方式

    Spring Security中successHandler和failureHandler使用方式

    这篇文章主要介绍了Spring Security中successHandler和failureHandler使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • JAVA中compareTo方法的使用小结

    JAVA中compareTo方法的使用小结

    compareTo方法的目的是用来比较两个对象的大小的,本文主要介绍了JAVA中compareTo方法的使用小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • spring bean.xml文件p标签使用报错的解决

    spring bean.xml文件p标签使用报错的解决

    这篇文章主要介绍了spring bean.xml文件p标签使用报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java定义泛型方法实例分析

    Java定义泛型方法实例分析

    这篇文章主要介绍了Java定义泛型方法,结合实例形式分析了java定义泛型的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-07-07
  • JAVA代理,静态,动态详解

    JAVA代理,静态,动态详解

    这篇文章主要介绍了Java静态代理和动态代理总结,非常不错,具有参考借鉴价值,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09

最新评论