
面试常见的一点点问题
问题
Mybatis ResultMap、延迟加载、关联查询 嵌套结果查询、分表查询
映射文件 --- 名称任意(通常和表关联)、保存位置在类路径下(可以在其他任意位置)
resultType 和 resultMap 属性加标签 -- 重点
1)在实现 select 查询时使用 resultType 或者 resultMap
2)区别:
A、resultType 只有属性;resultMap 有属性和标签
B、当实体类属性名和表中字段名称相同时使用resultType;
当实体类属性名和表中字段名称不相同时使用resultMap(使用mysql的字段别名也可以)
C、实现多表关联查询的时候使用resultMap,不能使用resultType。
3)resultType 可以设置的类型有哪些?
A、实体类类型
B、一般类型:Integer、String、Date……
C、Map 类型
4)resultMap (标签)可以设置类型有
A、实体类类型
B、复合实体类类型
resultMap属性和标签 -- 重点
关联查询第一套方案
嵌套结果查询 -- 连接查询
- 多表关联查询时,resultMap的使用 -- 要把数据映射封装到实体类/复合实体类对象中(否则使用
Map key-value即可)
- 多表关联查询,结果使用 map 封装,如何处理?
1)查询用户信息,关联详细信息
2)resultType 写map 用List Map 接收 即可
- 关联查询一对一查询(实体类和复合类封装数据)
1)查询用户信息,关联详细信息
- resultMap 标签 id result 标签 写 查询表的实体使用 association 标签 中 id、result 标签写连接
的表实体
3)SQL语句是连接查询语句(包括内外连接)
4)查询用户详细信息属于哪个用户
A、实体主方 添加 关联实体
- 关联查询 实现 一对多关联查询
1)查询用户信息,管理多收件地址
- 多对多的关联查询
1)查询用户信息,关联用户购买商品
2)通过 实体类设计 collection association标签嵌套关系 实现连接查询
关联查询第二套方案
- 一对一、一对多、多对多关联查询,换一种方式嵌套查询、分表查询方式。
- 一对一的分表查询实现
1)查询用户信息,关联查询详细信息
2)配置文件变化 语句变化为单表查询
一对一查询嵌套 association 标签中添加 column 属性(本方字段id值)和 select 属性(本方的字
段值送到对方的具体位置,实际上就是对方的某个方法处)相当于左外连接查询
特点:
SQL语句变化连接查询变为单表查询
在 association中没有下级标签 多了两个属性 column 和 select 对方需要配置相应xml内容
- 一对多实现
1)查询用户信息 以及具备的地址信息
2)association替换为collection javaType替换为ofType即可
- 多对多实现
1)查询用户 关联购买商品有哪些
延迟加载
- 介绍
延迟策略、懒加载、延迟查询,是和查询有关。是指在实现查询的时候把查询语句,从框架向数据
库的发送时间延后。在后续程序中如果需要使用相关的数据了,此时才向数据发送SQL查询语句。
- 在 mybatis 中延延迟策略的实现只有一种情况,关联查询时,查询对方数据可能会被延迟。
- 在 mybatis 中实现延迟策略时,只有分表方案才能实现延迟。(所以分表方式常用!)
- 演示
1)局部:使用get展示看效果
一对一、一对多的配置 association、collection 标签中 加入属性 fetchType 值为lazy 不用不发数
据,中间可以隔一段时间,用了才发送。
2)全局:核心配置文件加入全局配置settings标签(properties下typeAliases上)
name为 lazyLoadingEnabled、
aggressiveLazyLoading(极其懒加载)
value为true
3)目的:为了减少向数据库发送 SQL 的次数、从而降低数据库的压力,起到提高整体性能好处
SpringAOP 思想实现事务管理
aop 思想实现事务管理-- 重点
- 什么是事务?
是一个完整的数据库增删改查的执行单元,可能由多条 SQL 语句组成。
- 事务的特性?
原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability) --
ACID
1)原子性:要成功都成功(commit)、要失败都失败(rollback)
2)一致性:事务在执行前后,数据保持不变
3)隔离性:事务和事务之间彼此互不影响
4)持久性:事务在执行前后,对数据的影响是持久的
- 数据异常
脏读数据、不可重复读数据、幻读数据
1)脏读:读未提交
2)不可重复读:多次读数据不同
3)幻读:插入或者更改造成读取不同
- 数据异常的处理
事务隔离级别:读未提交、读已提交、可重复读、串行化/序列化
- 事务的传播性 -- spring实现事务管理时提出的概念
比如:在 service 层的某个方法中存在多个 dao 层方法的调用,service.save()
{dao.insert();dao.select();dao.update()},那么传播性就是事务由第一个 insert 方法传播到第二个
select() 再传播到第三个 update 方法;反过来就是把多个方法纳入一个事务管理单元。
保证同一个连接对象(连接对象绑定到线程中ThreadLocal)
- spring 中如何实现事务管理?
1)需求:银行中的转账功能的实现
2)实现:
A、创建表、实体类
B、造持久层功能方法
C、造业务层功能
D、相关配置以及事务管理的类
ThreadLocal<> 将连接对象绑定到线程中
queryRunner.query传递链接对象参数,保证事务传播一致性
- spring 框架中提供的事务管理的方式的实现
1)纯配置
2)配置和注解
@Transactional
3)纯注解
@EnableTransactionManagement
开启事务管理等同于上面标签
Spring MVC 执行流程

- 用户发送请求至前端控制器 DispatcherServlet
- DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet
- DispatcherServlet 调用 HandlerAdapter 处理器适配器
- HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)
- Controller 执行完成返回 ModelAndView
- HandlerAdapter 将 Controller 执行结果 ModelAndView 返回给 DispatcherServlet
- DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器
- ViewResolver 解析后返回具体 View
- DispatcherServlet 根据 View 进行渲染视图(即将模型填充至视图中)。DispatcherServlet 响应用户
Redis 介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息
中间件。
- 基于内存存储的、以key = value结构存储数据、开源的、可以用于实现数据库、缓存、消息中间件
的系统(从数据库角度,类似mysql,但是没有表结构,是键值对)
- 数据结构,以哪些结构存储数据?基本结构:字符串结构、列表结构、集合结构、有序集合结构
- 有事务管理、可以实现数据复制、可以实现数据的持久化、可以实现 LUA 的脚本操作
- Redis 有高可用、高性能特点:采用集群保证高可用和高性能,在实现集群的时候设置了哨兵的功
能。
Tomcat 的并发(同时访问一条连接) 200条 超过300宕机,需要使用集群。(搭建多个服务器,
每个都相同 用户随机访问)
分布式:不同功能分不同的模块,加上集群,一堆相同的登录、相同的评论等等等。一堆相同的是
一个小集群,小集群与小集群是分布式。
哨兵:用来监测集群的某个服务有没有宕机,是否正常工作,存在主服务。
端口:6379
Spring Boot 的 两种配置文件
SpringBoot 配置文件
- 配置文件作用规范
properties 预定义、自定义的键值对
ymal/yml
- yml 文件书写格式
key:空格value 如 name: zhangfei
并列关系,左侧对齐
有上下级关系的缩进几个
设置数组属性用 - 、或 []
双引号则 有转义字符的功能
单引号 为字符串拼接