`

面试经历中遇到的面试题-one

 
阅读更多
整理记录一些面试要点以便将来用得到。

关于面试:首先认清无论你多优秀,在面试的时候都不能顾及到所有面试的内容,所以只能尽可能的去准备一些常问的面试点,也就是能拿的分要拿到。

Java基础 jsp servlet ajax json
容器hashmap原理
jvm调优
多线程高并发
框架springboot,springcloud,dubbo,zookeeeper,springmvc,spring,mybatis,hibernate,struts2
spring事务机制,
redis 缓存 session共享 分布所锁
设计模式 单例模式 代理模式 工厂模式
sql优化 左右外连接 全连接
消息队列 rabbitmq kafaka
ngnix 反向代理 负载均衡 高可用
linux命令
git命令

==================one======================
自我介绍
requestmapping注解可以作用到类上么?
(可以,首先看一下这个注解的源码
package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String[] value() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

@Target中 枚举类型是 ElementType.METHOD, ElementType.TYPE 说明可以作用到方法上,和类型上,类型又有哪些呢?看源码 以下给出部分源码
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,


可以看到 Type包括 类,接口(含注解类型),或者是枚举
所以该注解是可以作用到类上的。
)
如何设置让requestmapping注解到的方法为get请求
(答:
@RequestMapping(method=RequestMethod.GET)
public void query(){

}

在最新的spring5中还有一个注解可以用来直接标识该方法为get请求,就是@GetMapping
看源码

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(
    method = {RequestMethod.GET}
)
public @interface GetMapping {
    @AliasFor(
        annotation = RequestMapping.class
    )
    String name() default "";

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] value() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] path() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] params() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] headers() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] consumes() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] produces() default {};
}


)
springmvc的工作原理是什么?

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

详细:https://lovemojienv.iteye.com/admin/blogs/2430193


union和union all有什么不同
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
union与union all 的区别主要是对重复结果的处理。
union在进行表连接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际上大部分应用中是不会产生重复的记录,最常见的是过程表与历史表union;如:select * from gc_dfys union select * from ls_jg_dfys
    这个sql在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 而union all只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
    从效率上来说,union all 要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all 这样效率高。   

MyBatis中#{ }和${ }的区别

MyBatis中#{ }和${ }都可以用来动态传递参数,补全SQL语句,但它们区别也很明显。

(1)#{"参数名"}在SQL中相当于一个参数占位符“?”,用来补全预编译语句。它补全预编译语句时,可以理解为在此参数值两端加了单引号。举例如下,当需要动态的按id查询用户信息时。

select * from my_user where id = #{id};
 

    如果我们为id赋值为1,这条SQL执行效果相当于下面的SQL。

select * from my_user where id = '1';
    由于预编译SQL使用PreparedStatement对象抽象预编译语句,之后使用也无需再次编译,而且能够防止注入式攻击,所以只要能够使用#{ }解决的地方,我们都应该使用#{ }。

(2)${"参数名"}就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低,也无法复用。但是在有些#{ }无法胜任的地方,还是会需要${ }来完成。比如当SQL中数据库表名为参数时,如果使用#{ },如下所示。


select * from #{tableName};
    当我们为tableName赋值为"my_user"时,相当于执行以下SQL。

select * from 'my_user';
    由于表名不能加单引号,所以语法错误。这时候就需要使用${ }来进行字符串拼接。

select * from ${tableName};
    为tableName赋值为"my_user"后,相当于执行以下SQL。
select * from my_user;

linux查看日志的命令
tail -f server.log

单例模式懒汉与饿汉的区别

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics