(Java每日一谈:第十九日——就业面试知识通关策略)MyBatis

JPA原理

事务:事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性、一致性、隔离性和持久性。

本地事务:紧密依赖于底层资源管理器,事务处理局限在当前事务资源内。此种事务处理方式不存在对应用服务器的依赖,因而部署灵活却无法支持多种数据源的分布式事务。

分布式事务:Java事务编程接口(JTA:Java Transaction API)和Java事务服务(JTS:Java Transaction Service)为J2EE平台提供了分布式事务服务。分布式事务(Distributed Transaction)包括事务管理器(Transaction Manager)和一个或多个支持XA协议的资源管理器(Resource Manager)。我们可以将资源管理器看作任意类型的持久化数据存储;事务管理器承担着所有事务参与单元的协调与控制。

MyBatis缓存

MyBatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的。一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存1024条SQL。二级缓存是指可以跨SqlSession的缓存,是mapper级别的缓存,对于mapper级别的缓存不同的sqlSession是可以共享的。

一级缓存:基于PerpetualCache的HahsMap本地缓存,其存储作用域为Session,当Session flush或close之后,所有Cache就将清空,默认打开一级缓存

二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HahsMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,使用二级缓存属性类需要实现Serializeable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了C/U/D操作之后,默认该作用域下select中的缓存将被clear。

MyBatis是什么?

MyBatis是一款优秀的持久层框架,一个半ORM(对象关系映射)框架,它支持定制化SQL,存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和java的POJO为数据库中的记录。

ORM是什么?

ORM,对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单说,ORM是通过使用描述对象和数据库之间的硬核的元数据。将程序中的对象自动持久化到关系型数据库中。

为什么说MyBatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所有它是全自动的。

而Mybatis在查询关联对象或者关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?

MyBatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection至的就是一对多。在MyBatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

传统JDBC开发存在的问题?MyBatis是如何解决这些问题的?

1、频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。

解决办法:在mybatis-config.xml中配置数据连接池,使用连接池管理数据库连接

2、sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。

解决办法:将Sql语句配置在XXXmapper.xml文件中与Java代码分离

3、使用prepareStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不容易维护。

解决办法:Mybatis自动将java对象映射至sql 语句

4、结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。

解决办法:Mybatis自动将sql执行结果映射至java对象

Mybatis优缺点

优点

与传统的数据库访问技术相比,ORM有以下优点:

基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用

与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接

很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所有只要JDBC支持的数据库Mybatis都支持)

不同点

能够与Spring很好的集成

缺点

SQL语句的编写工作量很大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

MyBatis编程步骤是什么样的?

1、创建SqlSessionFactory

2、通过SqlSessionFactory创建SqlSession

3、通过SqlSession执行数据库操作

4、调用session.commit()提交事务

5、调用session.close()关闭会话

myBatis的功能架构是怎么样的?

我们把Mybatis的功能架构分为三层:

API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

Spring Bean的生命周期

Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。

Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。

初始化之后调用的回调方法。

销毁之前调用的回调方法。

Spring框架提供了以下四种方式来管理bean的生命周期事件:

InitializingBean和DisposableBean回调接口

针对特殊行为的其他Aware接口

Bean配置文件中的Custom init()方法和destory()方法

@PostConstruct和@PreDestory注解方式

Spring MVC运行流程

1、spring mvc将所有的请求都提交给DispatcherServlet,他会委托应用系统的其他模块负责对请求进行真正的处理工作

2、DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller

3、DispatcherServlet将请求提交到目标Controller

4、Controller进行业务逻辑处理后,会返回一个ModelAndView

5、Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6、试图对象负责渲染返回给客户端

Spring框架中用到了哪些设计模式?

代理模式-在AOP和remoting中被用的比较多

单例模式-在Spring配置文件中定义的bean默认为单例模式

模版方法-用来解决代码重复的问题

前端控制器-Spring提供了DispatcherServlet来对请求进行分发

试图帮助(View Helper)-spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里

依赖注入-贯穿于BeanFactory/ApplicationContext接口的核心理念

工厂模式-BeanFactory用来创建对象的实例

消息中间件如何保证消息的一致性?

1、主动方应用先把消息发送给消息中间件,消息状态标记为待确认

2、消息中间件收到消息之后,把消息持久化到消息存储中,但并不向被动方应用投递消息

3、消息中间件返回消息持久化结果(成功,或者失效),主动方应用根据返回结果进行判断如何处理业务操作处理;

        1、失败:放弃业务操作处理,结束(必须向上层返回失败结果)

        2、成功:执行业务操作处理

4、业务操作完成后,把业务操作结果(成功/失败)发送给消息中间件

5、消息中间件收到业务操作结果后,根据结果进行处理

        1、失败:删除消息存储中的消息,结束

        2、成功:更新消息存储中的消息状态为待发送(可发送),紧接着执行消息投递

6、前面的正向流程都成功后,向被动方应用投递消息

猜你喜欢

转载自blog.csdn.net/weixin_50249953/article/details/124955706