web开发细节
1.数据库是什么
MySQL是关系型数据库,本质是一个文件系统。
关系型数据库是指建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
而所谓二维表,指的是由行和列组成的表。
在真实的企业开发中,MySQL数据库服务器是在公司的服务器上安装的。
2.SQL语句
增删改查
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
delete from 表名 [where 条件] ;
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
内连接和左外连接
内连接查询:查询两表或多表中交集部分数据。
隐式内连接语法:
select 字段列表 from 表1 , 表2 where 条件 ... ;
显式内连接语法:
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;
左外连接语法:
select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;
左外连接相当于查询表1(左表)的所有数据,和表1和表2交集部分的数据。
在MyBatis中的应用
1.在Mapper层写mapper接口
返回值类型:
第一种:无返回值,(void)
第二种:返回单条数据,(实体类类型)
第三种:返回多条数据,(LIst<实体类类型>)
第四种:返回Integer,Boolean
其中,在增加,删除,或者修改数据返回类型可以是void,Integer和Boolean
当方法传过来的参数是多个时(可以是相同的多个,也可以是不同的多个),在传参时需要加上@Param注解

2.在配置文件中写xml文件
当查询结果集字段名与Java实体属性名不一致时,需要手动映射
<resultMap id="映射方法名" type="com.itheima.pojo.实体类">
<id column="id" property="id"/>(id:映射主键列)
<result column="询结果集字段名" property="Java实体属性名"/>
。。。。。。
<collection property="集合属性名" ofType="com.itheima.pojo.集合泛型类型">(映射集合数据)
<id column="id" property="id"/>(id:映射主键列)
<result column="询结果集字段名" property="Java实体属性名"/>
。。。。。。
</collection>
</resultMap>
3.写xml文件的简易写法
由于写sql语句时,需要写表中所有字段名,这样比较安全。
可以将所有字段除id外写入 <sql id="BaseColumn"> </sql>中,直接引用<include refid="BaseColumn"/>

3.三层架构
- Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层。处理具体的业务逻辑。
- Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
IOC和DI
- 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器。
- 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。 例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象。
- bean对象:IOC容器中创建、管理的对象,称之为:bean对象。
IOC控制反转,底层是工厂模式,DI依赖注入。
重要的注解@Component,@ComponentScan,@SpringBootApplication
4.Filter过滤器和Interceptor拦截器
Filter过滤器和Interceptor拦截器的区别
- 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
- 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源
JWT令牌
- 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
无状态的协议
所谓无状态,指的是每一次请求都是独立的,下一次请求并不会携带上一次请求的数据。
5.AOP
AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。
AOP是面向切面编程,是一种编程思想,底层是动态代理。在不修改源代码的情况下,对源代码进行功能上的增强。
事务管理,全局异常管理器,过滤器和拦截器都是运用了AOP思想。
核心注解:@Aspect(定义切面),@(切点表达式)
execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:
execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)

6.事务管理
事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。
异常回滚的属性
默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。
我们可以通过配置@Transactional注解当中的rollbackFor属性让所有的异常都回滚,或者指定出现何种异常类型回滚事务。
事务传播行为
若在A方法上使用事务管理,在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法,则B方法默认与A方法在一个事务内。若是B方法也被事务管理,则可以将注解改为 @Transactional(propagation = Propagation.REQUIRES_NEW),这时B方法会创立一个单独的事务,不受A的影响。
7.全局异常处理器
全局异常处理器,使用spring提供的注解,来帮助我们对Controller进行增强。
- 定义全局异常处理器非常简单,就是定义一个类,在类上加上一个注解@RestControllerAdvice,加上这个注解就代表我们定义了一个全局异常处理器。
- 在全局异常处理器当中,需要定义一个方法来捕获异常,在这个方法上需要加上注解@ExceptionHandler。通过@ExceptionHandler注解当中的value属性来指定我们要捕获的是哪一类型的异常。
8.Spring Boot的自动配置
SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
自动配置的核心是@SpringBootApplication注解,SpringBootApplication这个注解底层包含了3个注解,分别是:
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
其中SpringBootConfiguration表明SpringBoot启动类就是一个配置类。
@ComponentScan注解是用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。
@EnableAutoConfiguration这个注解是自动配置的核心。封装了一个@Import注解,Import注解里面指定了一个ImportSelector接口的实现类。在这个实现类中,重写了ImportSelector接口中的selectImports()方法。- 而selectImports()方法中会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是 autoConfiguration.imports。将内部所有的键和值加载进来,形成一个字符串数组。这个字符串数组内部存放着全类名。再根据 @Conditional 注解来进行条件装配,加载进内存,反射,创建对象注入到IOC容器中。
浙公网安备 33010602011771号