Mybatis 动态SQL的插入操作

2023-12-17 05:11:15

需求 : 根据用户的输入情况进行插入

动态SQL:根据需求动态拼接SQL

用户往表中插入数据,有的数据可能不想插入,比如不想让别人知道自己的性别,性别就为空

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

接下来看看 mybatis 注解的方式该如何实现动态SQL,新建了一个 userInfo2Mapper 接口

<if>标签里面的意思是 : 如果gener不为null,那就输出if标签的内容

package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserInfo2Mapper {
    @Insert("<script>" +
            " insert into userinfo(username,password,age," +
            "<if test='gender!=null'>gender,</if>" +
            "phone) " +
            "value(#{username},#{password},#{age}," +
            "<if test='gender!=null'>#{gender},</if>" +
            "#{phone})" +
            "</script>"
    )
    Integer insert(UserInfo userInfo);
}

?然后老样子,Generate,test,勾选 insert ,然后补充代码,我们先每个数据都插入内容

package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class UserInfo2MapperTest {
    @Autowired
    private UserInfo2Mapper userInfo2Mapper;
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("kiki");
        userInfo.setPassword("555www");
        userInfo.setAge(23);
        userInfo.setGender(1);
        userInfo.setPhone("177966");
        userInfo2Mapper.insert(userInfo);
    }
}

插入成功?

数据库中也能成功找到刚刚插入的数据?

接下来我们要测试性别为空的情况,把 test代码里面的 userinfo.setGender 给去掉,?再次运行

?数据库也能找到,说明性别为空也插入成功了

上面是注解的方式,接下来我们看看 XML 的方式该如何实现?

在resources 中创建 Userinfo2XMLMapper.xml 文件

然后在?userInfo2Mapper 接口 中声明这个方法

package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserInfo2Mapper {

    Integer insertByXML(UserInfo userInfo);
}

将 Userinfo2XMLMapper.xml 文件中的 namespace 进行修改,改为 userInfo2Mapper 接口中的第一行 package 的内容再加上接口名

<?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.mybatisdemo.mapper.UserInfo2Mapper">

</mapper>

然后补充代码

<?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.mybatisdemo.mapper.UserInfo2Mapper">
    <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>

再回到接口,然后Generate,test,勾选insertByXML,ok,先测试每个数据都插入的情况

package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class UserInfo2MapperTest {
    @Autowired
    private UserInfo2Mapper userInfo2Mapper;

    @Test
    void insertByXML() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("io");
        userInfo.setPassword("555www");
        userInfo.setAge(23);
        userInfo.setGender(1);
        userInfo.setPhone("177966");
        userInfo2Mapper.insertByXML(userInfo);
    }
}

成功插入

再把 userinfo.setGender 给去掉,再次运行

?

?没毛病

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