面试篇二:MyBatis、Spring、SpringMVC

  • Mybatis
  • Mybatis中#{}和${}区别

#{}:解析为参数占位符,生成的SQL里对应的位置用?表示,值是当做字符串处理的,会加上''。

使用#{}可以很大程度上防止sql注入(SQL拼接)。

${}:直接解析为相应的值。在动态生成SQL时,直接进行变量替换,不会自动加''。

在动态表名和order by动态字段时,需使用${}。

#{}因为是替换成?,在初始化阶段就会生成SQL。${}是未知的,在初始化阶段不处理。

  • Mybatis为什么只定义了接口,就可以执行SQL了

是通过JDK动态代理实现的。

  • MyBatis一级缓存和二级缓存

MyBatis默认只开启一级缓存。

一级缓存:是针对同一个SqlSession而言的,同一个SqlSession会对同一份数据的查询进行缓存,使用SqlSession第一次查询后,就将其放入缓存中,只要没刷新或超时,再次查询时,SqlSession不会再查数据库,而是从缓存中读取。

一级缓存的生命周期:MyBatis开启一个数据库会话,就会创建一个SqlSession,SqlSession内部持有Executor对象,Executor持有PerpetualCache对象,他们在回话结束时,都会被释放掉。

如果SqlSession调用了close()、clearCache()、update()、delete()、insert()都会清空PerpetualCache对象的数据

二级缓存:是针对同一个SqlSessionFactory下的不同的SqlSession而言的。开启二级缓存:

(1)修改mybatis.xml配置文件

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true" />
    </settings>
</configuration>

(2)在映射文件中开启二级缓存:在xxxMapper.XML文件里,添加<cache/>标签。mybatis默认缓存类FifoCache。

也可以通过下面配置使用自定义Cache类(实现org.apache.ibatis.cache.Cache接口)进行缓存。如自定义redis缓存。

   <!-- eviction-回收策略FIFO先进先出,flushInterval-自动刷新时间,size-最多缓存的引用对象,type-自定义实现的Cache类 -->
    <cache eviction="FIFO" flushInterval="60000"  size=“512” readOnly="true" type="com.xcj.mapper.RedisCache"/>

关于二级缓存看这里https://www.cnblogs.com/cxuanBlog/p/11333021.html

  • Spring
  • Spring IOC和AOP

IOC,控制反转(Inversion of Control),就是把对象的创建(即bean的new操作),交给Spring来实现。

DI,依赖注入(Dependency Injection),是spring IOC的具体实现,做的工作是Spring实例化bean对象后,对bean对象的属性信息进行赋值的操作。

AOP,面向切面编程(Aspect Oriented Programming),是一种编程范式,是OOP(面向对象编程)的延续,采用横向抽取机制,补充了OOP纵向继承体系无法解决的重复代码优化方式。

简单地说就是在不改变原程序的基础上为代码段增加新功能,对代码段进行增强处理。

譬如,假设有A,B有相同的逻辑,我们可以横向抽取相同的部分出来,通过AOP思想和业务串联起来,同时这是可插拔式的。

AOP思想的实现一般都是基于代理模式,给业务代码进行功能增强,将业务代码和系统代码解耦。

如果目标对象的实现类实现了接口,Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类;

如果目标对象的实现类没有实现接口,Spring AOP 将会采用 CGLIB 来生成 AOP 代理类。

增强方式:五种,分别为前置增强、后置增强、最终增强、异常增强、环绕增强。

https://www.cnblogs.com/scorpio-cat/p/12632063.html

  • Spring 常用注解

(1)作用于属性上:

@Autowired:byType注入。

@Qualifier:对于同一接口有多个实现类时,需@Autowired+@Qualifier组合使用,byName注入。

@InJect:byType注入,可以通过@Qualifier显式指定byName注入。

@Resource:按byName注入。

(2)作用于类上

@Controller @Service @Respository @Compent:分别表示该类为控制层、业务层、持久层、比较中立的类,被Spring管理。

@ComponentScan:指定需扫描的包。

(3)作用于方法上

@Bean:一般用于导入第三方组件的类,如DataSource。

(4)AOP常用注解

作用于类上

@Aspect:表示是一个切面类。

作用于方法上

@Pointcut:定义切点,如 @Pointcut("execution(* com.xcj.service.UserServiceImpl.*(..))")

@Before:前置增强。

@After:后置增强。

@AfterRetruning:最终增强,在方法返回之前,获取返回值并进行记录操作。

@Around:环绕执行,@Before和@AfterRetruning的结合体。

@AfterThrowing:异常增强,在异常抛出前进行处理。

https://www.cnblogs.com/scorpio-cat/p/12719342.html

  • SpringMVC
  • SpringMVC工作流程

(1)用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

(2)DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

(3)DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

(4)提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息; 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等; 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等; 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中;

(5)Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

(6)根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

(7)ViewResolver 结合Model和View,来渲染视图;

(8)将渲染结果返回给客户端。

  • SpringMVC常用注解

@Controller:用于定义控制器类。

@ResponseBody: 表示方法的返回结果直接写入HTTP response body中。

@RestController:是@Controller+@ResponseBody结合。

@RequestBody:用来接收前端传递给后端的json字符串中的数据的。

@RequestParam:用在方法的参数前面,如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值),如果没有xxx名的话,那么请求会出错,报400。

@PathVariable:获取路径参数,将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)

    @RequestMapping("show5/{id}/{name}")
    public ModelAndView test5(@PathVariable("id") Long id ,@PathVariable("name") String name){ 

    }

@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。

@GetMapping:是@RequestMapping(method = RequestMethod.GET)的缩写。

@PostMapping:是@RequestMapping(method = RequestMethod.POST)的缩写。

@ControllerAdvice和@ExceptionHandler:全局异常处理。

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(NullpointerException.class)
    public ModelAndView customException(Exception e) {
        
    }

    @ExceptionHandler(IOException.class)
    public ModelAndView customException(Exception e) {
        
    }
}

 

posted @ 2020-05-02 17:50  时光编辑师  阅读(218)  评论(0)    收藏  举报