仅供个人学习使用
目录
29. 简述Mybatis的插件运行原理,以及如何编写一个插件?
30. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
31. Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
32. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
33. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
34. MyBatis里面的动态Sql是怎么设定的?用什么语法?
35. Mybatis都有哪些Executor执行器?它们之间的区别是什么?
36. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
40. 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
43. Bean 工厂和 Application contexts 有什么区别?
46. 什么是基于Java的Spring注解配置?给一些注解的例子?
47. 使用Spring通过什么方式访问Hibernate?
48. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
49. 在Spring AOP 中,关注点和横切关注的区别是什么?
50. AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知?
51. Spring中AutoWired和,Resource之间区别是什么?
28. 谈谈你对SpringMVC的理解?
SpringMVC是Spring框架的一个模块,它提供了一种简化的方式来构建Web应用程序。SpringMVC遵循MVC(Model-View-Controller)设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种分离关注点的方法有助于管理复杂的应用程序,提高了代码的可维护性和可测试性。在SpringMVC中,用户请求首先被前端控制器(DispatcherServlet)拦截,然后映射到相应的Controller处理,Controller处理完业务逻辑后,返回一个包含视图名称的ModelAndView对象,最后由视图解析器(ViewResolver)解析视图名称并渲染视图。
29. 简述Mybatis的插件运行原理,以及如何编写一个插件?
Mybatis插件是一种在Mybatis执行操作过程中,介入并改变其行为的机制。插件可以拦截Mybatis的四个生命周期方法:
beforePrepare
(准备语句之前)、prepare
(准备语句之后)、beforeExecute
(执行语句之前)和afterExecute
(执行语句之后)。编写Mybatis插件需要实现Interceptor
接口,并重写这些方法。然后,在Mybatis配置文件中注册插件,Mybatis会在初始化时加载插件,并在执行SQL时调用插件的拦截方法。
30. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis支持延迟加载,通常称为“懒加载”。懒加载的实现原理是,当应用程序请求某个对象的关联对象时,Mybatis会为这个关联对象生成一个代理对象。当代理对象被访问时,Mybatis才会实际执行查询并填充数据。这种机制可以减少数据库查询的次数,提高应用程序的性能。
31. Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
Mybatis可以执行一对一和一对多的关联查询。实现方式包括:
- 嵌套查询:在查询一个对象的同时,嵌套查询其关联对象,并将结果映射到不同的对象中。
- 嵌套结果映射:使用
<association>
和<collection>
标签在Mybatis映射文件中定义嵌套结果映射。- 延迟加载:对于一对多的关系,Mybatis可以使用延迟加载,即当实际访问集合属性时才执行查询。 它们之间的区别主要在于查询的时机和性能。嵌套查询通常在单次查询中获取所有数据,而延迟加载则在访问时才查询,可能影响性能。
32. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
Mybatis通过结果映射将SQL执行结果封装为目标对象。映射形式包括:
- 结果映射(ResultMap):在映射文件中定义一个结果映射,指定列名和对象属性之间的映射关系。
- 简单映射:对于简单的结果集,Mybatis可以直接将列名映射到对象属性。
- 关联映射(Association):用于一对一关系,将一个结果集的列映射到一个对象的属性,并嵌套另一个结果映射。
- 集合映射(Collection):用于一对多关系,将一个结果集的列映射到一个集合属性,并嵌套另一个结果映射。
33. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
在Mybatis映射文件中,
<include>
标签用于复用其他SQL语句。被引用的标签(B)必须在引用它的标签(A)之前定义,因为Mybatis在解析映射文件时是顺序的,如果引用的标签在定义之前,Mybatis无法找到对应的SQL语句。
34. MyBatis里面的动态Sql是怎么设定的?用什么语法?
Mybatis中的动态SQL允许在XML映射文件中编写动态构建的SQL语句。它使用一系列的XML标签来构建条件语句,如
<if>
、<choose>
、<when>
、<otherwise>
、<trim>
、<where>
、<set>
等。这些标签可以根据传递给Mybatis方法的参数动态地构建SQL语句,使得SQL语句可以根据运行时的数据进行调整。例如,使用<if>
标签可以条件性地包含SQL片段,而<choose>
、<when>
、<otherwise>
则可以实现类似于Java中的if-else
逻辑。
35. Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Mybatis提供了两种类型的
Executor
执行器:
- SimpleExecutor:每次执行操作都会创建一个新的
Statement
对象,用完立刻关闭,不关心传输结果的关闭。适合查询操作,不适合批量操作。- ReuseExecutor:会复用
Statement
对象,可以提高性能,但需要注意资源释放的问题。适合执行批量操作。- BatchExecutor:专门用于批量操作的执行器,会缓存批量操作,减少数据库交互次数,提高性能。
36. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Mybatis被称为半自动ORM映射工具是因为它需要手动编写SQL语句,而全自动ORM工具(如Hibernate)会根据实体类和映射关系自动生成SQL。Mybatis提供了更多的灵活性和控制,允许开发者优化SQL语句,而全自动ORM工具则提供了便利性,减少了编码工作量。
37. 简单介绍下你对mybatis的理解?
Mybatis是一个持久层框架,它简化了数据库交互操作。Mybatis使用XML或注解方式定义SQL映射,将接口方法与SQL语句关联起来,通过代理机制自动填充SQL参数并返回结果集到Java对象。Mybatis支持延迟加载、缓存、事务管理等特性,是一个灵活且高效的数据访问层解决方案。
38. 介绍一下Spring的事物管理?
Spring提供了声明式事务管理,允许开发者通过配置和注解来管理事务。Spring事务管理器(
PlatformTransactionManager
)负责包装数据源,并提供事务控制。Spring支持编程式事务管理和声明式事务管理两种方式,后者通过@Transactional
注解简化了事务管理代码。Spring事务管理器支持多种事务传播行为和隔离级别。
39. SSM优缺点、使用场景?
SSM(Spring + SpringMVC + Mybatis)是一种常见的Java Web应用架构:
- 优点:模块化设计,提高了代码的可维护性;灵活的事务管理;支持多种数据访问技术;易于测试和扩展。
- 缺点:学习曲线较陡峭;可能存在过度配置的问题。
- 使用场景:适用于需要复杂业务逻辑处理、高并发处理和可扩展性的大型企业级应用。
40. 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
- 架构差异:SpringMVC更轻量级,基于注解的配置更简洁;Struts2基于XML配置,较为繁琐。
- 拦截器:SpringMVC使用Interceptor,而Struts2使用Interceptor。
- 数据绑定:SpringMVC使用Spring的绑定机制,更灵活;Struts2使用OGNL表达式。
- 结果视图:SpringMVC支持多种视图技术,Struts2主要使用JSP。
- 性能:SpringMVC通常性能更优,因为它避免了不必要的拦截器调用。
41. 怎么样把数据放入Session里面?
在Spring MVC中,可以通过在Controller方法中注入
HttpSession
对象,然后使用setAttribute
方法将数据放入Session中:@RequestMapping("/login") public String login(HttpSession session, User user) { session.setAttribute("user", user); return "loginSuccess"; }
42. MyBatis(IBatis)的好处是什么?
- 灵活性:MyBatis 允许开发者编写原生 SQL,提供了很大的灵活性。
- 性能:由于可以优化 SQL,MyBatis 通常能提供比全自动 ORM 框架更好的性能。
- 简单性:与全自动 ORM 框架相比,MyBatis 的学习曲线较平缓,易于上手。
- 可维护性:SQL 与 Java 代码分离,提高了代码的可维护性。
- 缓存机制:提供了一级和二级缓存机制,可以显著提高查询性能。
43. Bean 工厂和 Application contexts 有什么区别?
- BeanFactory:是 Spring 框架的基础设施,提供基本的依赖注入功能。
- ApplicationContext:扩展了 BeanFactory,提供了更多的高级功能,如事件传播、国际化消息支持、资源访问等。
- 应用范围:BeanFactory 通常用于轻量级的应用,而 ApplicationContext 适用于需要更多企业级功能的应用。
- 启动速度:BeanFactory 启动速度比 ApplicationContext 快。
- AOP 支持:ApplicationContext 提供了更好的 AOP 支持。
44. 解释Spring支持的几种bean的作用域?
- singleton:默认作用域,每个 Spring IoC 容器中相同 Bean 定义只创建一个 Bean 实例。
- prototype:每次请求都会创建一个新的 Bean 实例。
- request:每个 HTTP 请求都会创建一个新的 Bean,仅适用于 WebApplicationContext 环境。
- session:在一个 HTTP Session 中,一个 Bean 定义对应一个 Bean 实例。
- application:每个 ServletContext 会创建一个 Bean 实例,仅适用于 WebApplicationContext 环境。
- websocket:对于每个 WebSocket 会话,一个 Bean 定义对应一个 Bean 实例。
45. 什么是bean的自动装配?
Bean 的自动装配是指 Spring IoC 容器自动将 Bean 的依赖关系注入到其他 Bean 中的过程。Spring 通过分析 Bean 的属性,找到匹配的 Bean 定义,并自动进行赋值。自动装配可以通过 XML 配置或注解来实现。
46. 什么是基于Java的Spring注解配置?给一些注解的例子?
基于 Java 的 Spring 注解配置是一种不使用 XML 文件,而是通过在代码中添加注解来配置 Spring 容器的方法。常见的注解包括:
@Component
:声明一个 Spring 组件。@Service
:声明一个服务层组件。@Repository
:声明一个数据访问组件。@Controller
:声明一个控制层组件。@Autowired
:自动装配依赖。@Qualifier
:当有多个同类型的 Bean 时,用于指定具体要装配哪一个。@Configuration
:定义配置类。
47. 使用Spring通过什么方式访问Hibernate?
Spring 通过集成 Hibernate 的
SessionFactory
来访问 Hibernate。Spring 管理SessionFactory
的生命周期,并提供事务管理支持。可以通过 Spring 的LocalSessionFactoryBean
来配置SessionFactory
。
48. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
HibernateDaoSupport
是 Spring 提供的一个支持类,它提供了基础的 Hibernate DAO 功能,包括SessionFactory
的注入和事务管理。通过继承HibernateDaoSupport
,可以简化 Hibernate 操作的配置和使用。
49. 在Spring AOP 中,关注点和横切关注的区别是什么?
- 关注点(Concern):在软件工程中,关注点是指在特定场景下需要考虑的特定功能或行为。
- 横切关注(Cross-cutting concern):横切关注是指那些影响多个模块或组件的关注点,它们通常会跨越整个应用的多个点,在 Spring AOP 中通常通过切面(Aspect)来实现。
50. AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知?
AOP(面向切面编程)的作用是将横切关注点(如日志、事务管理等)与业务逻辑分离,提高代码的模块化和可重用性。底层通常通过动态代理或使用字节码操作库(如 ASM、CGLIB)实现。
- 切面(Aspect):包含横切关注点的逻辑。
- 切入点(JoinPoint):指代业务逻辑中的特定点,如方法的执行。
- 通知(Advice):切面在切入点上的具体行为,如方法执行前后的逻辑。
51. Spring中AutoWired和,Resource之间区别是什么?
@Autowired
:自动装配 Bean,可以通过类型来装配,也可以通过名称来装配。@Resource
:JSR-250 注解,用于注入 Bean,只能通过名称来装配,如果没有指定名称,则默认按照类型来装配。@Autowired
是 Spring 特有的,而@Resource
是 Java 标准。