java点赞功能实现_JavaWeb中点赞功能的实现及完整实例
實(shí)現(xiàn)原理
1、功能描述:一個用戶對同一文章只能點(diǎn)贊一次,第二次就是取消贊
2、建立一個點(diǎn)贊表great,字段有文章ID(aid),點(diǎn)贊用戶ID(uid)
3、當(dāng)有用戶進(jìn)行點(diǎn)贊行為時(shí),使用aid和uid搜索點(diǎn)贊表。
若有該記錄,則表示用戶已經(jīng)點(diǎn)過贊,本次點(diǎn)擊是取消點(diǎn)贊行為,故刪除great表中的該條記錄,同時(shí)將該文章的點(diǎn)贊數(shù)減1。
若無該記錄,則表示用戶是要點(diǎn)贊,故在great表中添加該記錄,同時(shí)該文章的點(diǎn)贊數(shù)加1。
核心代碼分析
核心控制器BaseController:
@Controller
public class BaseController {
private final GreatRepository greatRepository;
private final ArticleRepository articleRepository;
//Spring團(tuán)隊(duì)推薦的做法是用構(gòu)造器來引入依賴,[email?protected]
@Autowired
public BaseController(GreatRepository greatRepository,
ArticleRepository articleRepository) {
this.greatRepository = greatRepository;
this.articleRepository=articleRepository;
}
@RequestMapping({"/","/index"})
public String index(){
return "index";
}
//添加事務(wù)支持
@Transactional
@RequestMapping("/great")
public String great(@Param("aid") int aid, @Param("uid") int uid, Model model){
//查詢是否有該用戶對該文章的點(diǎn)贊記錄
List list=greatRepository.findByAidAndUid(aid,uid);
if (list!=null && list.size()>0){
//如果找到了這條記錄,則刪除該記錄,同時(shí)文章的點(diǎn)贊數(shù)減1
Great great=list.get(0);
//刪除記錄
greatRepository.delete(great.getId());
//文章點(diǎn)贊數(shù)減1,查詢時(shí)使用Mysql行級鎖解決并發(fā)覆蓋問題
Article article=articleRepository.findByIdForUpdate(aid);
article.setGreatNum(article.getGreatNum()-1);
articleRepository.saveAndFlush(article);
}else {
//如果沒有找到這條記錄,則添加這條記錄,同時(shí)文章點(diǎn)贊數(shù)加1
Great great=new Great();
great.setAid(aid);
great.setUid(uid);
//添加記錄
greatRepository.saveAndFlush(great);
//文章點(diǎn)贊數(shù)加1,查詢時(shí)使用Mysql行級鎖解決并發(fā)覆蓋問題
Article article=articleRepository.findByIdForUpdate(aid);
article.setGreatNum(article.getGreatNum()+1);
articleRepository.saveAndFlush(article);
}
model.addAttribute("details",articleRepository.findAll());
return "detail";
}
}
Aritcle實(shí)體的持久化倉庫ArticleRepository
@Repository
public interface ArticleRepository extends JpaRepository{
@Lock(value = LockModeType.PESSIMISTIC_WRITE)
Article findByIdForUpdate(Integer id);
}
[email?protected] [email?protected]�鎖,在事務(wù)中,該行級鎖能解決對同一條記錄的并發(fā)修改問題。
代碼中已經(jīng)附有詳細(xì)注解
完整實(shí)例的相關(guān)信息
為了突出重點(diǎn),項(xiàng)目前端較為簡陋,功能已經(jīng)通過測試。
項(xiàng)目采用的框架:
1、容器框架:SpringBoot
2、持久層框架:Spring Data JPA
3、渲染框架:Thymeleaf
4、版本控制:Git
5、依賴:Maven
6、數(shù)據(jù)庫:Mysql
數(shù)據(jù)庫建表文件Schema.sql:
DROP TABLE IF EXISTS `article`;
/*!40101 SET @saved_cs_client???? = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` int(11) DEFAULT ‘0‘,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `article`
--
LOCK TABLES `article` WRITE;
/*!40000 ALTER TABLE `article` DISABLE KEYS */;
INSERT INTO `article` VALUES (1,1),(2,0);
/*!40000 ALTER TABLE `article` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `great`
--
DROP TABLE IF EXISTS `great`;
/*!40101 SET @saved_cs_client???? = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `great` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `great`
--
LOCK TABLES `great` WRITE;
/*!40000 ALTER TABLE `great` DISABLE KEYS */;
INSERT INTO `great` VALUES (5,1,1);
/*!40000 ALTER TABLE `great` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET [email?protected]_TIME_ZONE */;
特別說明:本文章的目的只是單純向大家說明點(diǎn)贊這個功能的實(shí)現(xiàn)思路。為了保證邏輯盡量清晰和簡單,因而并沒有涉及到性能優(yōu)化。示例代碼中的鎖機(jī)制能保證并發(fā)訪問下的安全性,但會對系統(tǒng)并發(fā)性能產(chǎn)生一定的影響,但在一般系統(tǒng)中,由于大量用戶同時(shí)對同一文章集中點(diǎn)贊的情況并不常見,因此性能損耗扔在可以接受的范圍內(nèi)。
如果大家在使用過程中確實(shí)有高并發(fā)的需要,那么可以考慮使用Redis這類緩存數(shù)據(jù)庫來替代mysql。Redis是高性能的內(nèi)存KV數(shù)據(jù)庫,且是單線程運(yùn)行的,因此性能和安全性問題都能得到完美的解決。
關(guān)于JPA中如何使用行級鎖,可以參考這篇文章:https://blog.csdn.net/fengyuxue11011/article/details/47039765
原文:https://www.cnblogs.com/snake23/p/11096752.html
總結(jié)
以上是生活随笔為你收集整理的java点赞功能实现_JavaWeb中点赞功能的实现及完整实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: exhaustion java_Java
- 下一篇: u盘 轻量linux,3种方法来创建轻量