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

运行展示:

可正常留言.

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

留言存在

相关推荐
初级程序员Kyle3 小时前
开始改变第五天 Java并发(1)
java
yinke小琪4 小时前
面试官:如何决定使用 HashMap 还是 TreeMap?
java·后端·面试
l0sgAi4 小时前
PageHelper-Cursor:支持游标分页的 PageHelper 修改版,解决 MyBatis 深分页性能问题
spring boot·mybatis
若疆赤云online4 小时前
SpringGateway处理跨域
java·开发语言
weixin_307779134 小时前
C#程序实现将Teradata的存储过程转换为Amazon Redshift的pgsql的存储过程
数据库·c#·云计算·运维开发·aws
青~4 小时前
sql 双游标循环
数据库·sql
一辉ComeOn4 小时前
【大数据高并发核心场景实战】 数据持久化层 - 查询分离
java·大数据·数据库·elasticsearch·缓存·oracle
雾里云山4 小时前
pgsql常用函数
java·开发语言·数据库·sql
好记忆不如烂笔头abc4 小时前
通过gdb推进修改oracle scn
数据库·oracle