JavaSE|Java面试题--Web部分

1、你们怎么在后端获取到cookie中的options里面的数据?

request.getCookie("options")

2、写过servlet吗?用过定时任务类吗?(java中自带的timer类)? 3、什么是servlet,主要作用有哪些?
Servlet是用来开发动态web资源的技术;
主要用来处理客户端传来的Http请求,并返回响应,能够处理的请求有GET和POST
4、什么是jsp,主要作用有哪些?
用来实现页面数据的动态加载

5、Jsp编译原理?
jsp会首先编译成一个Servlet,

6、Servlet线程安全吗?怎么解决?
不安全。 Servlet是单例的,每一个Servlet在Tomcat中只能有一个实例对象,因此多个Http请求访问同一个Servlet时,会并发调用service()方法
解决:1.减少使用全局变量、尽量使用局部变量。2.使用ThreadLocal解决共享变量。3.加锁Synchronized
7、Jsp内置对象有哪些?作用分别是什么?
1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象 response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3、session对象 session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象 ? application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象 out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象 pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象 config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象 page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象 exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
8、说一下JSP中的4种作用域?
application:全局作用范围,整个应用程序共享.生命周期为:应用程序 启动到停止;
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服 务器就可以记住这个会话状态;
request:请求作用域,就是客户端的一次请求;
page:一个JSP页面。
以上作用范围使越来越小, request和page的生命周期都是短暂的,他 们之间的区别就是:一个request可以包含多个page页(include, forward)。
9、Jsp中如何进行循环遍历?
使用JSTL实现:

10、Jsp和servlet有什么区别? 11、session和cookie有什么区别?
session:服务器端会话、基于cookie实现、安全 cookie:客户端会话、数据不安全

12、说一下session的工作原理?
创建session之后,服务器端会响应给客户端一个创建cookie的命令,创建一个名为JSESSIONID的cookie,存放的是session的id;
客户端发起请求时,会携带这个cookie,服务器端会根据这个cookie查询session
13、如果客户端禁止cookie后session还能用吗?为什么?

因为session是基于cookie实现的,需要客户端创建一个名为JSESSIONID的cookie,存放着session的id,因此当客户端禁止cookie后,无法获取sessionId,session也就失效了。但
解决:1.可以将sessionId拼接在url地址中,每次发送请求都拼接上sessionId就可以使用了
2.将sessionId放在请求参数中,发送给服务器
3.将sessionId存放在请求头中
14、说一下重定向和转发的区别?
重定向:重新发起一次请求,一次操作相当于两次请求,不能访问应用中受保护的目录 转发:应用内部完成转发操作,可以访问内部资源,也可以访问外部资源,属于一次请求

15、解析XML文档有哪几种方式? 略
16、为什么要使用Ajax技术 ,有什么好处?
可以实现页面的异步加载,提升用户体验

17、JQuery中的Ajax怎么实现同步? 18、如何解决Ajax跨域问题?
1.跨域资源共享(CORS),在响应头中添加允许访问: response.addHeader(‘Access-Control-Allow-Origin:*’); //允许所有来源访问 response.addHeader(‘Access-Control-Allow-Method:POST,GET’); //允许访问的方式 2.搭建nginx网关,访问网关,然后将请求转发到对应的网址 3.搭建springcloud gateway网关

19、TCP与UDP的区别? 20、JQuery中的常用选择器?
id选择器:# class选择器:. 标签选择器

21、JSP中如何防止表单重复提交?(令牌机制) 22、说一下Servlet的生命周期?
【JavaSE|Java面试题--Web部分】Tomcat默认是在请求第一次访问Servlet时,调用init()方法创建对应的Servlet实例对象,在以后的请求中只执行service()方法;在对象销毁前执行destroy()方法,而Servlet对象的销毁是在Tomcat应用停止服务之前。
可以通过修改load-on-startup标签或注解来修改对应Servlet的创建时机;正整数代表服务器加载时创建,值越小、优先级越高。
23、说一下session和cookie的生命周期?

