MyBatis动态sql与留言墙联系

动态sql

有时,我们需要对一下参数进行选择性的使用,如果这时创建多个接口会导致代码较为繁琐,使用动态sql来让不必要的内容不拼接进入sql语句就可以解决这种问题.

<if>标签

在添加用户时,用户可以设置昵称,密码以及年龄.

XML 复制代码
    <insert id="insert">
        insert into userinfo(username,password,age) values(#{username},#{password},#{age})
    </insert>

如果用户不想设置年龄,可以使用if标签去除age的插入.

XML 复制代码
    <insert id="insert">
        insert into userinfo(
        username,password
        <if test="age != null">
            ,age
        </if>
        ) values(
        #{username},#{password}
        <if test="age != null">
            ,#{age}
        </if>)
    </insert>

if标签的test属性中放入Java对象的属性,当age不存在时,if的内容,age或,#{age}也不会拼接进sql中,从而打到选择性插入的效果.

java 复制代码
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("ceshi");
        userInfo.setPassword("123456");
        //不输入age
        //userInfo.setAge(18);
        mapper.insert(userInfo);
    }

成功插入.

<trim>标签

之前的插⼊用户功能,只是有⼀个age字段可能是选填项,如果有多个字段,⼀般考虑使⽤标签结

合标签,对多个字段都采取动态⽣成的⽅式.trim标签包含以下属性:

prefix:表⽰整个语句块,以prefix的值作为前缀

suffix:表⽰整个语句块,以suffix的值作为后缀

prefixOverrides:表⽰整个语句块要去除掉的前缀

suffixOverrides:表⽰整个语句块要去除掉的后缀

选择性插入多个属性的用户:

XML 复制代码
<insert id="insert">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            username,password,
            <if test="age != null">
                age,
            </if>
            <if test="gender != null">
                gender,
            </if>
            <if test="phone != null">
                phone,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            #{username},#{password},
            <if test="age != null">
                #{age},
            </if>
            <if test="gender != null">
                #{gender},
            </if>
            <if test="phone != null">
                #{phone},
            </if>
        </trim>
    </insert>
java 复制代码
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("ceshi");
        userInfo.setPassword("123456");
        //不输入age
        //userInfo.setAge(18);
        userInfo.setGender(1);
        //不输入电话号码
        //userInfo.setPhone("123555");
        mapper.insert(userInfo);
    }

插入成功.

trim会基于prefix配置,开始部分加上 ( ,基于suffix配置,结束部分加上 ) ,多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于suffixOverrides配置去掉最后⼀个 ,

<where>标签

where标签会在标签位置生成一个where,并且去除标签内部最开始的and.

XML 复制代码
    <select id="selectByIdAndName" resultType="com.springboot.mybatis.model.UserInfo">
        select * from userinfo
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="username != null">
                and username = #{username}
            </if>
        </where>
    </select>

<set>标签

set标签会在标签位置生成一个set,并删除内容的最后一个逗号.

XML 复制代码
    <update id="updateById">
        update userinfo
        <set>
            <if test="id != null">
                age = 98,
            </if>
        </set>
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
        </where>
    </update>

更新成功.

<foreach>标签

对集合进⾏遍历时可以使⽤foreach标签.标签有这些属性:

collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象

item:遍历时的每⼀个对象

open:语句块开头的字符串

close:语句块结束的字符串

separator:每次遍历之间间隔的字符串

根据用户id列表,删除多个用户:

XML 复制代码
    <delete id="deleteById">
        delete from userinfo where
        id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>

删除成功.

<include>标签与<sql>标签

include标签与sql标签所做的事类似函数,在某处声明一些内容,然后根据片段名进行使用.

先使用sql标签定义可重用的sql片段,id属性来定义片段名.

再使用include标签进行复用,使用refid属性来指定片段.

XML 复制代码
    <sql id="test">
        select * from userinfo
    </sql>
    <select id="selectAll" resultType="com.springboot.mybatis.model.UserInfo">
        <include refid="test"></include>
    </select>

留言板练习

Spring MVC练习:留言板-CSDN博客

之前的留言板练习,没有后台数据库,所有留言都存留在内存中,当服务器重启,留言就会消失.结合mybatis内容对留言板练习进行重做.

后端代码对Message进行重写,添加与数据库的交互.

java 复制代码
@RestController
@RequestMapping("/message")
public class Message {
    @Autowired
    MessageService messageService;

    @RequestMapping("/getList")
    public List<MessageInfo> getList() {
        return messageService.getList();
    }

    @RequestMapping("/publish")
    public boolean publish(MessageInfo messageInfo) {
        System.out.println(messageInfo);
        if(!StringUtils.hasLength(messageInfo.getFrom())
            || !StringUtils.hasLength(messageInfo.getTo())
            || !StringUtils.hasLength(messageInfo.getMessage())) {
            //其中一个为空
            return false;
        }
        messageService.insertMessage(messageInfo);
        return true;
    }
}
java 复制代码
@Service
public class MessageService {
    @Autowired
    private MassageInfoMapper mapper;

    public List<MessageInfo> getList() {
        return mapper.selectAll();
    }

    public void insertMessage(MessageInfo messageInfo) {
        mapper.insertMessage(messageInfo);
    }
}
java 复制代码
@Mapper
public interface MassageInfoMapper {
    @Select("select * from messageinfo")
    List<MessageInfo> selectAll();

    @Insert("insert into messageinfo(`from`,`to`,message) values(#{from},#{to},#{message})")
    Integer insertMessage(MessageInfo messageInfo);
}

运行展示:

可正常留言.

重启服务器并再次访问页面,观察留言是否存留.

留言存在

相关推荐
Goldn.15 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
极限实验室15 小时前
APM(一):Skywalking 与 Easyearch 集成
数据库·云原生
饕餮争锋16 小时前
SQL条件中WHERE 1=1 的功能
数据库·sql
玄斎16 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
李慕婉学姐16 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_7400437317 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖17 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
编程小Y17 小时前
MySQL 与 MCP 集成全解析(核心原理 + 实战步骤 + 应用场景)
数据库·mysql·adb
未若君雅裁17 小时前
JVM面试篇总结
java·jvm·面试
kk哥889917 小时前
C++ 对象 核心介绍
java·jvm·c++