MyBatis动态sql与留言墙联系

动态sql

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

        <if>标签

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

    <insert id="insert">
        insert into userinfo(username,password,age) values(#{username},#{password},#{age})
    </insert>

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

    <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中,从而打到选择性插入的效果.

    @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:表⽰整个语句块要去除掉的后缀

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

<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>
    @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.

    <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,并删除内容的最后一个逗号.

    <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列表,删除多个用户:

    <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属性来指定片段.

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

留言板练习

        Spring MVC练习:留言板-优快云博客

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

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

@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;
    }
}
@Service
public class MessageService {
    @Autowired
    private MassageInfoMapper mapper;

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

    public void insertMessage(MessageInfo messageInfo) {
        mapper.insertMessage(messageInfo);
    }
}
@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);
}

        运行展示:

        可正常留言.

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

        留言存在

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值