24、如何解决浏览器请求服务器乱码及服务器响应浏览器乱码?
request.setCharacterEncoding() response.setContentType()

如何实现接口的幂等性?
同一个接口,多次发出同一个请求,必须保证操作只执行一次。
解决分为两种:客户端解决方案、服务端解决方案
  1. 按钮只能按一次
  2. 采用token机制:用户进入该页面时服务端为其产生一个token,并存储在redis中,随后发起请求时需携带该token,当请求进入后,从redis中查询是否存在,若存在则删除,并开始执行业务;若不存在,则不能执行,直接返回。
  3. 当点击按钮后执行重定向或转发操作
  4. 使用数据库唯一约束,在操作前插入数据库,这样当第二次请求进入后,会插入异常,直接返回。
25、Mysql中char和varchar有什么区别?
char:固定长度的字符串,存放手机号、身份证号、MD5密文 varchar:可变长度的字符串、效率偏低

26、Mysql中float和double的区别是什么?
float: 单精度浮点,4个字节、7位有效数字;效率高、不精确 double: 双精度浮点,8个字节、16位有效数字;效率低、较为精确 decimal: 用于存放金额等需要高精确度的数据,9位十进制存储4个字节decimal(总长度M,小数长度D)

27、Mysql中date和datetime类型的区别?
date: YYYY-MM-DD,精确到天 datetime: YYYY-MM-DD HH:mm:ss,精确到秒,跨时区易出现问题 time: HH:mm:ss,只需要时间值时,使用该字段 timestamp: YYYY-MM-DD HH:mm:ss,可跨时区使用

28、Mysql中sql语句执?的顺序?(查询语句、增删改语句)
from on join where group by having+聚合 select order by limit

29、说一下Mysql常用的引擎?
Innodb: 默认存储引擎,支持事务,支持并发控制、占用磁盘空间大、表结构存储在frm文件中,数据和索引存储在ibd中,对事务的完整性有较高要求、并发的数据一致性、读写频繁时采用该引擎
MyISAM: 访问快,不支持事务和外键,表结构存储在frm中,数据存储在myd中,索引存储在myi中
插入和查询多时,只有很少的更新和删除操作,对事务的完整性和并发性要求不是很高时,可采用该引擎
MEMORY: 内存存储、速度快,不安全,适合少量快速访问的数据,表结构存储在frm中
在需要快速定位记录和其它类似数据环境下,可以提供更快的访问
30、说一下MySQL数据库事务的三个安全性问题?
A原子性:一个事务中所包含的所有操作应当同时失败,或同时成功 C一致性:事务操作前后的数据应保持一致性状态 I隔离性:当并发访问同一张表时,数据库为每个用户开启事务,这些事务之间互不影响 D持久性:事务操作一旦提交,数据就被永久修改,不会丢失事务的操作 脏读: 允许读取其它事务修改但未提交的数据,另一个事务回滚,则该事务数据无效【针对无效数据】 不可重复读: 在一次事务中两次读取同一个数据,两次值不同; 【针对值不同】 幻读: 在读取过程中,数据条目发生了变化【针对数据条目不同】

31、说一下MySQL数据库事务的隔离级别?
read uncommited: 读未提交;脏读、不可重复读、幻读 read commited: 读已提交;不可重复读、幻读 repeatable read: 可重复读;幻读------default serialize: 串行化。

