Java面试之框架部分

Java面试之SSM框架

Java面试之SSM框架

1.MyBatis和Hibernate的区别?

:Hibernate是完全的ORM(对象关系映射) 框架, Mybatis是一个不完全的ORM 框架。
:Hibernate是表和实体类之间的映射,Mybatis是SQL执行结果和实体类之间的映射。
:Hibernate写HQL语句, sql 自动语句生成,也可自己写SQL语句。数据库移植性更好,自动转换为不同数据库查询语句。Mybatis程序员自己编写sql,sql 修改,优化比较自由。sql语句写在xml配置文件中,更好维护,但是数据库移植性不好,不同数据库要写不同的sql语句。

2.Mybatis 中一级缓存与二级缓存的区别?

:一级缓存不是跨SqlSession的;二级缓存是跨SqlSession的,二级缓存的作用域是一个mapper的namespace。
:一级缓存是系统默认的,二级缓存需要在mapper.Xml中配置,加入,一级缓存不需要。

3.JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的(面试题)?

:数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
:Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
:向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
:对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo(实体)对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。

4.使用 MyBatis 的 mapper 接口调用时有哪些要求?

:Mapper接口方法名和mapper.xml中定义的每个sql的id相同
:Mapper.xml文件中的namespace即是mapper接口的类路径。

:Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的 parameterType的类型相同
:Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的 resultType的类型相同

5.Mybatis的编程步骤是什么样的?

:编写MyBatis配置文件mybatis-config.xml
:编写接口映射文件XxxDao.xml 文件
:使用Resources工具类读取mybatis-config.xml 配置文件
:实例化SqlSessionFactoryBuilder 对象并调用 build方法初始化MyBatis框架
:通过SqlSessionFactory打开SqlSession 会话对象
:使用SqlSession对象的数据操作方法完成数据操作
:关闭SqlSession 会话对象

6.使用分页插件的步骤?

第1步,导jar包
在这里插入图片描述
第2步,在配置文件中进行配置
在这里插入图片描述
第3步,熟悉第三方包的API,使用API完成相关功能
在这里插入图片描述
补充:
ThreadLocal(线程局部变量)实现了线程内方法之间数据共享的作用,例如共享数据库的连接。

7.解释一下你对负载均衡和集群的理解?

①:负载均衡解决请求分发的功能,有许多种算法,最简单一种就是轮询方法。
②:集群解决系统横向扩展,一台机器处理不了,可以多台机器共同来处理,每台机器装的的系统都是一样的。
③:负载均衡会和集群搭配使用。
④:常用的负载均衡服务器(软件方面)有:ngnix、apache;硬件方面F5
⑤:参考资料:https://www.cnblogs.com/Joanna-Yan/p/8745794.html
在这里插入图片描述

8.多对一的情况,mybatis如何进行相关配置?(例如:文档和文档类别是多对一)

①:实体类中增加分类对象作为属性成员,
②:在dao接口的映射文件中增加

<association property="category" resultMap="skuCatMap"></association>

9.一对多的情况,mybatis如何进行相关配置?(例如:文档类别和文档是一对多)

①:实体类中增加集合作为属性成员
②:接口映射文件中增加如下

<collection  property="docs"   resultMap="docMap"></collection>

一对多场景:老师与学生之间一对多,sql是左连接查询,map映射文件使用collection标签完成学生的映射。
Map配置要点:在配置双向一对多关联关系的 resultMap中,在多的这边使用<association>元素配置关联信息,在一的这边使用<collection>元素配置关联信息。
sql语句
select * from teacher left join student using(tno);
在这里插入图片描述
在这里插入图片描述

10.表的主键生成情况总结(非面)

①:主键由Java代码生成,通常如果主键值是UUID值的,可以采用此方法。
在这里插入图片描述
②:主键由数据库生成,主要针对于主键是数值的情况,Mysql可以借助自增机制,Oracle借助于序列来实现。

如下是Oracle参考Map文件配置代码:
在这里插入图片描述
如下是Mysql参考Map文件配置代码:
在这里插入图片描述
补充
如何实现假删除?
正常的查询界面不显示,可以给用户提供另外一个界面查看,但数据库中这个结论还在。
做法:在表中增加一个id_del字段,值为0或1,0代表删除,1代表正常;本质上执行的是update操作,而不是delete操作;
场景:对于重要的数据,例如财务数据,可以进行类似的表设计;
缺点:数据量大,对查询性能有一点点影响。

11.Mybatis中#和$的区别?

①:#相当于对数据加上双引号,$相当于直接显示数。
②:#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
③:$方式一般用于传入数据库对象,例如传入表名。
建议:一般能用#的就别用$

