毕业设计-社交平台的设计与实现(二)

91 阅读2分钟

前言

在第一部分实现完依赖和一些配置后,第二部分就实现一下mybatis-plus联表查询和批量删除

一对一联表查询操作

1.在联表的类中添加要链接的类

/**
 * 多对一
 */
private User user;

2.修改一下toString,不然看不到

//添加的联表
sb.append(", user=").append(user.toString());

3. 创建自定义方法mapper

@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
    /**
     * 查询文章+标题和作者模糊查询
     * @param page
     * @param title
     * @param name
     * @return
     */
    Page<Article> getAllInnerJoinUser(
            IPage<?> page
            , @Param("title") String title
            , @Param("name") String name);
}

4. 编写对应mapper.xml文件的getAllInnerJoinUser方法

1.先写一个resultMap 实现多对一查询

<resultMap id="ResultMapAndUser" type="com.aslife.server.entity.Article">
    <id property="aid" column="aid" jdbcType="BIGINT"/>
    <result property="title" column="title" jdbcType="VARCHAR"/>
    <result property="text" column="text" jdbcType="VARCHAR"/>
    <result property="img" column="img" jdbcType="VARCHAR"/>
    <result property="goods" column="goods" jdbcType="BIGINT"/>
    <result property="uid" column="uid" jdbcType="BIGINT"/>
    <result property="deleted" column="deleted" jdbcType="TINYINT"/>
    <!--关联单个对象要使用association-->
    <association property="user" autoMapping="true">
        <id property="uid" column="uid" jdbcType="BIGINT"/>
        <result property="email" column="email" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="headimg" column="headimg" jdbcType="VARCHAR"/>
        <result property="sex" column="sex" jdbcType="VARCHAR"/>
        <result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="role" column="role" jdbcType="TINYINT"/>
        <result property="deleted" column="deleted" jdbcType="TINYINT"/>
    </association>
</resultMap>

2.实现getAllInnerJoinUser的sql

<select id="getAllInnerJoinUser" resultType="com.aslife.server.entity.Article" resultMap="ResultMapAndUser">
    SELECT
        article.aid,
        article.title,
        article.text,
        article.img,
        article.goods,
        article.deleted,
        `user`.*
    FROM
        article
            INNER JOIN
        `user`
        ON
            article.uid = `user`.uid
    WHERE
        article.title like #{title,jdbcType=VARCHAR} AND
        `user`.`name` like #{name,jdbcType=VARCHAR} AND
        article.deleted = 0

</select>

5. 实现service

1. serviceImpl

@Override
@Cacheable(cacheNames = "getArticleAll")
public Page<Article> getAll(int pageNo,int pageNum,String title, String name){
    //确定页数
    Page<Article> page = new Page<>(pageNo,pageNum);
    return mapper.getAllInnerJoinUser(page,"%"+title+"%","%"+name+"%");
}

2. service

/**
 * 获得全部Article 链接User内容 分页
 * @param pageNo
 * @param pageNum
 * @param title
 * @param name
 * @return
 */
 Page<Article> getAll(int pageNo, int pageNum , String title, String name);

6. 实现controller

@GetMapping("/getAll")
public ResponseData getAll(@ApiParam(value = "起始页面") @RequestParam(required = false,value = "page",defaultValue = "1")Integer pageNo,
                         @ApiParam(value = "每页记录数") @RequestParam(required = false,value = "limit",defaultValue = "10")Integer pageSize,
                         @ApiParam(value = "作者名字") @RequestParam(required = false,value = "name",defaultValue ="")String name,
                           @ApiParam(value = "作者名字") @RequestParam(required = false,value = "title",defaultValue ="")String title){
    ResponseData responseData = new ResponseData();
    responseData.setData(service.getAll(pageNo,pageSize,title,name));
    return responseData;
}

7. 接口测试

image.png

8. 修改article.html

image.png

9.测试网页

image.png

批量删除

1. 先创建一个config类,来帮助我们清理redis缓存

@Configuration
public class RedisConfig {
    /**
     * 自定义KeyString类型Value为Object类型的Redis操作模板
     */
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

2. 在Service中添加batchDeleted方法

/**
 * 批量逻辑删除
 * @param ids
 * @return
 */
int batchDeleted(List<String> ids);

3. 在ServiceImpl中编写batchDeleted的方法

@Override
@Transactional
public int batchDeleted(List<String> ids) {
    if (mapper.deleteBatchIds(ids)==ids.size()){
        //清空文章缓存,根据名字中的前缀,*是0或多个容易字符
        Set<String> keys = redisTemplate.keys("getArticleAll*");
        redisTemplate.delete(keys);
        return 1;
    }
    throw new RuntimeException("没有删除成功");

}

4. 在Controller中编写batchRemove

@DeleteMapping("/batchRemove/{ids}")
public ResponseData batchRemove(@ApiParam(value = "编号数组") @PathVariable("ids")String ids){
    ResponseData responseData = new ResponseData();
    List<String> idsList = new ArrayList<>();
    String[] strIds = ids.split(",");
    Collections.addAll(idsList, strIds);
    try {
        service.batchDeleted(idsList);
    }catch (RuntimeException r){
        responseData.setCode(1);
        responseData.setMsg(r.getMessage());
        return responseData;
    }
    return responseData;
}

5. 前端后台页面修改

image.png

修改成自己对应的id名

image.png

这个判断要重写

其他说明

  1. mybatis-plus中使用自定义mapper时,在参数里加一个IPage类型来实现分页,例如:
    Page<User> get( IPage<?> page );
  1. 当对数据库进行操作时要使用事务,例如@Transactional。
  2. 使用事务时抛出异常会回滚但程序就不会return了,所以要捕捉异常然后完成程序,例如:
    try {
        运行的内容;
    }catch (RuntimeException r){
        错误时操作;
        return responseData;
    }

总结

下一部分写修改和增加的内容。