mysql中null参与的算术运算结果都是null
32、谈谈对Mysql存储过程的认识?
当存在一段sql语句被频繁执行时,可以将这些sql语句预先编写编译后存储在数据库中,当需要使用时直接调用即可,这样可以简化开发、也可以提升sql执行效率,无需反复编译。
33、Mysql中存储过程和存储函数的区别?
存储过程:没有、
存储函数:必须有返回值、
34、说一说你对触发器的理解?(触发器是一种特殊的存储过程)
触发器是与表有关的,数据库对象,预先编译好的一段sql语句的集合,存放在数据库中,当对数据库的某个操作触发了这个触发器后,会执行触发器中的sql语句,可以理解为一种被数据库自动调用的存储过程。触发器的这种特性可以协助应用在数据库端确保数据的完整性 、日志记录 、数据校验等操作
触发器分为三种:INSERT、UPDATE、DELETE,可以发生在之前或之后。
35、开发中用的什么数据库,group by 和order by 都是啥意思?
group by:按照指定字段进行分组,将多行数据聚合为一行
order by:按照指定字段进行排序,默认是按照升序排序
36、Inner join、left join和right join 的区别?
Inner join:内连接,仅保留左右两表共有的数据,去除多余的数据
left join:左外连接,以左表为主,将右表数据对应到左表中,右表中不存在的数据行用null表示
right join:右外连接,以右表为主,将左表数据对应到右表中,左表中不存在的数据行用null表示
37、a、b两表字段相同,写一条sql将a表数据拷贝到b表中?
INSERT INTO table_b (SELECT * FROM table_a); 思路:先将a表数据全部取出来select * from a; 然后b表执行插入操作insert into b (); 括弧中需要被插入的数据,可以直接将select查询嵌套进去

38、Mysql数据库的三大范式是什么?
范式一:表中的每一个字段都不可再分,每一个字段都代表的是一个单独的信息
范式二:符合范式一,并拥有唯一主键、不存在多主键
范式三:符合范式二,不依赖非主键字段及更深层次的依赖,即表中所有字段都只依赖主键
反三范式:可以允许有少量的冗余字段,例如员工信息中可以存在部门id和部门名称,因为部门名称很少涉及修改,因此将其作为冗余字段,提升查询效率;其中部门名称依赖于部门id,而不依赖员工信息表主键。
39、Mysql中如何获取当前数据库版本?
mysql -v

40、Mysql和Oracle如何实现分页?
limit 7-- 查询出7条数据 limit 2,7 -- 从索引2开始,查询7条数据

Oracle不会
41、Mysql中往两个字段中间添加一个新字段,sql语句如何实现?
ALTER TABLE ’表名‘ ADD COLUMN 列名 类型 [AFTER 已存在的列名]|[FIRST]

42、Mysql和Oracle行列转换,sql语句如何实现? 43、Mysql中如何给字段创建索引?索引原理?
-- Innodb和MyISAM默认使用B+Tree索引 CREATE [UNIQUE][FULLTEXT] INDEX 索引名称 [USING 索引类型] ON 表名(列名...); ALTER TABLE 表名 ADD INDEX 索引名称(列名...); -- 查看索引 SHOW INDEX FROM 表名; -- 删除索引 DROP INDEX 索引名 ON 表名; 索引就是为某一个或多个字段创建一个高效的查询结构,本质就是一个获取数据的数据结构,具有很高的查询效率。

