微服务实践2 -从网站初始化到获取数据库数据
文章目录
1、从Spring initializer网站下载初始化
选择初始化条件:
-
Project : Maven
-
Language : Java
-
Spring Boot : 2.7.11
-
Project Metadata:(没写则是默认)
- Group(组织名) : com.openflag
- Artifact (name) : client-service
- Packaging : Jar
- Java : 11
之后选择GENERATE即可。
2、前置工作
1.IDEA打开项目时,选择的文件夹应该是src上级的文件夹,若选了上上级的文件夹则无法使用。
例:test/test/src,应选择第二个test打开项目。
2.如果文件中Java文件夹未被设置为Source root(蓝色文件夹),则应该右键java ->Marked Directory as -> Source root
3.如果环境未设置为JAVA11,则窗口左上角选择File -> Project Structure ->SDK选择JAVA11
.
4.打开终端,输入mvn clean
,显示BUILD SUCCESS,即可。
3、注解理解
-
@RestController (了解)
-
将函数的返回值直 接填入 HTTP 响应体中
-
该注解为一个组合注解,@RestController会告诉Spring,控制器中所有的处理器方法的返回值都要直接写入响应体中,而不是将值放到模型中并传递给一个视图以便于渲染。相当于@Controller和@ResponseBody的组合。
- 响应体是服务器返回给客户端的数据,通常是一个文本或者一个二进制文件,比如HTML页面,图片,视频等。
- 处理器方法是控制器类中用来处理客户端请求的方法,通常用@RequestMapping注解来映射请求的路径和参数。
- 将类中所有处理器方法的返回值直接写入响应体中的意思是,不需要经过视图解析器来渲染页面,而是直接把返回值作为响应体发送给客户端,通常用于返回JSON或者XML格式的数据
-
-
@SpringBootApplication (了解)
- 申明让spring boot自动给程序进行必要的配置,相当于同时使用了@Configuration,@EnableAutoConfiguration和@ComponentScan三个注解³。
- @Configuration表示当前类是一个配置类,可以用来定义bean对象并加入到IOC容器中²。
- @EnableAutoConfiguration表示开启自动配置,根据项目依赖的jar包,自动配置相关的组件²。
- @ComponentScan表示自动扫描并加载符合条件的组件或者bean定义,一般会扫描@SpringBootApplication标注的类所在的当前包及其子包中的被@Controller,@Service,@Repository,@Component等注解标注的类⁴。
-
🔴 @Autowired
- bean对象是:
一个普通的对象类,必须有一个无参构造函数,并且所有属性必须进行get/set封装(主要)
一个由Spring IoC容器实例化、组装和管理的对象,可以通过注解或配置文件定义。
一个可以用来传输数据、封装业务逻辑、实现可视化设计等功能的特殊类。 - 自动导入对象到类中,自动装配,其作用是为了消除代码里的getter/setter与bean属性中的property。
- 让spring完成bean自动装配的工作,可以对类成员变量、方法及构造函数进行标注。
- @Autowired默认是按照类去匹配,配合@Qualifier指定按照名称去装配bean。
- @Autowired可以省略字段的set方法,也可以用于set方法或构造方法上。
- bean对象是:
-
🔴 @GetMapping()
- @GetMapping注解是一个组合的注解,用于将HTTP GET请求映射到特定的处理器方法上。它相当于@RequestMapping(method = RequestMethod.GET)的简写。
- @GetMapping注解可以接受一些参数,如value, params, headers等,用于指定请求的路径,参数,头部等条件.
-
🔴 @PathVariable
- 在Java中,@PathVariable注释用于将URI模板变量绑定到控制器处理方法的参数。例如,假设我们有一个RESTful Web服务,它允许我们检索用户信息。我们可以使用以下代码来检索用户信息:
@GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); }
- 在这个例子中,@PathVariable注释将URI模板变量{id}绑定到getUserById()方法的id参数上。这意味着当我们访问/users/123时,getUserById()方法将被调用,并且id参数将被设置为。
-
🔴 @Repository
-
@Repository注释是Spring框架中的一个注释,它用于标记数据访问层组件,例如DAO(数据访问对象)或存储库。使用@Repository注释可以将数据访问层的代码与业务逻辑分离。这样,我们就可以在不影响业务逻辑的情况下更改数据访问层的实现。
-
例如,假设我们有一个名为UserRepository的接口,它定义了一些用于检索和保存用户信息的方法。我们可以使用以下代码来实现UserRepository:
@Repository public interface UserRepository { User findById(Long id); List<User> findAll(); void save(User user); }
- 在这个例子中,@Repository注释将UserRepository接口标记为数据访问层组件。这意味着我们可以使用Spring依赖注入来获取UserRepository实例,并使用它来检索和保存用户信息。
-
-
🔴 @Entity
- 实体类是一种用于存储数据并提供对这些数据的访问的数据密集类,通常对应数据库中的一张表,其中的属性对应表中的字段。
- @Entity注解是Java Persistence API中定义的一种注解,用于标识一个类是一个实体类,可以映射到数据库的一张表。@Entity注解说明这个类使用默认的ORM规则,即类名就是表名,类属性就是字段名。@Entity注解可以接受一个name参数,用于指定映射的表名,如果不指定,默认为类名。
-
@Data
-
@Data注解是一个来自Lombok项目的注解,用于简化Java类的编写,它可以自动为类的所有属性生成getter和setter方法、equals和hashCode方法、toString方法,以及构造方法。@Data注解可以减少重复的代码,提高开发效率和可读性 。
-
下面是一个@Data注解的示例代码,用于定义一个学生实体类,并使用@Data注解简化了代码:
import lombok.Data; @Data public class Student { private Long id; private String name; private int age; // 无需手动编写getter和setter等方法 }
-
-
@Id
- 用于标识一个实体类的属性作为主键,可以映射到数据库表的主键列。
-
@Service
- @Service注解是一种用于标识一个类是一个服务类的注解,它是@Component注解的一种特化,表示该类属于业务逻辑层。
- @Service注解可以让Spring容器自动扫描并将该类注册为一个Bean,不需要再在配置文件中定义。
- @Service注解可以接受一个value参数,用于指定Bean的名称,如果不指定,默认为类名首字母小写。
4、Java特性理解(会的不用看,给不熟悉Java的伙伴:))
-
接口
-
Java中的接口类是一种抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。下面是一个简单的Java接口的例子(一个接口类,两个实现类):
interface Animal { public void eat(); public void travel(); } class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
-
与抽象类的区别:
- 抽象类可以同时具有抽象和具体方法;而接口只能有抽象方法,它是抽象方法的集合(从Java 8开始,它也可以有默认和静态方法)。
- 抽象类不支持多重继承,一次只能扩展一个类或一个抽象类;但是一个类可以实现多个接口。
- 抽象类可以拥有构造器;而接口不能拥有构造器。
- 抽象类中的成员变量可以是各种类型的;而接口中的成员变量只能是public static final类型的。
-
-
Optional关键字
- 它是一个可以为null的容器对象。
- 如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
- Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
5、Spring框架下的类连接(迅捷画图)
-
CilentController是控制类,然后让ClientService为其提供getClient的服务,ClientService通过ClientServiceImpl实现,然后返回给控制类getClient方法。
-
ClientServiceImpl通过ClientRepository访问数据库,获取Client。
-
ClientRepository通过继承JpaRepository<类型,主键>来实现连接数据库,并且可以自动实现,具体可以右上角选择搜索SimpleJpaRepository,来查看有哪些方法(findById())。
6、数据库实现的细节
-
添加依赖于pom.xml
-
<dependency> <groupId>org.sprin.framework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
-
然后右键pom.xml > Maven > Reload project
-
-
选择resources的文件夹,配置application.properties
-
# 修改端口 server.port=8087 # 使用H2内存数据库,数据库名称为testdb。 spring.datasource.url=jdbc:h2:mem:testdb # 使用H2数据库的驱动程序 spring.datasource.driverClassName=org.h2.Driver # 使用用户名为sa的用户连接到H2数据库 spring.datasource.username=sa # 连接到H2数据库时不需要密码 spring.datasource.password= # 使用Hibernate的H2方言来生成SQL语句。 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect # 表示延迟数据源初始化,即在Hibernate初始化之前不会执行数据源初始化。 spring.jpa.defer-datasource-initialization=true # 启用H2控制台 spring.h2.console.enabled=true # H2控制台的路径 spring.h2.console.path=/h2-console # 禁用H2控制台的跟踪功能 spring.h2.console.settings.trace=false # 禁用H2控制台的Web允许其他人功能 spring.h2.console.settings.web-allow-others=false
-
-
在数据类型(Client)中加上@Entity和@Id
-
在resources文件中新建data.sql文件,然后在里面写入数据库命令即可,启动时会自动执行
-
代码如下
Insert into Client(id, name, asset_value) values (1, 'Peter Fisher', 5000), (2, 'Jorge Sullivan', 8000), (3, 'Eric Woods', 6000), (4, 'Norma Fisher', 12000), (5, 'Kayla Sullivan', 800), (6, 'Elizabeth Woods', 10000);
-