层级理解
yaml://或者使用properties
application.yml中配置了与数据库的连接字符串,数据库的密码,系统日志保存的位置,文件上传目录,以及后端服务所运行的端口号。
entity:实体层,数据库在项目中的类
实体层。这里写的是实体类的定义,数据表中的每个字段名都作为实体类中的一个成员变量,然后这里再实现每个成员变量的get和set的方法。
controller:控制层,控制业务
控制层。控制层中定义了提供给前端的接口的路径,前端使用本接口的方法(GET还是POST),以及需要传输的参数。前端发送来的请求首先传到“控制器”中,这里接受前端传来的请求,并将这个请求传到service层(调用了service层的接口)。
service:业务层,控制业务逻辑
服务层。该层定义了相关服务的接口,只是接口,实现接口的代码放在impl文件夹中。接受从控制层controller中传递过来的请求,然后将请求传递给DAO层。
作用:实现功能的设计。
impl:在service层之下
服务层service接口的实现。在这里调用了DAO接口,将需要操作数据库的请求传递给DAO层。
作用:impl类实现service的接口。
dao:
数据库对后端服务的接口层。接受来自服务层service的请求,将请求传递给mapper。
作用:访问数据库,向数据库发送sql语句,完成数据的增删改查功能。
mapper:
数据库操作层,这里写SQL语句,实现dao接口,接受dao接口传入的参数并执行SQL语句操作数据库。
VO:
View Object,视图层,其作用是将指定页面的**展示数据**封装起来,通常用于业务层之间的数据传递。
注解理解
entity层: @Entity//对应数据库中的信息 @Table(name="")实体类和表名相同可以省略
@DynamicUpdate//我更改了哪些字段,只要更新我修改的字段就够了
@DynamicInsert//数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。
实体类 private封装 @Data(lombok) 定义有参/无参构造方法,提供getter/setter方法
@Id//主键 @GeneratedValue(strategy = GenerationType.IDENTITY)//自增 @Column(声明的列名和数据库中的字段名不一致,@Column("...")) //对应数据库中的信息
导入lombok配置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
Dao层: 持久层,与数据库交互
创建dao接口,在配置文件中定义该接口的实现接口;
@Mapper和@Repository都是作用在dao层接口,使得其生成代理对象bean,交给spring 容器管理 对于mybatis来说,都可以不用写mapper.xml文件
@Mapper不需要配置扫描地址,可以单独使用,如果有多个mapper文件的话,可以在项目启动类中加入@MapperScan(“mapper文件所在包”) @Repository不可以单独使用,否则会报错误,要想用,必须配置扫描地址(@MapperScannerConfigurer)
@Mapper:使用@Mapper将NewsDAO接口交给Spring进行管理,不用写Mapper映射文件(XML),
为这个NewsDAO接口生成一个实现类,让别的类进行引用
@Repository:使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
public interface Product extends JpaRepository<entity实体, 主键的类型> //JpaRepository 它包含用于基本 CRUD 操作的 API,以及用于分页和排序的 API。
//配置JpaRepository的maven构建文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
@Param注解:@Param 中定义的变量名必须和 mapper 中保持一致才可以
service层&&impl层:业务层
@Service 声明一个service(也可以使用impl+service实现,@serivce声明在impl类的顶部)
@Autowired 将DAO注入进来
Controller层:
@Transactional(rollbackFor=Exception.class):如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。
@CrossOrigin:能一定程度上的简化解决跨域问题的方式。
@RestController = @Controller + @ResponseBody
@Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实 例化。当然也有语义化的作用,即代表该类是充当Controller的作用
@ResponseBody 它的作用简短截说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其 他Object,它会以Json字符串的形式返回给客户端。
@RequestMapping("/path1") 表示该控制器处理所有“/path”的URL请求。RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
@RequestParam:用于将请求参数区数据映射到功能处理方法的参数上。
@Autowired:将service接口注入到Controller层
@GetMapping("/path2")或者(path = "/path2") 访问这个注解下的路径/path1/path2
@PostMapping
get和post的区别:GET
用来获取资源,它只是获取、查询数据,不会修改服务器的数据,
POST
则是可以向服务器发送修改请求,进行数据的修改的。
//如果在yml配置下,那么就存在于@GetMapping之上的层级
server:
servlet:
context-path: /sell
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””) value:参数名 required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。 defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
VO层:将前端页面传输的数据在后端service层封装成一个VO类,控制层需要调用时,直接调用该类中的属性,以获取各种数据
@JsonProperty("name") 在前端显示name
Config层:
@Configration 注解:声明当前类是一个配置类,相当于 Spring中的一个 XML 文件
@Bean 注解:作用在方法上,声明当前方法的返回值是一个Bean。(注解一个Bean,交给spring处理)
Form层:(表单)
相当于前端给后端的对象传输数据,封装成一个对象表单,在每一个属性上可以标注要求并且使用注解来哦实现:
@Length(min=... | max=... | message=...)
@NotNull(message = "请输入年龄")
(在controller层中)@Valid 注解通常用于对象属性字段的规则检测,表示我们对这个对象属性需要进行验证.
既然验证,那么就肯定会有验证结果,所以我们需要用一个东西来存放验证结果,做法也很简单,在参数直接添加一个BindingResult
通过bindingResult.hasErrors()验证表单是否发生错误来抛出异常
-
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
-
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。