44、Mysql中创建索引越多越好吗?为什么?
不是。因为创建索引实际上是为该字段创建一个高效的查询数据结构,通常在查询时具有很高的效率,但是在进行插入、修改和删除等操作时,可能会涉及到数据结构的变化,因此增删改的效率会非常低;并且索引在未命中时,并不会为查询带来效率的提升。
因此应当为查询操作较多,而增删改操作较少的字段创建索引,从而优化数据库的效率
45、说一说你们公司数据库都是如何优化的?
  1. 创建索引:
  2. 分库:根据业务不同,把不相关的表切分到不同的数据库中。或者做主从架构
  3. 分表:解决单表压力的问题,分表后程序只对一个总表进行操作,总表中只存放一些分表的关系、及数据的更新方式,总表会根据不同的查询,将压力分散到不同的小表上,因此提高并发能力和磁盘I/O性能
    垂直拆分:把原表中很多字段拆分成多个表,解决宽度问题,例如,将大字段单独放在一张表中,关联密切的字段放在一个表中。字段的宽度也会影响查询的效率
    水平拆分:把表拆分成多个结构完全相同的表,数据分别存放在多个表中,解决单表数据量大的问题
  4. 使用缓存和NoSql
  5. 减少数据库操作次数,尽量使用数据库访问驱动的批处理方法
  6. 不常使用的数据迁移备份,避免每次都在海量数据中去检索。
  7. 提升数据库服务器硬件配置,或者搭建数据库集群。
  8. 优化sql查询语句
    1. 在sql中减少 ***** 的使用,*在执行时会首先转义成表中的字段
    2. 使用联合查询替换子查询、使用union替代手动创建中间表
    3. 选用合适的字段属性:字段的宽度尽可能小,查询越快
    4. 减少使用like ,like 'aaa%'会命中索引,但是like '%aaa%'就不能命中索引
46、说一下Mysql的行锁和表锁?
行锁:开销大、加锁慢、操作时锁定当前行;会出现死锁;锁定力度小,不易发生锁冲突;并发度高
只有Innodb支持行锁,且默认是行锁;当没有索引列时,会提升为表锁
表锁:开销小,加锁快,操作时锁定整张表;不会出现死锁;锁力度过大,易发生锁冲突;并发度低
JavaSE|Java面试题--Web部分
文章图片

47、数据库表结构设计字段怎么优化?
在合理情况下选择字段宽度小的
减少冗余字段
当表中字段过多时,进行垂直分表
48、Mysql数据库如何实现主从复制?如果主库出现问题了,从库怎么办?
主从复制:
  1. 当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
  2. salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
  3. 当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
  4. I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log
  5. SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。
复制的类型:基于sql语句的复制(默认)、基于行内容的复制、混合类型的复制
主库出现问题:
  1. 短时间宕机:如网络波动,修复网络或重启主库即可
  2. 长时间宕机:略;需要保证从库完成relay-log之后,将从库提升为主库。
49、Mysql中如何实现读写分离?
读写分离:AOP / Apache ShardingSphere / Amoeba / MySQL-Proxy
  1. AOP:实现复杂
  2. ShardingSphere :使用简单、支持事务。
  3. Amoeba :阿里的开源项目、不支持事务和存储过程;能够完成多数据源的高可用、负载均衡、 数据切片的功能
  4. MySQL-Proxy:MySql官方提供、不建议使用。
存在的问题:从机是通过binlog日志从master同步数据的,如果在网络延迟的情况,从机就会出现数据延迟。那么就有可能出现master写入数据后,slave读取数据不一定能马上读出来。
ShardingSphere 的事务处理:如果同一个线程,同一个数据库连接内:发生一个写操作后,其余的读写操作均发生在主库中。
50、数据库连接池原理是什么?
在程序启动时创建一定数量的连接存放在连接池中,当需要对数据库进行操作时,从连接池中获取一个连接,在使用完毕后,再将连接放回连接池,实现连接的复用,减少数据库连接的创建和销毁操对系统性能的影响。
51、常?的?性能连接池有哪些?
C3P0、Druid、
52、什么情况下会出现内存泄漏? 53、Mysql中常用的几种约束?
非空约束、主键约束、唯一约束、自增、外键约束
54、Mybatis如何实现分页,分页插件的原理是什么?
使用PageHelper分页插件实现,其原理是通过拦截器实现的,在执行时往所有要执行的sql语句后加上limit限制条件
55、Mybatis中${} 和#{}有什么区别?
${}:在sql中动态的传入参数,但是是直接进行字符串拼接的,对整个字符串进行sql编译,存在sql注入问题
#{}:在sql中动态的传入参数,会先对sql语句预编译,然后设置参数、最后执行,防止出现sql注入问题。
56、如何执?批量插?(mysql,oracle不同) ?
insert into xxxx values xxx INSERT INTO copy_emp(empno,ename,job,mgr) SELECT #{copyEmp.empno},#{copyEmp.ename},#{copyEmp.job},#{copyEmp.mgr} FROM dual INSERT INTO copy_emp(empno,ename,job,mgr) SELECT seq_stu.nextval,s.* FROM ( SELECT #{copyEmp.ename},#{copyEmp.job},#{copyEmp.mgr} FROM dual ) s

