1.仿小程序「朕正有词」项目:喜欢功能

作者: gu_lao_rou-p 分类: springBoot,项目 发布时间: 2022-01-23 12:26

1.获取指定数据

实现功能:

  • 如果有人点赞则like表里的status变成1,再次点击则变成0,以此往复
  • 如果数据库里没有这个人对某个词条的点赞记录,则创建出,这样数据库的压力会小很多,不然每创建一个用户,就要对所有词条进行一个点赞功能的记录

根据以上分析,需要一个select语句,用于查询,这个用户和这个词条有没有记录

如果没有记录,则创造出一个,这里需要一个insert语句

如果有记录了,则更改记录,这里需要一个update语句

req文件:

package com.example.test.req;
//敲出两个字段,user_id和citiao_id,然后使用Getter and Setter方法就可以了
public class LikeReq {
    private int user_id;

    private int citiao_id;

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public int getCitiao_id() {
        return citiao_id;
    }

    public void setCitiao_id(int citiao_id) {
        this.citiao_id = citiao_id;
    }


}

req的讲解在翻页功能里有讲

xml文件:

1.select语句

<select id="selectLike" parameterType="com.example.test.req.LikeReq" resultMap="BaseResultMap">
    select * from `like` where citiao_id = #{citiao_id,jdbcType=INTEGER} and user_id = #{user_id,jdbcType=INTEGER}
</select>
<!--select * from(查看所有) like(表名) where(判断) citiao_id = #{前端返回的citiao_id} and(检测两项同时生效)-->
<!--user_id = #{前端返回的user_id}-->
<!--整条语句的意思是,查询出like表里的所有数据,然后拿出前端的两条数据做检索,让这条语句只会返回和前端返回数据一样的数据-->

2.insert语句

<!--注意:用的什么语句就要用什么标签,如里面是insert语句-->
<insert id="insertLike" parameterType="com.example.test.domain.Like">
    insert into `like`(status, citiao_id, user_id, create_time, update_time) values (1,# {citiaoId,jdbcType=INTEGER},#{userId,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP})
</insert>
<!--insert into(插入数据) like(表名) (status,citiao_id,user_id...这些都是要往里填字段的数据) values(插入)-->
<!--(1,#{前端返回的citiaoId,后面的INTEGER是citiaoId的类型},#{前端返回的userId},与前面同理)-->
<!--#{后端实例化的当前时间createTime},#{后端实例化的当前时间updateTime}-->
<!--valuse后面括号里的和like后面的括号里的是对应的,比如like后面的status,对应values后面的1,也就是往status里插入1的字段-->

3.update语句

<update id="updateLike" parameterType="com.example.test.domain.Like">
    update `like` set status = Not status,update_time=#{updateTime,jdbcType=TIMESTAMP} where citiao_id        = #{citiaoId,jdbcType=INTEGER} and user_id = #{userId,jdbcType=INTEGER}
</update>
<!--update(更改) like(表名) set(设置) status(字段) = Not status(因为satatus是布尔形,这样使用会让它运行这个sql语句,就变成另一个,如原本是false变成true,true变成false) -->
<!--update_time={后端返回当前时间,给update_time字段赋值} where(后面的代码和where合在一起,意思是使用后面的字段做判断)-->

mapper文件:

//因为只有一个select是需要返回数据的,所以其他两个没有定义,只是方法,用来饮用xml文件的方法
//这是select语句
Like selectLike(LikeReq req);
//这是insert语句
void insertLike(Like req);
//这是update语句
void updateLike(Like req);

service文件:

//上面应该有这条代码,不然后面使用的时候会报错
@Resource
private LikeMapper likeMapper; 

public void selectLike(LikeReq req){
    
    Like like=likeMapper.selectLike(req); 
    //把查询结果赋值给like

    //用Like实例化一个data
    Like data = new Like();
    //下面四条是往data里填入数据
    data.setUserId(req.getUser_id());
    data.setCitiaoId(req.getCitiao_id());
    //上面定义进data的数据是从前端返回的,而后面两行用的是直接使用当前时间作为数据插入
    data.setCreateTime(new Date());
    data.setUpdateTime(new Date());
    //使用ObjectUtils里的isEmpty方法判断like是否为空,而不是用data
    if(ObjectUtils.isEmpty(like)) { 
    // 查询数据库是否有符合条件的数据
        //Todo 如果没有就新增一条记录
        likeMapper.insertLike(data);

    }else {
        //Todo 如果有就改变status的状态0or1
        likeMapper.updateLike(data);
    }
}

controller文件:

//拆开来看Get就是请求方式,而Mapping和括号里面的就是请求路径
@GetMapping("/like")
//这边使用R泛类型,如果没有异常情况,所有controller方法都会用到泛类型
//使用LikeReq声明一个req
public R selectLike(LikeReq req){
    //用R实例化一个r
    R r = new R<>();
    //调用service里的selectLike方法
    citiaoSerice.selectLike(req);
    //向前端返回r
    return r;
}

Warning: Undefined variable $aria_req in /www/wwwroot/l.lvovl.cn/wp-content/themes/JieStyle-Two-master/comments.php on line 26

Warning: Undefined variable $aria_req in /www/wwwroot/l.lvovl.cn/wp-content/themes/JieStyle-Two-master/comments.php on line 27

Warning: Undefined variable $aria_req in /www/wwwroot/l.lvovl.cn/wp-content/themes/JieStyle-Two-master/comments.php on line 28
标签云