【新手任务】一 springboot demo

项目场景:

提示:这里简述项目相关背景:

需求:
spring boot框架搭建 web api项目:eastmoney.demo.api
1、实现基于oracle库emdata用户表的查询接口,或者自建mongodb的user库
select * from emtxz.t_user_info
2、实现基于mongodb库,userInfo的增删改查接口,数据字段可移植2~3个t_user_info 表的关键字段即可。包括userInfo建表脚本。
3、实现基于redis缓存,userInfo的查询接口,缓存击穿后数据取mongo库的userInfo表。有缓存策略。


实现步骤

1、搭建spring boot +grandle + mongoDB框架,在build.grandle中添加相关依赖()

2、本地安装mongoDB(https://blog.csdn.net/weixin_41466575/article/details/105326230)

3、mongoDB进行相关配置,启动mongoDB(在windows资源管理器中shift+右键打开powershell ,然后执行mongod -dbpath C:\MongoDB\data\db 命令)

4、项目中补充相关mongoDB配置文件

5、写个单测康康项目和mongoDB的连接有没有问题(用studio 3T图形化mongoDB以查看是否已完成写入):

@Autowired
private MongoTemplate mongoTemplate;
 
//添加操作
@Test
public void contextLoads() {
    User user = new User();
    user.setAge(20);
    user.setName("test");
    user.setEmail("123@qq.com");
    User user1 = mongoTemplate.insert(user);
    System.out.println(user1);
}

6、用mongotemplate实现CRUD接口
7、本地安装redis()
8、项目连接redis
9、选择缓存策略

Cache Aside Pattern(旁路缓存模式)

读写步骤
写:

先更新DB。

然后直接删除cache。

(用@CacheEvict实现

读:

从cache中读取数据,读取到就直接返回。

cache中读取不到的话,就从DB读取返回。

再把数据写到cache中。

(用 @Cacheable实现

10、按照缓存策略写代码
在这里插入图片描述
在这里插入图片描述
11、测试结果

  1. 给适合做缓存的查询方法添加@Cacheable注解

     DEGUB过程中发现,如果缓存不命中,则执行查询方法内的逻辑;如果命中缓存则直接返回缓存结果
    

2)给update方法添加@CacheEvict注解

 DEBUG过程中发现,如果原本缓存中存在数据,在调用update方法后缓存中对应数据将被删除

遇到的问题

1、MongoTemplate注入失败
问题:
required a bean of type ‘org.springframework.data.mongodb.core.MongoTemplate’ that could not be found

原因:
SpringBoot的版本较高,不支持直接注入MongoTemplate,即仅使用下述内容会出现上述错误:

@Autowired
private MongoTemplate mongoTemplate;

由mongodb官方文档可知,与之前大不相同,需要手动创建MongoDB配置类:

@Configuration
public class MongoDBConfig {
@Bean
public MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(), "mydatabase");
}
}

2、

错误描述:

java.lang.NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(Ljava/lang/Object;)Lcom/mongodb/client/result/InsertOneResult;

错误原因: build.grandle 文件存在两个不同版本的依赖,版本低的可能无法正常操作MongoDB数据库

解决方法:注释低版本依赖

//mongodb
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
//implementation 'org.mongodb:mongodb-driver:3.3.0'

3、mongodb 在cmd中设置为系统服务时出错

使用命令:

mongod.exe --logpath D:\MongoDB_Data\log\mongodb.log --logappend --dbpath D:\MongoDB_Data\data --directoryperdb --serviceName MongoDB --install

4、@Cacheable配置序列化方式?

可以重写RedisCacheConfiguration:

/设置@Cacheable序列化方式

@Bean
public RedisCacheConfiguration redisCacheConfiguration(){
 FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
 RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
 configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30));
 return configuration;
}

5、配置Mongotemplate去掉库表中的_class字段?

这个字段主要是为了在将Mongo的数据还原到Java的时候能找到对应的类,要去掉的方法简单:DefaultMongoTypeMapper类的构造函数的第一个参数是Type在MongoDB中名字. 设置为null的话就不会在保存时自动添加_class属性.所以需要覆写

一阶段问题

架构方面:

1、测试类创建路径应该对应每个SERVICE层

2、CONTROLLER层不应该写过多业务逻辑,业务逻辑放到SERVICE层

3、前端传入数据应该用单独结构体获取(如xxInfo)再写转换逻辑转换为数据库结构体

4、像传统的springMVC架构

细节方面:

1、关键步骤添加多一些注释

2、尽量用post写http接口(因为post可接收的数据量更大,且通过解析json格式数据完成接口调用的通用性更强)

3、对于外部数据应当编写规则校验的逻辑

4、对于特殊情况(空值等)进行兜底处理

5、使用sl4j搭配try-catch进行日志输出

6、mongoDB要去除_class字段

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值