-
SpringMVC
- springmvc是什么
- springmvc是一个轻量级web框架,属于spring框架一个模块。通过一套注解,可以让一个普通java类成为一个能够接收请求控制器,而无须实现任何接口。同时还支持restful风格请求方式
- springmvc常用注解
- requestMapping、postMapping、getMapping、controller、restController、requestParam、responseBody
- springmvc执行流程
- 前端发起请求,通过DispatcherServlet前端控制器
- 找到对应映射器返回调用链
- 在请求处理适配器执行具体业务处理
- 返回视图解析器
- 视图渲染
- springmvc返回值有哪些方式
- void:可能是返回视图地址、重定向、转发
- string:默认请求url做为逻辑视图地址返回,加上requestBody返回空json/重定向/转发
- ModelAndView:指定视图名称、也可以绑定数据
- json:方法上添加@ResponseBody注解,通过HttpMessageConverter转成json返回,如果使用Jackson或Gson不需要提供实例,而使用Alibaba的Fastjson则需要手动提供HttpMessageConverter实例
- springmvc模式是什么
- mode:模型,用于为视图提供数据
- controller:控制器,用于接受前端发起请求,返回模型数据
- view:视图,用于前端与用户进行交互的页面
- springmvc与status2有什么区别
- springmvc入口是dispatchSevlet,status2是filter过滤器
- springmvc是基于方法开发,请求参数传递到方法的形参,struts2基于类开发,传递参数是通过类属性
- strtus是采用值栈存储请求和响应数据,springmvc通过request请求内容解析,并给方法形参赋值
- springmvc有哪些优点
- 实现数据验证、数据绑定机制
- 与spring框架结合,拥有aop切面和di依赖注入的特点
- 支持灵活的url到页面控制器的映射
- 支持restful风格
- 可以很方便的和其他视图技术jsp、freemarker整合
- springmvc拦截get方法怎么配置
- 在requestMapping注解指定get方式
- 使用getMapping注解
- SpringMVC拦截器怎么实现
- 通过实现HandlerInterceptor接口
- 继承HandlerInterceptorAdapter适配器类
- springmvc怎么解决post和get乱码问题
- post通过在web.xml文件中配置过滤器设置utf-8编码格式
- get通过设置tomcat编码格式或在代码中获取参数进行设置编码格式
- SpringMVC怎么样设定重定向和转发的
- 转发在返回值前面加"forward:"
- 重定向在返回值前面加"redirect:"
- java请求转发区别:
- 请求转发在服务器端完成的;重定向是在客户端完成的
- 请求转发的速度快;重定向速度慢
- 请求转发的是同一次请求;重定向是两次不同请求。
- 请求转发地址栏没有变化;重定向地址栏有变化
- java请求转发区别:
- springmvc主要组件
- 前端控制器
- 映射器
- 适配器
- 视图解析器
- 视图
- Spring MVC注解原理是什么
- 注解本质是一个继承了Annotation的特殊接口,具体实现类是Java运行时生成的动态代理类。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。从Java常量池memberValues这个Map中索引出对应的值
- springmvc是什么
-
SpringBoot
- springboot是什么
- springboot是spring下面一个子项目,提供spring组件一站式解决方案,主要是简化了配置,提供各种启动器,能够让开发人员快速上手开发
- springboot核心注解
- springbootApplication主要是用于开启自动配置,包含
- SpringBootConfiguration:实现了@configuration注解,实现配置文件的功能
- EnableAutoConfiguration:打开自动配置功能,通过exclude关闭自动配置
- ComponentScan:spring组件扫描
- springbootApplication主要是用于开启自动配置,包含
- springboot配置文件有哪几种,有什么区别
- .properties 和 .yml
- 书写格式不一样
- .yml 格式不支持@PropertySource 注解导入配置
- springboot是什么
-
SpringCloud
- springcloud是一套微服务解决方案,不是框架也不是工具,它的核心思想是约定优于配置,基于springboot
- dubbo和springcloud区别
- 定位不同,springcloud提供的是微服务一站式解决方案,dubbo提供服务治理调用
- dubbo使用zookeeper,springcloud使用eureka
- dubbo性能是springcloud的3倍
- dubbo是阿里系,springcloud是springcloud社区,privotal公司开发
- springcloud提供服务网关、消息总线、批量任务、数据流,dubbo没有
- dubbo使用rpc调用方式,springcloud使用rest api
- soa和微服务区别
- soa:面向服务架构,他是一种设计方法,其中包含多个服务,服务之间通过相互依赖最终提供一系列功能。各个服务之间通过网络调用
- 微服务:微服务和soa架构类似,是在soa架构上进行改进的,微服务的核心重点就是业务完全的组件化和服务化。通过把原有的单个业务系统拆分成多个可以独立开发、部署、运行的微服务。
- rpc和restful区别
- rpc是一种远程调用协议,restful是一种设计风格
- rpc是基于tcp,restful基于http,可以使用xml或json格式定义
- rpc传输速度比restful更快,restful传输数据量比rpc更大
- restful的api是面向资源,对于同一个资源可以使用get、post、put进行操作,rpc直接体现在url接口地址上面
- rpc与http、tcp、udp、socket区别
- rpc是一种基于tcp的远程调用协议
- http是一种超文本传输协议,建立在tcp协议之上
- udp是一种传输协议,不需要进行连接,直接把信息封装成多个报文直接发送,所以udp比tcp传输更快,但数据可能会不完整
- tcp是一种传输协议,需要进行三次握手确认,四次挥手断开连接,通过流来传输数据
- socket是对tcp/ip协议的封装和应用,本质还是调用一个接口,方便使用tcp/ip协议栈而以,也支持其他网络协议
- dubbo为什么要用nacos而抛弃zookeeper(zookeeper和nacos区别)
- zookerper只支持cp模式,nacos支持ap和cp两种模式
- nacos服务端主动心跳机制优于zookeeper基于tcp探活(tcp活着但服务不一定活着)
- nacos客服端会缓存服务列表,当客户端不可用时可以起到容灾作用,zookeeper原生不具备
- zookeeper事务机制和二阶段提交性能远低于nacos
-
Mybatis
- mybatis一级缓存和二级缓存的区别
- 一级缓存是sqlsession会话缓存,默认开启,第一次select查询结果会缓存到一级缓存,第二次查询就会先查询一级缓存,命中则返回,没有命中在查询数据库,只会执行一次sql。如果是先查询,在更新,在查询,则会执行三条sql,因为每次增删改会改变源数据,所以必须刷新缓存。
- 二级缓存是手动开启,在mybatis.xml文件setting中设置cacheEnabled为true开启全局二级缓存,如果是开启单个mapper则在mapper文件中添加标签。开启后查询则先查询二级缓存,如果有直接返回,没有在去一级缓存查找,如果一级缓存也没有则查数据库,返回值会先写入一级缓存,然后在写入二级缓存。
- 注意事项
- 开启全局缓存后所有select都会被缓存,所有增删改都会刷新缓存
- 使用最近最少用算法LRU清除不使用的缓存
- 缓存不会定时刷新
- 缓存保存列表或对象1024个引用
- 缓存被视为读/写缓存,这意味着获取的对象不是共享的,可以安全的被调用者修改,也不会干扰其他调用者或线程所做的潜在修改
- mybatis实现原理是什么
- 生成configuration
- 创建sqlSessionFactory
- 通过sqlsession获取mapper接口动态代理对象
- 调用executor去执行数据库相关操作
- #{}和${}的区别是什么
- #{}是占位符,在sql中会进行预编译,有效防止sql注入问题
- ${}是占位符,在sql中会被解析成动态sql语句,会发生sql注入情况
- mybatis自定义标签的执行原理什么,如if、when、where、set等
- 把定义的sql根据入参解析成sqlnode对象
- 再使用OGNL表达式计算结果
- 最后拼接sql片段
- mapper接口工作原理
- 解析select标签成mappedStatement对象
- 把标签中id与mapper接口方法相关联
- 每个mapper接口都会创建一个动态代理对象
- 代理类会拦截接口方法,找到mappedStatement对象
- 执行数据库操作
- 在Spring中Mapper接口是如何被注入的?
- 通过 SqlSession 的 getMapper(Class type) 方法
- Spring 中是如何将 Mapper 接口注入到其他 Spring Bean ?
- 实现 Spring 的BeanDefinitionRegistryPostProcessor 接口
- 在Mapper接口中是否可以有重载方法?
- 不可以,xml中id和mapper接口是唯一的
- 当实体类中的属性名和表中的字段名不一样 ,怎么处理
- 通过 AS 关键字
- 通过 来映射
- 开启 MyBatis 的mapUnderscoreToCamelCase配置
- mybatis如何获取MySQL自动生成的键值?
- 标签中添加useGeneratedKeys="true"属性和keyProperty指定主键字段
- 在标签内添加标签
- Mybatis有哪些Executor执行器?
- SimpleExecutor:每执行一次数据库操作就创建一个Statement对象,用完立即关闭
- ReuseExecutor:用sql作为key从map缓存中查找Statement对象,存在就使用,不存在就创建,重复使用
- BatchExecutor:批执行处理器,只支持update不支持select查询
- CachingExecutor:添加二级缓存功能
- Mybatis是如何进行分页的?分页插件的原理是什么?
- 使用RowBounds对象,针对ResultSet结果集执行内存分页
- 拦截待执行的sql,然后重写sql,根据dialect方言添加分页语句和参数
- ibatis和mybatis区别
- 配置文件根元素:iBatis 是 ,MyBatis是
- 存储过程的支持:ibatis是procedure标签,mybatis是select标签,由statementType属性标识存储过程
- 标签属性改变:select标签parameterClass属性改为parameterType属性
- 代码层面api改变:SqlMapClient 改为SqlSessionFactory
- 类型处理器接口改变:TypeHandlerCallback 改为了 TypeHandler
- 包迁移:DataSourceFactory移动到 org.apache.ibatis.datasource包下
- Mybatis动态sql执行原理?有什么作用?
- 执行原理是根据表达式的值完成逻辑判断并动态拼接sql
- 执行不同的条件查询sql
- mybatis一级缓存和二级缓存的区别
-
Hibernate
- 什么是orm框架
- orm就是对象关系映射框架,即通过类与数据库表的映射,持久化到数据库
- 为什么要用hibernate?
- 封装JDBC访问数据库代码,无须重复编写
- 简化DAO层的编码工作
- hibernate映射很灵活,支持各种关系数据库
- hibernate核心接口有哪些
- session:负责被持久化对象CRUD操作
- sessionFactory:负责初始化hibernate,创建session对象
- configuration:负责配置并启动hibernate,创建SessionFactory
- transaction:负责事物相关的操作
- query和criteria接口:负责执行各种数据库查询
- Hibernate工作原理是什么
- 读取并解析hibernate核心配置文件、映射文件
- 创建sessionFactory
- 打开session
- 创建事务
- 持久化操作
- 提交事务
- 关闭session
- 关闭sessionFactory
- Hibernate三级缓存分别是什么
- session缓存:独享缓存,生命周期作用于session,缓存单个对象
- SessionFactory对象缓存:共享缓存,生命周期作用于整个应用,属于第三方,一般使用EhCache,需要手动开启,缓存单个对象
- 查询缓存:缓存一个结果集,需要手动开启,使用前提是必须开启二级缓存,在查询执行前调用query.setCacheable(true)
- 从session一级缓存读取对象的原理是什么?
- 生成key,通过对象全名+对象id值组合key
- 从一级缓存map中查找该key
- key存在就直接返回,不在发送sql
- 不存在就查找数据库,并存入map
- 为什么很少用三级查询缓存?
- 必须要一样的hql
- 存的是一个list,一个值改变就会影响整个list,效率低
- 只适用不能更改的list集合
- 什么样的数据适合存放到第二级缓存中?
- 很少被修改的数据
- 不是很重要的数据,允许出现偶尔并发的数据
- 不会被并发访问的数据
- 常量数据
- 缓存策略有哪些?
- read-only:只读模式
- read-write:支持并发的读写
- nonstrict-read-write:不锁的读写
- transactional:轻量级jave ee 不支持
- hibernate中本地线程怎么与session绑定?
- hibernate配置文件中开启thread
- 工具类中通过sessionFactory.getCurrentSession();
- Hibernate框架中设置事务的隔离级别
- 使用数字对应事务隔离级别,1-读未提交 2-读已提交 3-可重复读 4-串行化
- 在配置文件中进行事务属性配置hibernate.connection.isolation
- Hibernate是如何延迟加载?
- get方式,session缓存查找,然后二级缓存,如果都没有则查询数据库,数据库也没有则返回null
- load方式,分两种情况,在配置文件中lazy是否配置为true还是false,如果为false则和get方式一样,区别只是最终返回值为null的话就会抛出ObjectNot异常,如果是true,则从session查找,不存在则使用延迟加载,返回实体代理对象(CGLIB动态生成),当使用的时候在查找二级缓存和数据库,如果都没有则抛出ObjectNot异常
- SessionFactory是线程安全吗?
- 是,在hibernate中是单例数据存储和线程安全的,一个sessionFactory在启动的时候只会创建一次
- hibernate 有几种查询方式?
- HQL查询
- Criteria查询
- SQLQuery本地SQL查询
- hibernate 实体类可以被定义为 final 吗?
- 可以,但会影响提升性能,定义为final后hibernate就会不是代理对象
- 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
- 使用integer当数据库字段为空时返回null,而使用int时会抛出类型转换异常
- get()和 load()的区别?
- get数据库没有数据会返回null,load会抛出异常
- get永远返回有实体对象,load会返回没有加载数据的代理类实例
- 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
- getCurrentSession会绑定当前线程,而openSession不会
- getCurrentSession事务由spring控制,openSession需要手动开启提交
- getCurrentSession不需要我们手动关闭,由sessionFactory管理,openSession需要手动关闭
- hibernate 实体类必须要有无参构造函数吗?为什么?
- 必须,因为hibernate是通过构造函数来构造实例对象,即Class.forname的newInstance方法。单从hibernate角度来说是通过反射机制来生成实例对象,所以必须要有构造函数
- 如何优化Hibernate?
- 使用双向一对多关联,不使用单向一对多
- 不用一对一,用多对一取代
- 配置对象缓存,不使用集合缓存
- 表字段要少,表关联不要怕多
- 比较hibernate的三种检索策略优缺点?
- 立即检索,优点:实时查询,不管对象是持久还是游离状态,缺点:select语句太多,可能会加载不需要的对象
- 延迟检索,优点:避免select语句太多,由应用程序决定需要加载哪些对象,缺点:如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化
- 迫切左外连接检索,优点:使用了外连接,select语句数目少,缺点:复杂的数据库表连接也会影响检索性能
- 什么是Hibernate的并发机制?怎么去处理并发问题?
- Hibernate的Session对象是非线程安全的,它通常只使用一次, 然后就丢弃。多个事务并发访问同一块资源,可能会引发丢失更新,脏读,幻读,不可重复读的问题
- 解决方案:设置事务隔离级别。设置锁:乐观锁和悲观锁。hibernate可以配置optimistic-lock=”all”比较一行纪录每个字段的状态
- 什么是orm框架
参考连接:
springmvc:https://blog.youkuaiyun.com/guan1843036360/article/details/123012816
springboot:https://blog.youkuaiyun.com/mt776333/article/details/123447744
springcloud:https://blog.youkuaiyun.com/a6636656/article/details/124429257
mybatis:https://blog.youkuaiyun.com/javalingyu/article/details/124739040
hibernate:https://blog.youkuaiyun.com/lzqiang2011/article/details/113585319