12.MyBatis中的动态SQL是什么意思。如何实现动态SQL?

根据不同的条件需要执行不同的SQL命令,称为动态SQL。采用<if>,<choose>,<where>,<foreach>,<trim> ,<set>
总结
If标签、where标签、trim标签:适用于where后条件不确定的情况
Choose标签:适用于条件分类的情况
Foreach标签:适用于in查询
Set标签:使用update语句
Sql标签+include标签 解决多个标签中出现重复sql的问题。

①:If 使用

<select id="selByAccinAccout" resultType="log">
select * from log where 1=1
<!-- OGNL 表达式,直接写 key 或对象的属性.不需要添加任
何特字符号 -->
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</select>

②:<where>的使用
a、当编写 where 标签时,如果内容中第一个是 and 去掉第一个
and
b、如果<where>中有内容会生成 where 关键字,如果没有内容不
生成 where 关键字
c、比直接使用<if>少写 where 1=1

<select id="selByAccinAccout" resultType="log">
select * from log
<where>
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</where>
</select>

③:<choose> <when> <otherwise>的使用
a、只有有一个成立,其他都不执行.

<select id="selByAccinAccout" resultType="log">
select * from log
<where>
<choose>
<when test="accin!=null and accin!=''">
and accin=#{accin}
</when>
<when test="accout!=null and accout!=''">
and accout=#{accout}
</when>
</choose>
</where>
</select>

④:<set>用在修改 SQL 中 set 从句
作用:
a、去掉最后一个逗号
b、如果<set>里面有内容生成 set 关键字,没有就不生成
c、id=#{id} 目的防止中没有内容,mybatis 不生成 set 关键字,如果修改中没有 set 从句 SQL 语法错误.

<update id="upd" parameterType="log" >
update log
<set>
id=#{id},
<if test="accIn!=null and accIn!=''">
accin=#{accIn},
</if>
<if test="accOut!=null and accOut!=''">
accout=#{accOut},
</if>
</set>
where id=#{id}
</update>

⑤:Trim的使用
a、prefix 在前面添加内容
b、prefixOverrides 去掉前面内容
c、 suffix 在后面添加内容
d、 suffixOverrieds 去掉后面内容
e、 执行顺序去掉内容后添加内容

<update id="upd" parameterType="log">
update log
<trim prefix="set" suffixOverrides=",">
a=a,
</trim>
where id=100
</update>

⑥:<bind>的使用
a、作用
给参数重新赋值
b、场景
1.模糊查询;
2.在原内容前或后添加内容

<select id="selByLog" parameterType="log"
resultType="log">
<bind name="accin" value="'%'+accin+'%'"/>
#{money}
</select>

⑦:<foreach>的使用
a、作用:
循环参数内容,还具备在内容的前后添加内容,还具备添加分隔符功能.
b、适用场景:
in 查询中.批量新增中(mybatis 中 foreach 效率比较低)
c、参数介绍

  1. collection=”” 要遍历的集合
  2. item 迭代变量, #{迭代变量名}获取内容
  3. open 循环后左侧添加的内容
  4. close 循环后右侧添加的内容
  5. separator 每次循环时,元素之间的分隔符
<select id="selIn" parameterType="list"
resultType="log">
select * from log where id in
<foreach collection="list" item="abc" open="("
close=")" separator=",">
#{abc}
</foreach>
</select>

⑧:<sql><include>的使用
a、某些 SQL 片段如果希望复用,可以使用<sql>定义这个片段

<sql id="mysql">
id,accin,accout,money
</sql>

b、在<select><delete><update><insert>中使用<include>引用

<select id="">
select <include refid="mysql"></include>
from log
</select>

13.谈谈你对IOC/DI的理解?

①:IOC控制反转,它是之前由程序员主动通过new数理化对象的事情转交给spring负责,控制反转中的控制指的是控制类的对象,反转指的是转交给spring负责,其中IOC最大的作用是实现了解耦,即程序员不需要管理对象,解除了对象管理和程序员之间的耦合。
②:DI指的是依赖注入,和IOC是一样的,当一个类A中需要依赖另一个类对象B时,把B赋值给A的过程就叫做依赖注入。有三种方式设值注入、构造注入和自动注入。
关于IOC(控制反转)的解读:实际上就是将对象的创建权交给了Spring,程序员无需自己手动实例化对象。

DI:依赖注入,在Spring框架负责创建Bean对象时,动态将依赖关系对象注入Bean组件。(其实就是解决类中类型属性的实例化的问题)
在这里插入图片描述
多例:每次获取bean的时候,spring都会实例化新的,内存中不止一份。
单例:spring使用单例的目的,提高程序的性能,节省内存空间。
在这里插入图片描述
关于懒加载(或叫延迟加载)的解读:
Spring容器会在调用的时候才去实例化上面的bean;如果为false,在spring容器在启动后就会自动实例化上面的bean;