57、如何在插?后获得主键(mysql,oracle不同)?
在XML中:在insert标签中写入该属性 useGeneratedKeys=“true” keyProperty=“id” keyColumn=“id”
在注解中:在insert注解上方添加 @Options(useGeneratedKeys = true, keyProperty = “id”, keyColumn = “id”)
keyProperty="id" resultType="String" order="BEFORE"> select suser.nextval from dual insert into T_USER(id, name, age) values(#{id}, #{name}, #{age}) keyProperty="userId" order="BEFORE" resultType="java.lang.Integer"> select SYS_GUID() as userId from DUAL insert into T_USER(userId,userName,birthday,sex,address) values (#{userId},#{userName})

58、Mybatis中resultmap是做什么的?
用来做数据库字段和模型类的属性一一对应的,可以实现关联查询中一对一、一对多、多对多的结果封装
若要实现MyBatis的延迟加载,则必须使用ResultMap实现。
59、Mybatis中resulttype和resultmap区别?
resultType:是直接引用实体类的全类名,所有字段使用自动映射
resultMap:通过自定义配置表字段和实体类的映射,比resultType更加灵活
60、mybatis都有哪些 Executor 执?器?它们之间的区别是什么?
这三个执行器都继承自BaseExecutor
SIMPLE: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作
BATCH: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作
REUSE: REUSE 执行器会重用预处理语句(prepared statements)
PreparedStatement 和 Statement 的异同
Statement:是直接对sql语句进行编译运行
PreparedStatement:预先对sql语句编译,设置参数,执行;并对编译的sql语句进行缓存,方便下次直接使用
61、mybatis?级缓存和?级缓存?
一级缓存:1. session级别(默认):对于同一个sqlSession对象,会为查询操作建立缓存通过key-value键值对进行存储,当下次出现相同的查询时就会命中缓存,不进入数据库查询。一旦进行了增删改操作,就会触发clearLocalCache()清理缓存。2. statement级别,每次查询结束都会清理缓存,相当于禁用了一级缓存
二级缓存:mapper的命名空间级别的缓存,也就是多个sqlSession之间共享缓存,每个命名空间都有自己的二级缓存,是表级缓存;同一个命名空间的sql操作会影响共同的缓存。二级缓存默认不开启,需要使用cacheEnabled开启。它存在一些缓存回收策略:最近最少的回收(默认)、先进先出、软引用、弱引用。
当使用联表查询时,会在对应的那个命名空间中存在一个缓存,而在另一个命名空间中对其中一个表进行了增删改操作后,再次执行查询操作,会直接从缓存中获取,从而出现了脏数据。可以通过命名空间引用cache-ref的方式解决。因此多表操作不建议使用二级缓存
二级缓存是以命名空间为单位的,增删改操作会清空所在的命名空间的缓存。
当多表操作不能使用二级缓存时,一级缓存就可以足够使用了,而且一级缓存效率更高。
sql查询顺序:二级缓存 -> 一级缓存 -> 数据库。
MybBatis会执行BaseExecutor中的query()方法,从一级缓存中获取数据,若获取不到,则从数据库中查询;当开启了二级缓存后,会通过装饰者模式实现,使用CachingExecutor对Simple、Reuse、Batch进行装饰,先查询二级缓存,再查询一级缓存、最后执行数据库查询。
一级缓存同样会出现脏数据,但是在分布式环境中当前一些简单事物存在几十毫秒的缓存脏读也是能接受的。所以可以设置为statement来解决分布式环境下的脏数据问题(PS:或者可以使用EnChach搭建分布式缓存)。
62、mybatis解析sql语句的原理?
(PS:先查缓存二级缓存和一级缓存,未命中时执行sql)
  1. 通过Resources加载配置文件
  2. 通过SqlSessionFactoryBuilder来解析xml文件,生成sqlSessionFactory对象
  3. 通过SqlSessionFactory调用openSession(),获得SqlSession对象
  4. 通过Mapper的class文件,使用sqlsession.getMapper()方法,该方法实际调用的是DefaultSqlSession中的getMapper方法,该方法会进入Copnfiguration的getMapper方法,而内部调用的是MapperRegistry中的getMapper方法,这个方法内部使用了MapperProxyFactory的newInstance方法,这个方法内部又使用的是jdk的动态代理Proxy.newProxyInstance来创建代理对象,因此所有的方法调用都会进入动态代理的第三个参数MapperProxy(InvocationHandler的实现类)代理策略中执行,该方法的invoke中执行execute方法,在该方法内部判断sql语句的类型(INSERT、DELETE、UPDATE、SELECT),在select中又存在多种查询策略executeForMany、executeForMap,在这些方法中又调用的是sqlSession的方法。
63、jdbc怎么调?存储过程? 64、mybatis怎么调?存储过程?
{call 存储过程名称(#{参数},#{参数})}

65、long类型对应mysql里的哪种类型? 66、1对1查询,1对多查询?

67、动态sql的常?标签,动态sql的执?原理 ?
>抽取公共的sql语句 用来引用公共sql语句

68、Mybatis是否支持延迟加载,延迟加载的原理是什么?
支持。懒加载只针对关联查询;延迟加载要求,对关联对象的查询与主加载对象的查询必须分别进行的select语句,不能是使用多表连接所进行的select查询。因为多表连接查询,其实质是对一张表的查询,对由多个表连接后形成的一张表的查询。
id="selectPlayerByTeamId" resultType="Player"> select id,name from t_player WHERE tid=#{id} id="selectTeamByIdAlone" resultMap="teamMapAlone"> SELECT id,name FROM t_team where id=#{id}

用Mybatis进行一对多、一对一、多对多的时候,先查询出一方,然后根据延迟加载的方式来决定何时执行对关联对象的查询。
? 1.当在Java程序中访问主加载对象时,执行关联对象的查询 -----》侵入式延迟aggressiveLazyLoading
? 2.当在访问关联对象的属性时,执行关联对象的查询 -----》深度延迟
name="lazyLoadingEnabled" value="https://www.it610.com/article/true"/>name="aggressiveLazyLoading" value="https://www.it610.com/article/true"/>

原理简析:启用懒加载后,底层会对懒加载的对象使用CGlib动态代理返回代理对象,因此在Java程序中使用的就是代理对象,因此调用代理对象的方法时,会被 代理类的处理器方法拦截来执行对应associationcollection标签中设置的select的语句。
总结:通过这种方式可以让mybatis在执行查询的时候减少sql的查询从而提高程序的执行效率,但是并不是所有场景下使用懒加载都能提高效率,有些场景比如在查询一对多时,就需要将一方和多方都查询出来,这样的话开启懒加载反而有可能会拖慢程序的执行效率。
69、Mybatis如何编写一个自定义插件?
实现Interceptor接口。对MyBatis 四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行拦截
15、VUE常用组件、标签? 16、VUE双向绑定的原理? 17、VUE中v-if和v-for的优先级和区别? 18、VUE的生命周期和钩子函数? 19、VUE的MVVM模型的理解? 20、VUE组件间的参数传递? 21、ElementUI能说出常用标签组件的用法就行? 22、Maven常用命令? 23、Maven生命周期? 24、Maven依赖冲突怎么解决?

    推荐阅读