【SSM框架】Mybatis详解09(源码自取)之动态sql详解

简介: 上一节我们复习了优化注册,#{}与¥{}区别,返回主键,UUID这一节我们复习动态sql和我一起复习下去你可以获得一个比较完美框架demo,并且深刻体会框架。坚持到最后的源码解析你会收获更多哦,加油坚持!!!

文章目录


什么是动态sql


可以定义代码片断,可以进行逻辑判断,可以进行循环处理(批量处理),使条件判断更为简单.

我们假设一个场景,如果我们需要利用姓名模糊搜索或者需要利用性别进行搜索,或者我们需要两个条件同时进行限制搜索

我们知道为了防止sql注入,我们使用的都是预编译的语句,我们的sql语句就要写三套。那么mybatis就很方便的为我们提供了自动判断自动修改sql语句的方式,使我们的工作更加方便。


标签详解



1):用来定义代码片断,可以将所有的列名,或复杂的条件定义为代码片断,供使用时调用.


2):用来引用定义的代码片断.

<!--定义代码片断-->
    <sql id="allColumns">
        id,username,birthday,sex,address
    </sql>
   //引用定义好的代码片断
   <select id="getAll" resultType="users" >
        select <include refid="allColumns"></include>
        from users
    </select>


3):进行条件判断

test条件判断的取值可以是实体类的成员变量,可以是map的key,可以是@Param注解的名称.


4):进行多条件拼接,在查询,删除,更新中使用.


<!--UserMapper.xml文件中-->
    <select id="getByCondition" parameterType="users" resultType="users">
        select <include refid="allColumns"></include>
        from users
        <where>
            <if test="userName != null and userName != ''">
               and username like concat('%',#{userName},'%')
            </if>
            <if test="birthday != null">
               and birthday = #{birthday}
            </if>
            <if test="sex != null and sex != ''">
               and sex = #{sex}
            </if>
            <if test="address != null and address != ''">
                and address like concat('%',#{address},'%')
            </if>
        </where>
    </select>

我们看一下输入不同的查询值的sql语句的不同

当我们什么条件都没有输入,就会查询全部

当我们输入了性别,可以看到我们的语句是这样的

当我们由加入地区的模糊查询,sql语句是这样的


这就是动态sql给我们提供的便利,我们只需要输入我们的条件就好了,mybatis可以自动为我们调整sql语句

我们在做模糊查询的时候的一个细节:我们尽量使用concat()函数进行字符串的拼接,而不是直接like ‘xxxx’,在我们使用函数的时候更加安全方便


5):有选择的进行更新处理,至少更新一列.能够保证如果没有传值进来,则数据库中的数据保持不变.

这里我们需要更新的话,我们就要把这一行的所有指标都赋值,才能完成更新。如果我们只赋值一个属性(只传入我们需要修改的属性)那么其他没赋值的就变成null了。我们来看一下



正常我们需要给所有指标(属性),全部赋值可以完成更新,那么我们试试只赋值一个属性的情况

一定要记得在我们的实体类增加新的构造方法哦,不然构造会报错哦

运行看结果

这里运行成功了,细心的小伙伴已经发现问题了,我们看看数据库里面吧,显然易见


本来我只想修改名字,其他的不需要修改的我不想动,我还就只想输入我想修改的值,其他的为啥变成了NULL呢???那么这里标签来帮助你,代码如下:

<update id="updateBySet" parameterType="users">
        update users
        <set>
            <if test="userName != null and userName != ''">
               username = #{userName},
            </if>
            <if test="birthday != null">
                birthday = #{birthday},
            </if>
            <if test="sex != null and sex != ''">
                sex = #{sex},
            </if>
            <if test="address != null and address != ''">
                address =#{address} ,
            </if>
        </set>
        where id = #{id}
    </update>

我们来看结果吧


这下我们的目的就达到了,完美解决


6):用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新.

<!--查询实现-->
    <select id="getByIds" resultType="users">
        select <include refid="allColumns"></include>
        from users
        where id in
           <foreach collection="array" item="id" separator="," open="(" close=")">
               #{id}
           </foreach>
    </select>

参数详解:

collection:用来指定入参的类型,如果是List集合,则为list,如果是Map集合,则为map,如果是数组,则为array.

item:每次循环遍历出来的值或对象

separator:多个值或对象或语句之间的分隔符

open:整个循环外面的前括号

close:整个循环外面的后括号


<!--批量删除实现-->
    <delete id="deleteBatch" >
        delete from users
        where id in
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    <!--批量增加实现-->
    <insert id="insertBatch">
        insert into users(username, birthday, sex, address) values
        <foreach collection="list" item="u" separator="," >
            (#{u.userName},#{u.birthday},#{u.sex},#{u.address})
        </foreach>
    </insert>

这里就只展示批量增加吧


✨总结


动态sql可以极大的简化我们sql的编写量,也是必须要掌握的东西哦!!!

下一节我们将继续复习指定参数位置,入参是map(重点掌握) ,返回值是map

本次源码放在代码仓库gitee,自取链接

相关文章
|
1月前
|
SQL Java 数据库
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
|
30天前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
30天前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
12 0
|
1月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
158 0
|
1月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
1月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
29天前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
3月前
|
前端开发 JavaScript Java
计算机Java项目|SSM智能仓储系统
计算机Java项目|SSM智能仓储系统
|
1月前
|
SQL Java 应用服务中间件
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
这篇文章是关于如何使用SSM框架搭建图书商城管理系统的教程,包括完整过程介绍、常见问题解答和售后服务,提供了项目地址、运行环境配置、效果图展示以及运行代码的步骤。
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
|
2月前
|
存储 关系型数据库 测试技术
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)(2)
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)
33 1