14.ApplicationContext和BeanFactory区别是什么?

ApplicationContext包括 BeanFactory 的全部功能,除非应用程序对性能要求很高时才考虑BeanFactory,其他情况下建议优先使用ApplicationContext。
延迟实例化的优点:(BeanFactory)
应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势;
不延迟实例化的优点: (ApplicationContext)

  1. 所有的Bean在启动的时候都加载,系统运行的速度快;
  2. 在启动的时候所有的Bean都加载了,我们就能在系统启动的时候,尽早的发现系统中的配置问题
  3. 建议web应用,在启动的时候就把所有的Bean都加载了。(把费时的操作放到系统启动中完成)

15.自动注入byName和byType的区别?

①:Byname通过名称自动注入,在Spring容器中找类的id,
②:Bytype根据类型注入,Spring容器中不可以出现两个相同类型的<bean>,也就是说class不能是同一个实现类或者不同的类实现的相同接口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照byName实现自动注入,类中包含属性的名称要和该属性配置的bean中id属性值保持一致。
在这里插入图片描述
在这里插入图片描述
按照byType实现自动注入,类中包含属性其对应类型的bean在spring容器中只能有一个,上面因为2个,造成错误发生。

16.@Autowired 和@Resource的区别?

@Resource 的作用相当于 @Autowired,只不过 @Autowired 默认按 byType 自动注入,而 @Resource 默认按 byName 自动注入罢了。

17.Spring中涉及IOC/DI常用注些解有哪些?

注解的目的:就是为了简化XML中配置,将配置的内容移到Java代码中;
1、@Component,
创建bean的id值,无需指定创建的bean的id值,默认创建的bean的id值为小写的类名,也可以指定bean的id值
@Componen(“person”),则指定一个bean的id值
2、@Respository
创建bean的id值,针对的是dao持久层bean的组件
@Respository(“person”),则指定一个bean的id值
3、@Service
创建bean的id值,针对的是service服务层(业务层)bean的组件
@Service(“person”),则指定一个bean的id值
4、@Controller
创建bean的id值,针对的是web表现层bean的组件
@Controller(“person”),则指定一个bean的id值
5、@Value(“属性值”)
定义在属性字段上 针对的是基本类型和String类型,如果使用了这个注解,则该属性的set方法可以省略不写。
如 @Value(“张三”)
private String name;
6、@Autowired
定义在属性字段上的 针对的是对象类型,如果定义在了那个对象类型的属性身上会自动去spring容器中找该类型的实例对象给赋值。如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false)
7、@Resource或者@Resource(name=“xxxxx”)
8、@ Scope 作用域
9、@Qualifier注解为方法指定要注入的依赖bean的名称。
10、@PostConstruct 和 @PreDestroy。
注解的位置:类的前面,属性的前面,方法的前面,方法参数的前面(不是所有的注解都能够放到上面四个位置的前面)

18.什么是AOP?

AOP即面向切面编程,可以说是 OOP(面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过 OOP 允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP 技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能。比如,一个日志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程序可以有若干切面。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。

19.在 Spring AOP 中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

20.什么是目标对象?

被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

21.什么是连接点?

被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

22.什么是切入点?

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

23.Spring 的通知是什么?有哪几种类型?

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。
Spring 切面可以应用五种类型的通知:
1)before:前置通知,在一个方法执行前被调用。
2)after: 在方法执行之后调用的通知,无论方法执行是否成功。
3)after-returning: 仅当方法成功完成后执行的通知。
4)after-throwing: 在方法抛出异常退出时执行的通知。
5)around: 在方法执行之前和之后调用的通知。

24.什么是代理?

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

25.什么是织入?

织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。织入可以在编译时,加载时,或运行时完成。
在这里插入图片描述

26.SpringMVC的工作原理?

在这里插入图片描述

  1. 用户向服务器发送请求,请求被 springMVC 前端控制器DispatchServlet 捕获;
  2. DispatcherServle 对请求 URL 进行解析,得到请求资源标识符(URL),然后根据该 URL 调用 HandlerMapping将请求映射到处理器 HandlerExcutionChain;
  3. DispatchServlet 根据获得 Handler 选择一个合适的 HandlerAdapter 适配器处理;
  4. Handler 对数据处理完成以后将返回一个 ModelAndView()对象给 DisPatchServlet;
  5. Handler 返回的 ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet 通过ViewResolver 试图解析器将逻辑视图转化为真正的视图 View;
  6. DispatcherServlet 通过 model 解析出 ModelAndView()中的参数进行解析最终展现出完整的 view 并返回给客户端;
    servlet-mapping作用:是URL请求和servlet之间映射
    在这里插入图片描述

