springboot+mybatis+security搭建个人博客的第二天(小白开发经验分享)

今天是搭建博客系统的第二天。完成的工作量比较少。上午对接了一台外卖小票打印机(另一个项目,github可参考微信外卖小程序),下午上课,现在感觉发际线都遭不住了。

到目前为止,个人正式参与开发的项目只有一个,即微信外卖小程序。现在已经到前后端对接测试接口的部分,因为甲方的原因工期一直延长…另外还有几个以学习的目的参与其中的项目,一个团队信息管理系统(未开发完)、一个学校的开放性试验管理系统(学长带我,自己作用不是很大哈哈哈)

今天想分享的重点不是代码,是一些自己参与项目和看学长他们做项目获得的经验

项目开始

当学完主流框架和一些技术栈之后,大家都能达到一个能开发的地步,可真的上手项目,还是觉得无从下手。通过自己的一些个人经验还有和学长他们的交流。我有以下几点经验跟大家分享(本人在校大学生,如果有不成熟的想法,希望各位大佬指出,也欢迎志同道合的朋友一起交流学习 本人qq 1056024860)

1. 写好需求文档
这可能是很多程序猿,尤其像我这种入门没多久的猿类很头疼的一个问题。代码知道怎么写,但是对于需求文档就是一头雾水,其实有了需求文档你就知道要干什么,你的controller层到底是为什么而服务就一目了然,所以,还是得花功夫在Word上面呀。

2. 设计数据库
数据库的字段名以及长度,数据类型的修改次数,决定了以后要修改代码的数目多少。俗话说:“万丈高楼平地起”,对于后端来说,数据库可能就是大家的地基。目前接触到的项目主要还是对数据的增删改查,性能的优化可能不会去考虑。但是以后面对高并发,多线程,还是得多加准备。(昨天买的高性能mysql刚到,等会还要啃…)

3. 利用工具
工具用得好,效率也就提了上去。举个栗子:以前刚学会mybatis的时候 第一步:建表、第二步:写数据库对应的实体类、第三步:写mapper.xml文件,一不小心写错一个数据类型或字段名,就得折腾好久。但是现在有了mybatis自动化工具之后,很多实体类都不用自己写。包括dao mapper,都是自动生成。提高了不少效率。

4. 开发流程
以前我的开发过程是这样的。

  1. 写实体类
  2. 写config文件
  3. 开发dao层
  4. 开发service层
  5. 写controller

导致Controller层里边 想起来什么写什么,效率及其低下,在跟着学长参与了一个项目以后。我发现学长他们的开发过程一般是

  1. 建表
  2. 使用自动化工具
  3. 开发controller(因为controller层跟service没有多少关系,一开始的方法定义为void)
  4. 开发service

到后边service和controller一目了然,这次我的博客开发也是这个样子,

举个栗子

RestController
@RequestMapping("/article")
@Api(tags = "文章管理接口")
public class ArticleController {

    @PostMapping(name = "上传文章", value = "/insertArticle")
    public void insertArticle() {
    }

    @PostMapping(name = "删除文章", value = "/deleteArticle")
    public void deleteArticle() {
    }

    @PostMapping(name = "更改文章", value = "/updateArticle")
    public void updateArticle() {
    }

    @PostMapping(name = "获得所有文章", value = "/selectAll")
    public void selectAllArticle() {
    }

    @PostMapping(name = "根据标签查询文章", value = "/selectArticleByTags")
    public void selectArticleByTags() {
    }

    @PostMapping(name = "根据种类查询文章", value = "/selectArticleByTypes")
    public void selectArticleByTypes() {
    }
}

今日份代码分享

封装redis

@Service
public class RedisService {
    @Autowired
    JedisPool jedisPool;

