MyBatis第四课动态SQL

发布时间:2024年01月24日

目录

引言:

一、动态SQL书写方式

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

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

三、标签?

四、foreach(循环操作)

?编辑

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


引言:

在我们生活中,常常会需要填写一些注册的信息,比如性别,年龄,学历啥的,假如我们不想去填写,那我们只写一个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>标签

例:

???????

???????

文章来源:https://blog.csdn.net/weixin_72953218/article/details/135565552
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。