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

运行展示:

可正常留言.

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

留言存在

相关推荐
Cherry的跨界思维9 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_9910 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子10 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji341610 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
1.14(java)10 小时前
SQL数据库操作:从CRUD到高级查询
数据库
恋爱绝缘体111 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
xiaolyuh12311 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
wszy180911 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
Full Stack Developme11 小时前
数据库索引的原理及类型和应用场景
数据库
wszy180911 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos