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>标签

例:

相关文章
|
4月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
4天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
24 11
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
25天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
53 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
67 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
下一篇
DataWorks