    /**
     * 清空缓存数据
     */
    public void flush() {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.flushDB();
        } finally {
            returnToPool(jedis);
        }
    }


    /**
     * 获取单个对象
     *
     * @param prefix
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T get(KeyPrefix prefix, String key, Class<T> clazz) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            String str = jedis.get(realKey);
            T t = stringToBean(str, clazz);
            return t;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 设置单个对象
     *
     * @param prefix
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    public <T> boolean set(KeyPrefix prefix, String key, T value) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String str = beanToString(value);
            if (str == null || str.length() <= 0) {
                return false;
            }
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            int seconds = prefix.expireSeconds();
            //判断是否是永不过期的从而调用不同的jedis方法
            if (seconds <= 0) {
                jedis.set(realKey, str);
            } else {
                jedis.setex(realKey, seconds, str);
            }
            return true;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 获取对象数组的缓存
     *
     * @param prefix
     * @param key
     * @param clazz
     * @return
     */
    public <T> List<T> getArraylist(KeyPrefix prefix, String key, Class<T> clazz) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            String str = jedis.get(realKey);
            List<T> list = JSONObject.parseArray(str, clazz);
            return list;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 判断是否存在
     *
     * @param prefix
     * @param key
     * @param <T>
     * @return
     */
    public <T> boolean exist(KeyPrefix prefix, String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            return jedis.exists(realKey);
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 删除
     *
     * @param prefix
     * @param key
     * @param <T>
     * @return
     */
    public <T> boolean delete(KeyPrefix prefix, String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            long ret = jedis.del(realKey);
            return ret > 0;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 增加
     *
     * @param prefix
     * @param key
     * @param <T>
     * @return
     */
    public <T> Long incr(KeyPrefix prefix, String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            return jedis.incr(realKey);
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 减少
     *
     * @param prefix
     * @param key
     * @param <T>
     * @return
     */
    public <T> Long decr(KeyPrefix prefix, String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //生成真正的key
            String realKey = prefix.getPrefix() + key;
            return jedis.decr(realKey);
        } finally {
            returnToPool(jedis);
        }
    }


    public static <T> String beanToString(T value) {
        if (value == null) {
            return null;
        }
        Class<?> clazz = value.getClass();
        if (clazz == int.class || clazz == Integer.class) {
            return "" + value;
        } else if (clazz == String.class) {
            return (String) value;
        } else if (clazz == long.class || clazz == Long.class) {
            return "" + value;
        } else if (clazz == List.class) {
            return "" + JSONArray.toJSONString(value);
        } else {
            return JSON.toJSONString(value);
        }

    }

    public static <T> T stringToBean(String str, Class<T> clazz) {
        if (str == null || str.length() <= 0) {
            return null;
        }
        if (clazz == int.class || clazz == Integer.class) {
            return (T) Integer.valueOf(str);
        } else if (clazz == String.class) {
            return (T) str;
        } else if (clazz == long.class || clazz == Long.class) {
            return (T) Long.valueOf(str);
        } else if (clazz == List.class) {
            return JSONArray.parseObject(str, clazz);
        } else {
            return JSON.toJavaObject(JSON.parseObject(str), clazz);
        }
    }

    private void returnToPool(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}

keyPrefix


public interface KeyPrefix {
    /**
     * 获取过期时间
     *
     */
    int expireSeconds();

    /**
     * 获取key前缀
     *
     */
    String getPrefix();
}

抽象类BasePrefix

public abstract class BasePrefix implements KeyPrefix {

    private int expireSeconds;
    private String prefix;

    public BasePrefix(String prefix) {
        this(0, prefix);
    }

    public BasePrefix(int expireSeconds, String prefix) {
        this.expireSeconds = expireSeconds;
        this.prefix = prefix;
    }

    @Override
    public int expireSeconds() {
        return this.expireSeconds;
    }

    @Override
    public String getPrefix() {
        return this.prefix;
    }
}

ArticleKey

public class ArticleKey extends BasePrefix {
    public ArticleKey(int expireSeconds, String prefix) {
        super(expireSeconds, prefix);
    }
    public static ArticleKey articleKey = new  ArticleKey(400,"title");
}

ArticleService

public interface ArticleService {

    /**
     * 添加
     *
     * @param article
     * @return boolean
     * @author hobo
     */
    boolean insert(Article article);

    /**
     * 更新
     *
     * @param article
     * @return boolean
     * @author hobo
     */
    boolean update(Article article);

    /**
     * 删除
     *
     * @param id
     * @return boolean
     * @author hobo
     */
    boolean delete(Long id);

    /**
     * 上传一篇博客
     *
     * @param article
     * @return java.lang.Object
     * @author hobo
     */
    ResultVO insertArticle(Article article);

    /**
     * 修改一篇博客
     *
     * @param article
     * @author hobo
     * @return com.swpu.uchain.blog.vo.ResultVO
     */
    ResultVO updateArticle(Article article);

    /**
     * 删除一篇博客
     *
     * @param article
     * @return
     */
    ResultVO deleteArticle(Article article);

}

ArticleServiceImpl

public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper;

    @Autowired
    private RedisService redisService;

    @Override
    public boolean insert(Article article) {
        if (articleMapper.insert(article) == 1) {
            redisService.set(ArticleKey.articleKey, article.getTitle(), article);
            return true;
        }
        return false;
    }

    @Override
    public boolean update(Article article) {
        if (articleMapper.updateByPrimaryKey(article) == 1) {
            redisService.set(ArticleKey.articleKey, article.getTitle(), article);
            return true;
        }
        return false;
    }

    @Override
    public boolean delete(Long id) {
        redisService.delete(ArticleKey.articleKey, id + "");
        return (articleMapper.deleteByPrimaryKey(id) == 1);
    }

    public Article findArticleByTitle(String title){
        return articleMapper.selectByArticleTitle(title);
    }

    @Override
    public ResultVO insertArticle(Article article) {
        return null;
    }

    @Override
    public ResultVO updateArticle(Article article) {
        return null;
    }

    @Override
    public ResultVO deleteArticle(Article article) {
        return null;
    }
}

项目github传送门 https://github.com/TreasureJade/blog
qq:1056024860

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值