初级 - 若依框架 - Java Spring/Spring Boot 项目理解记录

1、@Autowired 自动装配的理解

一般情况下,我们创建对象都是 类名 + 类引用名 = new 类名()

但是如果是不想要 等于号后面的对象实例化操作,那么可以使用 @Autowired 注解,当然这是在使用 Spring 时,才能这样,不然一般情况下,也没法用这个注解。用了这个 @Autowired 注解,会让 Spring 自动帮你托管这个对象实例,从而实现一种为某个类新增成员变量的想法。

  1. bean管理是指(1)spring创建对象 (2)spring注入属性。当我们在将一个类上标注@Service或者@Controller@Component@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。 当需要使用这个bean的时候,例如加上@Autowired注解的时候,这个bean就会被创建。而且初始化是根据无参构造函数。
  2. 我们开启Spring服务的时候,它会根据声明先扫描配置文件中的bean(注解配置同理), 再根据bean中类的全限定名去寻找它,一般为我们自己声明的pojo(实体类), 然后这时如果有@Autowired注解则会根据类型寻找其它的被Spring托管的bean进行自动注入, 调用默认的构造函数。(这句话的意思是用查找对应的类,然后将这个类作为组件,实例化该类对象,即返回值类型如果是类,那么就会去查找这个类,将这个类作为组件,实例化该类,将其作为当前类的成员变量,这里是一个类作为某个类的成员变量,比如只定义了类的引用,但是实例化对象并没有创建,那么就会由 Spring 帮你创建实例化对象并帮你托管该实例化对象。)
  1. 类不用new实例化,通过@Autowired 方式,将这个类引入实例化即可,交由 Spring 管理。
  2. 不能使用static的属性

参考链接

1. Spring @AutoWired注解用法解释(超级易懂)

2. @Autowired注解详解------超详细易懂

3. ★spring@Autowired注解原理,通俗易懂(笔记)

4. Java常用 @注解

2、Java 泛型的理解

泛型 ------ 可以存储广泛的类型的类型 (集合,数组)

1、泛型传参类型检查:

传参时,如果类参数内存在泛型参数,那么会为你设置自动检查参数类型,即当给类对象传递参数时,该参数是否符合该类此前设置的泛型参数类型,不符合则编译时会报错。

2.、泛型返回值类型检查:

赋值给对象引用时,强制检查对象引用是否符合对象实例化后返回的数据类型;

Object 类型是一个挺好用的类型,会自己分配类型。

常用数组方法:当然最好是指定泛型,没办法时才用 Object 类型

java 复制代码
List<Object> = new Array<Object>()

常用集合方法:

java 复制代码
Map<String, Object> = new HashMap<>();

3、Java 与 MongoDB

3.1 MongoDB 的数据初始化

1、为SpringBoot项目创建实体类(即序列化字段),但真实且正确的理解,你应该理解为序列化字段 Fields
我们通过创建一个实体类来序列化数据,从而传回给前端所需的数据,数据格式为 Json 格式

MongoDB 有点特别,这里是用文档来作为一个数据项,文档的数据存储格式是以对象类型,类似字典形式 {键: 值} 格式存储的,不用定义类似关系型数据库那样需要在创建表的时候,要定义好字段的类型(如 某字段名 VARCHAR(30) NOT NULL ),MongoDB 只需要注意调用键时,键的类型必须永远是字符串类型,值可以是任意类型的(字典、数组、数字、字符串、二进制(即字节码类型,可以存储视频或图片),各种前面提到的数据类型的嵌套等等)

2、集合(MongoDB的表) ------> 文档(MongoDB的行数据,即数据项(@Document))------ 对象数据 / 属性 (对象(字典)类型)

这里的对象类型数据,其实就是类似关系型数据库,以MySQL 数据库为例,表内的一行一行数据,只不过现在不用去固定数据项内字段的数据格式了(比如什么字符串 VARCHAR、Double、datetime 等等数据类型),但是我们一定要清楚的是,文档存储了一个对象的数据,该数据项一定会有个类似关系型数据库表那样的唯一标识 id 字段的,所以我们通过这个可以定位到某一份文档数据,当然这只是 MongoDB 其中的一种查询方法(精确查询 Where().is() )。

以测试表 Test 为例,表内定义了字段,testid 和 testcontent,那么查询时会返回如下类型的数据:

bash 复制代码
Test(testid=9567,testcontent='这是测试数据项') 

这里省略了一步,那就是 for 循环输出 MongoDB的查询对象数组

java 复制代码
Criteria criteria = Criteria.where("testid").is(9567)
Query query = Query.query(criteria);
List<Test> list = mongoTemplate.find(query, Test.class,"Test");
for (Test test : list){
	System.out.println("测试:" + test)
}

3、类注释
@Document(MongoDB的表名) 定义当前类为MongoDB内某个集合的文档,即一张表,比如

