今天是搭建博客系统的第二天。完成的工作量比较少。上午对接了一台外卖小票打印机(另一个项目,github可参考微信外卖小程序),下午上课,现在感觉发际线都遭不住了。
到目前为止,个人正式参与开发的项目只有一个,即微信外卖小程序。现在已经到前后端对接测试接口的部分,因为甲方的原因工期一直延长…另外还有几个以学习的目的参与其中的项目,一个团队信息管理系统(未开发完)、一个学校的开放性试验管理系统(学长带我,自己作用不是很大哈哈哈)
今天想分享的重点不是代码,是一些自己参与项目和看学长他们做项目获得的经验
项目开始
当学完主流框架和一些技术栈之后,大家都能达到一个能开发的地步,可真的上手项目,还是觉得无从下手。通过自己的一些个人经验还有和学长他们的交流。我有以下几点经验跟大家分享(本人在校大学生,如果有不成熟的想法,希望各位大佬指出,也欢迎志同道合的朋友一起交流学习 本人qq 1056024860)
1. 写好需求文档
这可能是很多程序猿,尤其像我这种入门没多久的猿类很头疼的一个问题。代码知道怎么写,但是对于需求文档就是一头雾水,其实有了需求文档你就知道要干什么,你的controller层到底是为什么而服务就一目了然,所以,还是得花功夫在Word上面呀。
2. 设计数据库
数据库的字段名以及长度,数据类型的修改次数,决定了以后要修改代码的数目多少。俗话说:“万丈高楼平地起”,对于后端来说,数据库可能就是大家的地基。目前接触到的项目主要还是对数据的增删改查,性能的优化可能不会去考虑。但是以后面对高并发,多线程,还是得多加准备。(昨天买的高性能mysql刚到,等会还要啃…)
3. 利用工具
工具用得好,效率也就提了上去。举个栗子:以前刚学会mybatis的时候 第一步:建表、第二步:写数据库对应的实体类、第三步:写mapper.xml文件,一不小心写错一个数据类型或字段名,就得折腾好久。但是现在有了mybatis自动化工具之后,很多实体类都不用自己写。包括dao mapper,都是自动生成。提高了不少效率。
4. 开发流程
以前我的开发过程是这样的。
- 写实体类
- 写config文件
- 开发dao层
- 开发service层
- 写controller
导致Controller层里边 想起来什么写什么,效率及其低下,在跟着学长参与了一个项目以后。我发现学长他们的开发过程一般是
- 建表
- 使用自动化工具
- 开发controller(因为controller层跟service没有多少关系,一开始的方法定义为void)
- 开发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