27.SpringMVC常用的注解?

1、@Controller 用于controller层的类上
2、@RequestMapping 处理请求地址映射的注解,用在类上或者方法上
3、@Resource和@Autowired bean注入时使用的注解前者通过byName,后者通过byType
4、@PathVariable 用于将url中的模板变量映射到功能处理方法的参数上,即取出url模板中变量作为参数。
5、@RequestHeader 注解只能修饰请求处理方法的形参,某个请求头数据绑定到请求处理方法的形参中,以便请求处理逻辑访问使用
6、@CookieValue 注解只能修饰方法形参,能够把 Cookie的值绑定到形参供方法处理请求使用
7、@ModelAttribute Controller的所有方法调用之前,先执行此@ ModelAttribute的方法,通常和@SessionAttributes一起使用
8、@SessionAttributes 只能用在类上@requestMapping 用于请求 url 映射。
9、@requestParam 注解只能修饰请求处理方法的参数,也就是说它不能用在方法前面,也不能用在类前面。主要作用是说明请求参数与请求处理方法形成的对应绑定关系
10、@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
11、@ResponseBody注解实现将 controller 方法返回对象转化为 json 响应给客户。

28.@RequestParam如何使用?

@RequestParam注解只能修饰请求处理方法的参数,也就是说它不能用在方法前面,也不能用在类前面。主要作用是说明请求参数与请求处理方法形成的对应绑定关系。
@RequestParam注解有三个参数。
value:请求参数名称。
required:该请求参数是否必须存在,如果请求中缺少该参数,请求处理过程异常终止。
defaultValue:该请求参数的默认值,如果请求中缺少该参数,则用该默认值。
设置绑定的请求处理方法的形参。会自动把 required参数设置为 false。

29.@ModelAttribute如何使用?

1.用在参数的前面:接收请求参数,在request范围,等价于request.setAttribute(“ent”,ent)。
2.如果修饰的不是形参,而是修饰方法,那么当前请求处理器类中的任何一个请求处理方法执行之前,该方法都会被执行,而且方法返回值会作为模型对象。

30.@SessionAttribute如何使用?

@SessionAttributes注解来实现会话数据共享,除了可以通过属性名指定需要放到会话中的属性外(value属性值),还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types属性值),通常是和@ModelAttribute一起使用的

31.谈谈你对RESTful接口的理解?

RESTful接口是一种API接口设计风格,也是一种设计规范,目前在项目开发中已经越来越流行;比如RESTful建议请求需要区分GET、POST、PUT等;返回的数据建议是JSON;网络协议使用https;请求url包含版本号等等。
Restful风格接口的好处:前后端分离。前端拿到数据只负责展示和渲染,不对数据做任何处理。后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口。
前后端分离
后端提供Json数据(使用RESTful接口风格的接口),可以供PC端、移动端(IOS、Android)使用;前端负责页面渲染和页面之间跳转。

32.说一说你对Java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。

①:hashcode方法返回该对象的哈希码值。 hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置, Map在搜索一个对象的时候先通过hashCode()找到相应的位置,然后再根据equals()方法判断这个位置上的 对象与当前要插入的对象是不是同一个。
②:当我们重写一个类的 equals 方法时就应当连同重写 hashcode 方法,并且两个方法应满足:
2.1:一致性,即:当两个对象 equals 比较为 true,那么 hashcode 值应当相等,反之亦然, 因为当两个对象hashcode 值相等,但是 equals 比较为 false,那么在 HashMap 中会产生链表,影响查询性能。
2.2:成对重写,即重写 equals 就应当重写 hashcode。
使用场景:在比较一个类的两个对象时,如果你希望采用你自己的规则来判断两者是否相同,就重写hashCode方法,来实现自己的比较逻辑。如果不重写,就是使用默认的hash code来比较。

33.MVC设计模式的不足及如何解决?

MVC设计模式的不足
1、每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂。
2、实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果。
3、渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。
如何解决?
为了使数据展现过程更加直接,并且提供更好的用户体验,我们有必要对MVC模式进行改进。不妨这样来尝试,首先从浏览器发送AJAX请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。(AJAX局部刷新)

34.java.util.Date与java.sql.Date区别?

1、java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分,一般在读写数据库的时候用,PreparedStament的setDate()的参数和ResultSet的getDate()方法的都是java.sql.Date
2、java.util.Date是在除了SQL语句的情况下面使用,一般是日常日期字段
3、java.util.Date 是 java.sql.Date 的父类,即:继承关系:java.lang.Object --》 java.util.Date --》 java.sql.Date

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值