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);
}

运行展示:

可正常留言.

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

留言存在

相关推荐
MZ_ZXD0015 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东7 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology12 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble16 分钟前
springboot的核心实现机制原理
java·spring boot·后端
Goat恶霸詹姆斯22 分钟前
mysql常用语句
数据库·mysql·oracle
人道领域24 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草1 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程1 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0801 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle