MyBatis第四课动态SQL

简介: MyBatis第四课动态SQL

引言:

在我们生活中,常常会需要填写一些注册的信息,比如性别,年龄,学历啥的,假如我们不想去填写,那我们只写一个SQL的增加语句是不是就不对了呢。这时候我们就需要根据用户的输入情况,进行插入,下面为这种情况的例子

这时候我们需要根据需求,动态的拼接SQL:动态SQL

insert into userInfo(username, password,age,gender,phone) values(?,?,?,?,?);
 
insert into userInfo( password,age,gender,phone) values(?,?,?,?);
insert into userInfo(age,gender,phone) values(?,?,?);

一、动态SQL书写方式

注解

1.把全部的sql放到script标签下面

2.使用if标签

判断条件

里面写的是java对象的属性

@Mapper
public interface UserInfo2Mapper {
    //动态SQL练习
    //假如此时性别是否为空
    //Insert into userinfo(username,password,age,gender,phone) values(#{username},#{password},#{age],#{gender},#{phone})
//gender对应的是java的属性,而不是数据库的
    @Insert("<script>" +
            "Insert into userinfo(username,password,age," +
            "<if test='gender!=null'>gender,</if>" +
            "phone)" +
            "values(#{username},#{password},#{age}," +
//下面这个也是java的属性
            "<if test='gender!=null'>#{gender},</if>" +
            "#{phone})" +
            "</script>")
    Integer insert(UserInfo userInfo);

使用xml的方式实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.myBatis.mapper.UserInfoXMLMapper">
<insert id="insertByXML">
    insert  into userInfo(username,password,age,
                          <if test="gender!=null" >gender</if>,phone)
                          values(#{username},#{password},#{age}
                          ,<if test='gender!=null'>#{gender},</if>
                          #{phone})
</insert>
</mapper>

如何选择:

1.先看公司/团队,是否有要求

2.看同事咋写

二、<trim>会帮我们处理多余的字符

当我们不去写性别的时候,会发现问题

原因就是书写这里的时候,如果把性别注释掉,就会多一个and,所以,我们选择使用trim标签。

方法2:使用where也可以进行消除and,但是出现的问题

由自己的实现得出;假如这样where能够对and进行去除(不写username的情况下)

select*from <where>      
                           <if test="username!=null">
                           username=#{username}
                           </if>                           
                           <if test="age!=null">
                           and age=#{age}
                           </if>
                           <if test="gender!=null">
                           and   gender=#{gender}
<where>

但是假如是这种情况(不写gender的情况)

trim的缺点:假如所有条件都为空的情况下,SQL语句变成

select*from userinfo where 后面就没有了

当然也有解决方法

select *from  userInfo where 1=1  
<trim>省略</trim>

(如果查询条件为空,where标签会自动去除where关键字,各有好坏,依据情况定)

select*from <where> 
                           <if test="username!=null">
                           username=#{username} and
                           </if>                           
                           <if test="age!=null">
                           age=#{age}     and
                           </if>
                           <if test="gender!=null">
                           and   gender=#{gender}
<where>

三、<Set>标签

set标签也可以与where一样,起到一定的去除作用。

<update id="updateByCondition">
        update userInfo
        <set>
<!--        <trim suffixOverrides=",">-->
        <if test="username!=null">
            username=#{username},
        </if>
        <if test="age!=null">
            age=#{age},
        </if>
        <if test=" gender!=null">
            gender=#{gender}
        </if>
<!--        </trim>-->
        </set>
            where id=9
    </update>

四、foreach(循环操作)

Mybatis传递List集合报错 Available parameters are [collection, list]

发现了一个奇怪的问题,当我传递List的时候,不知道为什么一直报这个错,开始在想是不是哪里打错了,后来再去搜索发现是下面这个原理

前任栽树:

当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。  

换句话说当我们传递集合的时候,假如不加上这个@Param这个,编译器是无法根据你的名字来去识别你的xml文件中sql选择的id,那么对应xml里面的SQL语句就无法实现))

————————————————

版权声明:本文为CSDN博主「發V發」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/sinat_28978689/article/details/79406832

当这个样子改完之后,问题就成功解决啦~。

<sql>和<include>

把一些重复的sql可以提取出来,使用<sql>标签来标识,使用的时候使用<include>标签

例:

相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1798 0
|
10月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
570 18
|
10月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
458 0
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1256 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
SQL XML Java
九、MyBatis动态SQL
九、MyBatis动态SQL
286 2
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
2025 6
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
1014 11