1.一级缓存:指的是Mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出来,当sqlSession消失时,Mybatis的一级缓存也就消失了,当调用sqlSession的修改,添加,删除,commit(),close()等方法时,会清空一级缓存。
2.二级缓存:指的是Mybatis中的sqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession共享其缓存,但是其中缓存的是数据而不是对象。当命中二级缓存时,通过存储的数据构造成对象返回。查询数据的时候,查询的流程是二级缓存>一级缓存>数据库。
3.二级缓存执行时机,如果开启了二级缓存,sqlSession进行close()后,才会把sqlSession一级缓存中数据添加到二级缓存中,为了将缓存数据取出来执行反序列化,还需要将要缓存的pojo实现Serializable接口,因为二级缓存数据存储介质多种多样,不一定只存在内存中,也可能存在硬盘中。
4.Mybatis执行步骤,Mybatis框架主要是围绕SqlSessionFactory进行的,具体步骤:
? ?定义一个configuration对象,其中包含数据源,事务,mapper文件资源以及影响数据库行为属性设置settings.
? ?通过配置对象,则可以创建一个sqlSessionFactoryBuilder对象
? ?通过sqlSessionFactoryBuilder获得sqlSessionFactory实例。
? ?通过sqlSessionFactory实例创建sqlSession实例,通过SqlSession对数据库进行操作。
? ?注意:但凡是sql注入漏洞的程序,都是因为程序要结束来自客户端用户输入的变量或者URL传递的参数,并且这个变量或者参数组成sql语句的一部分。对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的【外部数据不可信任】的原则。纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的。所以自然能想到,就是变量的检测,过滤,验证下手,确保变量是开发者所预想的。
1.检查变量数据类型和格式,数据类型检查,SQL执行前,要进行数据类型检查,如果是邮箱📮,参数就必须是邮箱的格式,如果是日期,就必须是日期格式;
? 只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式检查,确保变量是我们预想的格式,这样子很大程度上可以避免SQL注入攻击。如果上述例子中ID是int型的,效果会怎么样呢?无法注入,因为输入注入参数会失败。比如上述中的name字段,我们应该在用户注册的时候,就确定一个用户名规则,比如5~20个字符,只能由大小写字母,数字以及汉字组成,不包含特殊字符。此时我们应该有一个函数来完成统一的用户名检查。不过,仍然有很多场景并不能用到这个方法,比如写博客,评论系统,弹幕系统,必须允许用户可以提交任意形式的字符才行,否则用户体验感太差了。
2.过滤特殊符号
3.绑定变量,使用预编译语句
? ? ?1.resultType是直接表示返回类型的(对应着我们的Model对象中的实体)
? ? ?2.resultMap则是对外部ResultMap的引用(提前定义了db和Model之间的映射key,value关系),但是resultType跟resultMap不能同时存在。
? ? 默认情况下,所有敏感的HTTP端点都是安全的,只有具有Actuator角色的用户才能访问他们。安全性是使用标准的HTTPServletRequest.isUserInRole方法实施的。
? ?我们可以使用managerment.security.enable=false来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
? ? 1.SpringBoot简介
? ? 基于Spring4.x的设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,引用的不稳定性得到了解决。
? 2.SpringBoot有哪些优点?
? ?快速构建项目,可以选择一些必要的组件;
? ?对主流框架的无配置集成;
? ?内嵌Tomcat容器,项目可独立运行;
? ?删除了繁琐的xml配置文件;
? 极大地提高了开发和部署效率;
? 提供starter,简化Maven配置;
3.SpringBoot有哪些缺点?
版本迭代速度快,一些模块改动很大;
由于无需配置,报错时很难定位。
? ? 监视器也叫listener,是servlet的监听器,可以用于监听Web应用程序中某些对象的创建,销毁增加,修改,删除等动作的发生,然后做出相应的响应处理。当范围对象的状态发生改变时,服务器自动调用监听器对象中的方法,常用于系统加载时进行信息初始化,统计在线人数和在线用户,统计网站的访问量。配置监听器的方法:
? ? 通过@Component把监听器加入Spring容器中管理;
? ? 在application.properties中添加context.listener.class配置
? ? 在方法上加上@EventListener注解
?yaml是JSON的一个超集,可以非常方便的将外部配置以层次结构形式存储起来。yaml可以作为properties配置文件的替代。
yaml使用的注意事项:
?在properties文件中是以“."进行分割的,在yml中是用"."进行分割的;
?yml的数据格式和json的格式很像,都是KV格式,并且通过":"进行赋值;
?每个冒号后面一定要加一个空格;
? ? ?1.使用@ExceptionHandler注解处理局部异常,该方式只能处理当前Controller中的ArithmeticException和NullPointerException异常,缺点就是只能处理单个controller的异常。
? ?2.使用@ControllerAdvice+@ExceptionHandler注解处理全局异常
? ?3.配置SimpleMappingExceptionResolver类处理异常
? ?4.实现HandlerExceptionResolver接口处理异常
?1.@SpringBootApplication替代@SPringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
2.@ImportAutoConfiguration导入配置类,一般做测试的时候用,正常优先使用@EnableAutoConfiguration.
3.@SpringBootConfiguration 替代@Configuration
4.@ImportResource将资源导入容器
5.@PropertySource导入properties文件
6.PropertySource? ?@PropertySource的集合
7.@Role Bean 角色定义为ROLE APPLICATION(默认值),ROLE SUPPORT(辅助角色),ROLE INFRASTRUCTURE(后台角色,用户无感)
8.@scope 指定bean的作用域,默认singleton,其他包括prototype,request,session,globalSession。
9.@Lazy使bean懒加载,取消bean与初始化。
10.@Primary自动装配时出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。
11.@Profile指定Bean在哪个环境下被激活
12.@DependsOn依赖的bean注册完成,才注册当前类,依赖bean不存在会报错。用于控制bean加载顺序。
13.@PostConstruct? bean的属性都注入完毕后,执行注解标注的方式进行初始化工作
14.@Autowired默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
15.@Lookup根据方法返回的类型,去容器中捞出对应
16.@Qualifier申明bean名字,且可以按bean名字加载bean。
17.@Required检查bean的属性setXXX()方法,要求属性在配置阶段必须已经配置。
18.@Description添加bean的文字描述。
19.@EnableAspectConfiguration启动AspectJ自动配置
20.EnableLoadTimeWeaving启动类加载器动态增强功能,使用instrucmentation实现
21.@AutoConfigurationPackage包含该注解的package会被AutoConfigurationPackages注册
22.@AutoConfigureBefore在指定配置类初始化前加载
23.@AutoConfigureAfter在指定配置类初始化后加载
24.AutoConfigureOrder指定配置类初始化顺序,越小初始化越早。
25.@ModelAttribute? ?注解可以被应用到方法上和方法参数上。
? ? 常用的选择器如下:
@Conditional,当指定的条件都满足时,组件才被注册
@ConditionalOnBean,指定bean在上下文中时,才注册当前bean。用在方法上,则默认依赖类为方法的返回类型。
@ConditionalOnClass,指定类在classpath上时,才初始化当前bean。用在方法上,则默认依赖类为方法的返回类型。
@ConditionalOnCloudPlateform,在指定云平台才注册配置。
@ConditionalOnExpression,指定spel为true时注册配置。
@ConditionalOnJava,在指定Java版本时注册配置;
@ConditionalOnMissingClass,指定类不在classpath上时,才初始化当前bean。用在方法上,则默认依赖类为方法的返回类型。
@ConditionalOnNotWebApplication,不是在Web环境才注册配置。
@ConditionalOnProperty,配置文件中的值与指定值是否相等,相等才注册配置
@ConditionalOnRespurce,指定resources都在classpath上才注册配置。
@ConditionalOnSingleCondidate,上下文中只有一个候选者bean时才注册配置
@ConditionalOnWebApplication,是在Web环境才注册配置。
? ? 缓存相关注解如下:
@EnableCaching,开启缓存配置,支持子类代理或者Aspect增强;
@CacheConfig,在一个类下,提供公共缓存配置
@Cacheable,放在方法和类上,缓存方法或者类下所有方法的返回值
@CachePut,每次先执行方法,再将结果放入缓存
@CacheEvict,删除缓存
@Caching,可以配置@Cacheable,@CachePut,@CacheEvict
? ?Spring和SpringBoot都支持Maven和gradle通用打包管理技术。SpringBoot相对Spring的一些优点:
? 提供嵌入式容器支持;
?
部署时可以灵活指定配置文件;
最近项目是分布式的项目,都是通过分项目打包部署,然后部署在docker中运行。
可以使用druidDataSource创建DataSource,然后通过jdbcTemplate执行sql.
? ?hibernate对JDBC进行了封装,简化了JDBC的重复性代码;
? hibernate对dao有一个封装类hibernateTemplate,可以继承他,实现简单的CRUD接口。
? hibernate使用注解和配置文件,可以对实体类和映射文件进行映射;
?hibernate有事务管理机制,保证了数据的安全性;
? hibernate有一级缓存和二级缓存。
? ? ?需要在配置文件中进行如下配置:
??
?1.导航对象图查询:根据已加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用他的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,hibernate会从数据库中加载关联的Order对象,否则就从缓存中获得Order对象。
?2.OID方式:按照对象的OID来检索对象Session的get()和load()方法提供了这种功能,如果在应用程序先知道了OID,就可以使用这种方式检索对象。get()和Load()的用法完全一样,都需要两个参数,一个是持久化对象类名class,一个是行号OID,返回固定的某一行的数据,但是需要注意的是,当输入的OID不存在时,get()会返回一个空对象,Load()则直接报错。
3.HQL检索方式使用面向对象的HQL查询语言,session的find()方法用于执行HQL查询语句。此外,hibernate还提供了query接口,他是hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。
?它具备以下功能:
? ? 在查询语句中设定各种查询条件
? ?支持投影查询,即仅检索出对象的部分属性
? 支持链接查询
支持分页查询
支持分组查询
支持内置函数
能够调用用户自定义的SQL函数
支持子查询
支持动态绑定参数
4.QBC检索方式:Query By Criteria的API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。
5.利用原生SQL语句进行查询
? ? ?可以将hibernate的实体类定义为final,但这种做法不好。
? ? 因为hibernate会使用代理模式在延迟关联的情况下提高性能。如果你把实体类定义成final类之后,因为Java不允许对final类进行扩展,所以hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。
不过,如果你的持久化类实现了一个接口,而且在该接口中声明了所有定义实体类中的所有public的方法的话,就能避免出现前面所说的不利后果。
? hibernate是面向对象的ORM,所以一般定义成封装类型,要看数据库中的定义。
如果数据库中有对应字段存在null值,就要定义integer。也可以定义基本类型,在配置文件中写清楚即可。
? 高可用系统,就是说要保证系统在几乎任何时候都要有正常运行,功能正常。我们来看下哪些情况会造成系统不可用。
单机系统下的可用性问题,单点问题会影响系统高可用,比如要是这个链路其中一个单点挂了,那么整个系统都不可用了。所以引申出来主备/集群模式,防止单点问题。
高并发场景下,请求过多也会因为后端瓶颈点引起整个系统down掉,所以一般情况下应对高并发场景我们会限流,比如肖战演出抢票。
通过采用mq等队列形式削峰,保证后端系统不会down掉。
熔断机制。容灾机制,多机房部署。
综上所述:
1.主备/集群模式,防止单点故障。
2.限流,削峰,防止后端压力过大。
3.熔断机制,类似于限流。
4.容灾机制,多机房/异地部署。
分析,设计阶段,尽量找出进度的优先级。
? ? ?