@Document(test) 那么就是指定当前的实体类文档属于一个叫 test 的集合

@Field(字段别名转换) 如果在类内字段,添加该注释,那么会为这个字段添加一个别名,然后在其他位置调用这个字段时,可以使用这个别名去查询当前对象内的原始键({键: 值}),而且该别名真实对应数据库的字段名,笔者也不清楚,为什么需要这样,笔者遇到过 No property xxx found for type 类名 的问题报错,需要额外转换该字段,否则会报该错误,笔者猜测应该是与 Mongo 数据库内部的 _id 字段冲突了,注意这里使用的数据库是 Mongo数据库

传送门:Java 与 MongoTemplate 报错 - No property xxx found for type 某个实体类名

4、文档的唯一标识 _id

MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。

在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。

3.2 Java 调用 MongoDB

Criteria 是一个条件查询的设置步骤

query 是一个 sql 语句条件拼接步骤,比如可以拼接排序的 sql 条件语句或分页查询的条件语句。

1、精准查询 ------ 关键字 where(键).is(查询键) 相当于关系型数据库的 WHERE key=''

只不过我们通过的是查询每一份文档内,存在的该键值的所有文档,所以返回的是一个数组类型的数据,当然也可以通过查询唯一标识对其进行更加精准的查询,直接定位一份文档数据,而不是返回若干份文档数据。

java 复制代码
Criteria criteria = Criteria.where("name").is("zs")
Query query = Query.query(criteria);
mongoTemplate.find(query,User.class);
mongoTemplate.find(query,User.class,"mongodb_user");

2、模糊查询:------ 关键字 regex

利用了 MongoDB 内部的正则匹配机制(MongoDB 它有提供内部的正则表达式功能)所以对应的 Java 接口就是 regex 方法接口了,通过这个方法可以让我们调用 MongoDB 内部的正则表达式功能对指定集合内的文档进行模糊查询,即正则表达式匹配。

java 复制代码
// 创建控制器类,继承基类 ------ 基础控制器类(有一些必要的序列化字段和数据返回方法可以继承)
public class ConditionController extends BaseController {

    @Autowired
    private MongoTemplate mongoTemplate; // 加载 MongoDB 的访问接口对象,即实例化该对象
    
	@GetMapping("/datalist")
    public TableDataInfo List(Condition conditions) {
	 Query query = new Query(); // 拼接 sql 语句
  	 if (conditions != null && conditions.size() > 0) { 
     for (Condition condition : conditions) { 
     // for 循环多次拼接 sql 条件语句
     query.addCriteria(Criteria.where(condition.getKey()).regex(".*" +condition.getValue().toString()+ ".*")); 
    	} 
	}
	List<Condition> list = mongoTemplate.find(query, Condition.class, "condition");
	long count = this.mongoTemplate.count(query, Condition.class, "condition"); 
 	return getDataTable(list, count);
}

关键句在于 Criteria.where(condition.getKey()).regex(".*" +condition.getValue().toString()+ ".*"));

condition.getKey() 获取关键词(实体类 Condition 内部定义成员变量 ------ 关键字 key)

Criteria.where(键名).regex(".*"+condition.getValue().toString()+".*")

正则匹配所有类似 condition.getValue().toString() 的文档,并返回文档数据

参考链接

1. 如何在Java中使用MongoDb

2. spring data mongodb 操作

3. MongoTemplate的基本使用方法

4. MongoTemplate增删改查(聚合查询)使用

5. Java操作mongodb的模糊查询和精确查询(转)

6. MongoDB 教程

7. Spring整合MongoDB实现多个or的范围查询

8. springboot 整合mongoTemplate的 Query Criteria 用法

相关推荐
Dcs21 分钟前
用不到 1000 行 Go 实现 BaaS,Pennybase 是怎么做到的?
java
Cyanto2 小时前
Spring注解IoC与JUnit整合实战
java·开发语言·spring·mybatis
qq_433888932 小时前
Junit多线程的坑
java·spring·junit
gadiaola2 小时前
【SSM面试篇】Spring、SpringMVC、SpringBoot、Mybatis高频八股汇总
java·spring boot·spring·面试·mybatis
写不出来就跑路2 小时前
WebClient与HTTPInterface远程调用对比
java·开发语言·后端·spring·springboot
Cyanto2 小时前
深入MyBatis:CRUD操作与高级查询实战
java·数据库·mybatis
麦兜*3 小时前
Spring Boot 集成Reactive Web 性能优化全栈技术方案,包含底层原理、压测方法论、参数调优
java·前端·spring boot·spring·spring cloud·性能优化·maven
天上掉下来个程小白3 小时前
MybatisPlus-06.核心功能-自定义SQL
java·spring boot·后端·sql·微服务·mybatisplus
知了一笑3 小时前
独立开发第二周:构建、执行、规划
java·前端·后端
今天背单词了吗9804 小时前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法