1.仿小程序「朕正有词」项目:喜欢功能
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