0
点赞
收藏
分享

微信扫一扫

小而美的个人博客项目总结(mybatis)

googlefrank 2022-03-30 阅读 82
java

在b站上跟着李仁密老师学习了项目后,我将jpa改造成了mybatis,其中也遇到了很多问题,以下是个人对该项目后端部分的一些总结

代码已上传至git

git地址 https://github.com/XuWu123d/blog

# 个人博客项目

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNTU3MzI4MDY=,size_20,color_FFFFFF,t_70,g_se,x_16

## 难点(也是踩坑比较多的地方):  

**1.博客评论功能踩坑**:我是建立了一个新的博客详情的实体类,其中有评论区的子父评论关系。目的是无论回复循环嵌套多少次,将它们变成二级目录结构。在做评论对应关系处理时我只添加了回复与被回复者id对应关系,但是前端部分有@功能,这个是要显示被回复者名称的,所以还要添加评论之间昵称的对应关系,这样前端才能拿到。  

** 2.博客评论功能实现:**遍历评论表中的parentId,如果为空,表面是顶级评论,将其循环拿出单个顶级评论,再去遍历parentId为该顶级评论id的评论,这些评论就是回复了顶级评论的,是一级子评论。然后拿到顶级评论昵称,设置进一级评论中。再去循环一级评论,一样的操作,以此类推。注意,要建立一个临时存储评论的列表,将一级评论及其子评论加入其中,然后作为顶级评论的子评论,这样就实现了二级评论功能  

**3.对多对多表之间的处理**。blog表与tag表是多对多之间的关系,有一个中间blog_tag,在添加数据时发现根据标签查不到博客,看了表之后发现中间表没有对应关系。于是在添加博客中先将传入的多个tagId在service层以“,”形式进行分隔(用户传入的id是“1,2,3”形式,刚开始用了StringBuilder拼接成“123”,很有问题),将id一个个获取出来。在这之前还要获取blogId,由于博客id是在数据库自动生成的。一开始我想先数据传入生成blog后再查询数据库获取id,但行不通,于是百度发现mybatis框架可以添加博客数据并返回id,然后拿到博客id和标签id就可以往中间表添加数据mybatis返回创建blog自动生成id将id结果返回实现:useGeneratedKeys="true"表示设置属性自增,keyProperty="id"表示设置主键的字段。<insert></insert>没有返回属性(resultType),但是里面的<selectKey></selectKey>是有返回值类型的,它可以将创建好的博客id传递给我们

<insert id="saveBlog" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.blogofmybatis.pojo.Blog">        

insert into t_blog values(#{id},                            #{appreciation},#{commentTabled},                 #{content},#{createTime},#{description},        #{firstPicture},#{flag},#{published},                  #{recommend},#{shareStatement},#{title},      #{updateTime},#{views},#{typeId},#{userId});        <selectKey resultType="Long" keyProperty="id" order="AFTER">            

select LAST_INSERT_ID();      

 </selectKey>  

 </insert>

这样,中间表就可以与博客和标签进行对应了**注意:**对博客进行删除时,由于有中间表,因此在删除之前要将中间表中有关博客的信息删除,然后再删除博客

对博客进行修改时,我是先获取到博客的id,然后将中间表中对应的信息删除,再接收用户传入的标签信息,添加至中间表

4.博客标签界面问题的处理:**根据博客标签查询博客时,博客中只能显示分类时的这一个标签,而不能显示博客对应的所有标签

**修改之前** 只是根据分类时的标签查询博客内容,当然只能显示分类时的这一个标签    

select distinct b.id,b.title,b.content,b.first_picture,b.views, b.description,b.create_time,b.update_time,       t.name,                                                               a.id as tid,a.name as tname,                        u.nick_name,u.avatar                                     from t_blog b,t_type t,t_user u,t_tag a, t_tag_blogs tb                                               where b.type_id=t.id and b.user_id=u.id and b.id=tb.blogs_id and a.id=tb.tag_id and a.id=#{id};

**修改之后**将分类时的标签查询满足要求的博客id,再根据id查询博客相关信息用到了子查询,一开始,我对于子查询中查询出多个结果有一点不知道如何处理(还是太菜了),想了一会想到了in(),这样就解决了这个问题

select distinct b.id,b.title,b.content,b.first_picture,b.views, b.description,b.create_time,b.update_time,       t.name,                                                                a.id as tid,a.name as tname,                        u.nick_name,u.avatar                                    from t_blog b,t_type t,t_user u,t_tag a,t_tag_blogs tb                                            where b.type_id=t.id and b.user_id=u.id and b.id=tb.blogs_id and a.id=tb.tag_id and b.id in   (select b.id from t_blog b,t_tag a,t_tag_blogs tb where b.id=tb.blogs_id and a.id=tb.tag_id and a.id=#{id})                                               order by create_time desc;

收获:1.真正理解到实体类对象与数据库字段一一对应,以前认为实体类只能有一个,比如有一张博客表,项目实体类就只能有一个博客实体类。其实不然,项目实体类可以存在多个,主要根据sql语句查询情况确定,比如要查两张表中的部分字段,那么就可以新建一个实体类,将实体类的属性与表中字段进行对应。如果遇到聚合等表中不存在的字段查询,可以用as重命名,此时重命名的为表中字段,然后建立对应实体类即可。

2.学会了对评论区二级评论的处理,将它们进行添加并展示处理

3.学会了多对多表的维护

4.提高了我的逻辑编码能力和sql语句的编写能力

 

 

 

 

举报

相关推荐

0 条评论