Java面试黄金宝典8

news2025/3/26 3:02:30

1. 什么是 Spring MVC

  • 定义

Spring MVC 是 Spring 框架里用于构建 Web 应用程序的模块,它严格遵循 MVC(Model - View - Controller)设计模式。这种设计模式把应用程序清晰地划分成三个主要部分:

  1. Model(模型):主要负责处理应用程序的数据和业务逻辑。通常借助 JavaBean 或者实体类来实现,这些类能够封装数据,并且提供相关的业务方法。例如,在一个电商系统中,商品类就是一个模型,它可以包含商品的名称、价格、库存等属性,还能有计算商品总价等业务方法。
  2. View(视图):承担着将模型中的数据呈现给用户的任务。常见的视图技术有 JSP(JavaServer Pages)、Thymeleaf 等。以 JSP 为例,它可以将从模型获取的数据动态地展示在网页上。
  3. Controller(控制器):负责接收用户的请求,调用模型处理请求,然后选择合适的视图进行响应。在 Spring MVC 中,控制器通常是使用 @Controller 注解标注的类。以下是一个简单的 Spring MVC 示例:

java

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello";
    }
}

在这个示例中,HelloController 类被 @Controller 注解标注为控制器。@GetMapping("/hello") 注解表示该方法处理 /hello 的 GET 请求。在 hello 方法中,将消息 "Hello, Spring MVC!" 添加到 Model 中,然后返回逻辑视图名 "hello"

  • 原理

Spring MVC 的核心是 DispatcherServlet,它是一个前端控制器,负责接收所有的 HTTP 请求。当请求到达时,DispatcherServlet 会根据请求的 URL 查找对应的处理器映射(HandlerMapping),找到处理该请求的控制器(Handler)。然后,DispatcherServlet 会调用处理器适配器(HandlerAdapter)来执行控制器中的方法。控制器方法执行后会返回一个逻辑视图名,DispatcherServlet 会根据视图解析器(ViewResolver)将逻辑视图名解析为实际的视图对象,最后将模型数据传递给视图进行渲染并返回给客户端。

  • 要点

  1. 基于 MVC 设计模式,实现了业务逻辑、数据和视图的分离,提高了代码的可维护性和可扩展性。
  2. DispatcherServlet 作为核心,统一管理请求的分发和处理,简化了开发流程。
  3. 控制器使用注解(如 @Controller@GetMapping 等)进行配置,使得代码更加简洁和直观。

  • 应用

可以深入学习 Spring MVC 的数据绑定、表单处理、文件上传、异常处理等高级特性,以及与其他技术(如 RESTful 服务)的集成。例如,在构建 RESTful 服务时,可以使用 @RestController 注解来简化控制器的开发,直接返回 JSON 或 XML 数据。

2. springMVC 和 struts2 的区别

  • 架构设计
    1. Spring MVC:基于 DispatcherServlet 作为前端控制器,采用单例模式。单例模式使得控制器实例在整个应用程序中只有一个,减少了内存开销,提高了性能。它对 Servlet API 的依赖较少,设计更加轻量级和灵活。
    2. Struts2:基于过滤器(FilterDispatcherStrutsPrepareAndExecuteFilter)作为前端控制器,每个请求都会创建一个新的 Action 实例。这虽然避免了线程安全问题,但也带来了一定的性能开销,因为频繁的对象创建和销毁会消耗系统资源。
  • 请求处理方式
    1. Spring MVC:通过 HandlerMapping 来映射请求 URL 到具体的控制器方法,支持多种方式的 URL 映射,如注解、XML 配置等。使用注解配置时,可以直接在控制器方法上使用 @RequestMapping 等注解来指定请求的 URL,非常灵活。
    2. Struts2:通过配置文件(如 struts.xml)来映射请求 URL 到 Action 类和方法。配置文件的方式相对固定,修改时需要修改 XML 文件,不够灵活。
  • 数据传递
    1. Spring MVC:通过 ModelModelAndView 来传递数据到视图,数据传递更加直观和灵活。可以直接将数据添加到 Model 中,然后在视图中使用表达式语言(如 JSP 的 EL 表达式)来获取数据。
    2. Struts2:通过 ValueStack 来传递数据,ValueStack 是一个栈结构,包含了 Action 实例和请求参数等信息,数据传递相对复杂。需要使用 OGNL(对象图导航语言)来访问和操作 ValueStack 中的数据。
  • 视图技术
    1. Spring MVC:支持多种视图技术,如 JSP、Thymeleaf、Freemarker 等,并且可以方便地集成其他视图技术。可以根据项目的需求选择合适的视图技术,提高开发效率。
    2. Struts2:主要使用 JSP 作为视图技术,也支持其他视图技术,但集成相对复杂。对于非 JSP 视图技术的支持,需要进行更多的配置和开发工作。

  • 原理

Spring MVC 的设计理念是基于 Java 的注解和 IoC 容器,通过注解和配置文件来实现请求的映射和处理,利用 Spring 的 IoC 容器来管理控制器和其他组件。Struts2 则是基于 WebWork 框架,通过过滤器和配置文件来处理请求,使用 OGNL(对象图导航语言)来进行数据的访问和操作。

  • 要点

  1. 架构设计上,Spring MVC 更轻量级和灵活,Struts2 存在一定性能开销。
  2. 请求处理方式不同,Spring MVC 支持多种映射方式,Struts2 主要通过配置文件。
  3. 数据传递方面,Spring MVC 更直观,Struts2 基于 ValueStack 较复杂。
  4. 视图技术上,Spring MVC 集成更方便。

  • 应用

可以研究在大型项目中如何选择合适的框架,以及如何将 Spring MVC 和 Struts2 与其他技术(如数据库、缓存等)进行集成。例如,在与数据库集成时,可以考虑使用 Spring Data JPA 来简化数据库操作。

3. Spring 中有哪些设计模式

  • 单例模式:Spring 容器默认将 Bean 以单例模式创建,确保在整个应用程序中只有一个实例。可以通过 @Scope("singleton") 注解或 XML 配置来指定 Bean 的作用域为单例。单例模式可以减少内存开销,提高系统性能。

java

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
public class SingletonBean {
    // 单例 Bean 的实现
}

  • 工厂模式:Spring 的 BeanFactoryApplicationContext 就是工厂模式的体现,它们负责创建和管理 Bean 实例。通过配置文件或注解,Spring 可以根据需要创建不同类型的 Bean。工厂模式将对象的创建和使用分离,提高了代码的可维护性和可扩展性。
  • 代理模式:Spring AOP(面向切面编程)使用代理模式来实现切面的增强。Spring 提供了两种代理方式:JDK 动态代理和 CGLIB 代理。当目标对象实现了接口时,使用 JDK 动态代理;当目标对象没有实现接口时,使用 CGLIB 代理。代理模式可以在不修改目标对象代码的情况下,为目标对象添加额外的功能,如日志记录、事务管理等。
  • 观察者模式:Spring 的事件机制使用了观察者模式。当一个事件被发布时,所有注册的监听器都会收到通知并执行相应的操作。可以通过实现 ApplicationListener 接口来创建自定义的事件监听器。

java

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 处理事件
    }
}

  • 模板方法模式:Spring 的 JdbcTemplateHibernateTemplate 等模板类使用了模板方法模式。这些模板类提供了一些通用的操作方法,具体的业务逻辑由子类实现。模板方法模式将通用的操作封装在模板类中,提高了代码的复用性。

  • 原理

单例模式通过 Spring 容器的管理,确保 Bean 只有一个实例。工厂模式通过反射机制根据配置信息创建 Bean 实例。代理模式通过在目标对象的基础上创建代理对象,在代理对象中添加额外的逻辑来实现切面增强。观察者模式通过事件发布和监听机制,实现对象之间的解耦。模板方法模式通过将通用的操作封装在模板类中,将具体的业务逻辑留给子类实现。

  • 要点

  1. 单例模式确保 Bean 只有一个实例,减少内存开销。
  2. 工厂模式负责创建和管理 Bean 实例,提高代码的可维护性。
  3. 代理模式用于实现 AOP 切面增强,不修改目标对象代码。
  4. 观察者模式实现事件机制,实现对象之间的解耦。
  5. 模板方法模式封装通用操作,提高代码的复用性。

  • 应用

可以深入学习每种设计模式的原理和应用场景,以及如何在 Spring 中自定义实现这些设计模式。例如,自定义一个简单的工厂类来创建特定的 Bean 实例。

4. servlet 是什么,Servlet 生命周期

  • 定义

Servlet 是 Java 编写的服务器端程序,它运行在 Web 服务器上,用于处理客户端的请求并生成响应。Servlet 可以处理 HTTP 请求、管理会话、与数据库交互等。

Servlet 的生命周期包括以下几个阶段:

  1. 加载和实例化:当 Web 服务器启动或客户端首次请求该 Servlet 时,Web 服务器会加载 Servlet 类并创建其实例。加载过程是通过类加载器将 Servlet 类的字节码加载到内存中,然后使用反射机制创建实例。
  2. 初始化:Web 服务器调用 Servlet 的 init() 方法进行初始化操作,该方法只会被调用一次。在 init() 方法中,可以进行一些资源的初始化,如数据库连接、配置文件的加载等。

java

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        // 初始化操作
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 处理请求
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        // 销毁操作
    }
}

  1. 服务:当客户端发送请求时,Web 服务器会调用 Servlet 的 service() 方法来处理请求。service() 方法会根据请求的类型(如 GET、POST)调用相应的处理方法(如 doGet()doPost())。
  2. 销毁:当 Web 服务器关闭或 Servlet 被卸载时,会调用 Servlet 的 destroy() 方法进行资源的释放和清理工作。例如,关闭数据库连接、释放文件资源等。

  • 原理

Servlet 是基于 Java 的多线程机制,每个请求会由一个独立的线程来处理。Web 服务器通过反射机制加载和实例化 Servlet 类,并调用其相应的方法。Servlet 的生命周期由 Web 服务器管理,确保 Servlet 的正确初始化、服务和销毁。

  • 要点

  1. Servlet 是 Java 编写的服务器端程序,用于处理客户端请求。
  2. 生命周期包括加载和实例化、初始化、服务和销毁。
  3. init() 方法只调用一次,用于初始化资源;service() 方法处理请求;destroy() 方法进行资源清理。

  • 应用

可以学习 Servlet 的高级特性,如 Servlet 过滤器、Servlet 监听器等,以及如何使用 Servlet 与其他技术(如 JSP、数据库)进行集成。例如,使用 Servlet 过滤器实现字符编码的统一设置。

5. Struts 的原理和工作流程

  • 定义

Struts 是一个基于 MVC 设计模式的 Web 应用框架,主要用于构建 Java Web 应用程序。

Struts 的工作流程如下:

  1. 客户端请求:客户端(如浏览器)发送 HTTP 请求到 Web 服务器。
  2. 过滤器拦截:请求首先被 Struts 的过滤器(如 StrutsPrepareAndExecuteFilter)拦截。过滤器会对请求进行预处理,如设置字符编码、验证请求的合法性等。
  3. 请求处理:过滤器根据请求的 URL 查找对应的 Action 配置信息,然后创建 Action 实例。Action 配置信息通常存储在 struts.xml 等配置文件中。
  4. Action 执行:调用 Action 的执行方法(如 execute()),在该方法中可以处理业务逻辑,如调用服务层方法、操作数据库等。
  5. 结果返回:Action 执行完成后,会返回一个结果码,过滤器根据结果码查找对应的视图配置信息。结果码可以是字符串,如 "success""error" 等。
  6. 视图渲染:根据视图配置信息,将结果数据传递给相应的视图(如 JSP)进行渲染。视图可以使用标签库来显示数据,如 Struts 的标签库。
  7. 响应返回:将渲染后的视图内容返回给客户端。

  • 原理

Struts 通过配置文件(如 struts.xml)来管理 Action 和视图的映射关系,使用过滤器来拦截请求并进行分发。Action 是 Struts 的核心组件,负责处理业务逻辑。视图则负责将处理结果呈现给用户。

  • 要点

  1. 基于 MVC 设计模式,分离业务逻辑和视图,提高代码的可维护性。
  2. 过滤器拦截请求,根据配置信息分发到相应的 Action。
  3. Action 处理业务逻辑,返回结果码,根据结果码选择视图进行渲染。

  • 应用

可以深入学习 Struts 的配置文件的编写、Action 的各种实现方式、数据验证和国际化等高级特性。例如,使用 Struts 的数据验证框架来验证用户输入的数据。

6. 什么是 doFilter

  • 定义

doFilterjavax.servlet.Filter 接口中的一个方法,用于实现 Servlet 过滤器的核心逻辑。Servlet 过滤器是一种可以在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理和后处理的组件。

doFilter 方法的签名如下:

java

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

  1. ServletRequest:表示客户端的请求对象,包含了请求的信息,如请求参数、请求头、请求方法等。
  2. ServletResponse:表示服务器的响应对象,用于向客户端发送响应信息,如设置响应头、输出响应内容等。
  3. FilterChain:表示过滤器链,用于将请求传递给下一个过滤器或 Servlet。

以下是一个简单的过滤器示例:

java

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 预处理操作
        System.out.println("Before processing request");
        chain.doFilter(request, response);
        // 后处理操作
        System.out.println("After processing request");
    }

    @Override
    public void destroy() {
        // 销毁操作
    }
}

  • 原理

当客户端发送请求时,Web 服务器会根据过滤器的配置信息,将请求传递给相应的过滤器。过滤器的 doFilter 方法会被调用,在该方法中可以对请求进行预处理,如设置字符编码、验证用户身份等。然后,通过调用 FilterChaindoFilter 方法将请求传递给下一个过滤器或 Servlet。当请求处理完成后,会返回到当前过滤器的 doFilter 方法,进行后处理操作,如记录日志、修改响应内容等。

  • 要点

  1. doFilter 是 Servlet 过滤器的核心方法,用于实现请求和响应的预处理和后处理。
  2. 通过 FilterChain 将请求传递给下一个过滤器或 Servlet。
  3. 可以在 doFilter 方法中进行各种处理操作,如字符编码设置、身份验证等。

  • 应用

可以学习如何使用过滤器实现不同的功能,如权限控制、日志记录、性能监控等,以及如何配置过滤器的执行顺序。例如,配置多个过滤器,按照特定的顺序对请求进行处理。

7. 拦截器与过滤器的区别

  • 使用范围
    1. 过滤器:是 Servlet 规范的一部分,主要用于对请求和响应进行预处理和后处理,适用于所有的 Web 应用程序,包括基于 Servlet 的应用和基于 Spring MVC、Struts 等框架的应用。过滤器可以对所有的请求和响应进行统一处理,如设置字符编码、进行权限验证等。
    2. 拦截器:是框架级别的组件,不同的框架有不同的拦截器实现,如 Spring MVC 的拦截器、Struts2 的拦截器。拦截器主要用于在框架的请求处理流程中进行拦截和处理,对框架的特定功能进行增强。
  • 执行时机
    1. 过滤器:在请求进入 Servlet 之前和响应返回客户端之前执行,是最早和最晚处理请求的组件。过滤器可以在请求到达 Servlet 之前对请求进行预处理,也可以在响应返回客户端之前对响应进行后处理。
    2. 拦截器:在框架的请求处理流程中执行,如在 Spring MVC 中,拦截器在控制器方法执行前后执行。拦截器可以在控制器方法执行之前进行一些验证或预处理操作,也可以在控制器方法执行之后进行一些清理或后处理操作。
  • 实现方式
    1. 过滤器:实现 javax.servlet.Filter 接口,重写 doFilter 方法。过滤器的实现相对简单,只需要实现一个接口和一个方法。
    2. 拦截器:不同框架的拦截器实现方式不同,如 Spring MVC 的拦截器需要实现 HandlerInterceptor 接口,重写 preHandlepostHandleafterCompletion 方法。拦截器的实现需要根据框架的要求进行,相对复杂一些。
  • 功能侧重点
    1. 过滤器:主要用于对请求和响应进行通用的处理,如字符编码设置、权限验证、日志记录等。过滤器的功能比较通用,可以应用于各种 Web 应用程序。
    2. 拦截器:更侧重于对框架的请求处理流程进行控制和增强,如在控制器方法执行前后添加额外的逻辑、进行数据验证等。拦截器的功能更具针对性,与框架的特定功能相关。

  • 原理

过滤器是基于 Servlet 规范的,由 Web 服务器管理和调用。拦截器是框架级别的组件,由框架的核心组件(如 Spring MVC 的 DispatcherServlet、Struts2 的过滤器)进行管理和调用。

  • 要点

  1. 过滤器适用于所有 Web 应用,拦截器是框架级组件。
  2. 过滤器在请求进入 Servlet 前后执行,拦截器在框架请求处理流程中执行。
  3. 过滤器实现 Filter 接口,拦截器实现框架特定的接口。
  4. 过滤器侧重于通用处理,拦截器侧重于框架流程控制。

  • 应用

可以深入学习过滤器和拦截器的高级应用,如如何实现自定义的过滤器和拦截器,以及如何在复杂的应用场景中合理使用它们。例如,在一个大型项目中,结合使用过滤器和拦截器来实现权限控制和日志记录。

8. Struts 中为什么不用考虑线程安全

在 Struts 中,通常不需要考虑线程安全问题,主要原因如下:

  1. Action 实例化方式:Struts2 中每个请求都会创建一个新的 Action 实例,因此每个 Action 实例只处理一个请求,不存在多个线程同时访问同一个 Action 实例的情况。例如,当有多个客户端同时发送请求时,Struts2 会为每个请求创建一个独立的 Action 实例,每个实例都有自己的属性和状态,不会相互影响。
  2. 属性隔离:由于每个 Action 实例是独立的,Action 中的属性也是独立的,不会被多个线程共享。因此,不需要担心多个线程同时修改 Action 属性导致的数据不一致问题。

  • 原理

Struts2 的设计理念是基于请求的,每个请求都会创建一个新的 Action 实例,这种实例化方式保证了 Action 的线程安全性。同时,Struts2 的数据传递和处理机制也是基于每个请求的,确保了数据的独立性和安全性。

  • 要点

  1. 每个请求创建一个新的 Action 实例,避免多个线程共享同一个实例。
  2. Action 属性独立,不会被多个线程同时修改。

  • 拓展

可以了解在 Struts1 中,由于 Action 是单例模式,需要考虑线程安全问题,以及如何在 Struts1 中解决线程安全问题。例如,使用同步机制来保证 Action 属性的线程安全。

9. Struts2 和 Struts1 区别

  • 架构设计
    1. Struts1:基于 Servlet API,以 ActionServlet 作为前端控制器,采用单例模式的 Action 处理请求。单例模式的 Action 在多线程环境下需要考虑线程安全问题,因为多个线程可能会同时访问和修改 Action 的属性。
    2. Struts2:基于 WebWork 框架,以过滤器(如 StrutsPrepareAndExecuteFilter)作为前端控制器,每个请求都会创建一个新的 Action 实例,不存在线程安全问题。
  • Action 设计
    1. Struts1:Action 必须继承自 org.apache.struts.action.Action 类,并且需要实现 execute() 方法来处理请求。这种设计方式限制了 Action 的灵活性,因为 Action 必须继承特定的类。
    2. Struts2:Action 可以是一个普通的 Java 类,只需要实现 com.opensymphony.xwork2.Action 接口或继承 com.opensymphony.xwork2.ActionSupport 类,并且可以自定义方法来处理请求。这种设计方式更加灵活,Action 可以是任何符合要求的 Java 类。
  • 数据传递
    1. Struts1:通过 ActionForm 来封装请求参数,ActionForm 是一个 JavaBean,用于在控制器和视图之间传递数据。ActionForm 的使用需要定义特定的类,并且需要在配置文件中进行配置,相对繁琐。
    2. Struts2:通过 ValueStack 和 OGNL(对象图导航语言)来传递数据,ValueStack 是一个栈结构,包含了 Action 实例和请求参数等信息,OGNL 用于访问和操作 ValueStack 中的数据。ValueStack 和 OGNL 的使用更加灵活,可以直接在视图中访问和操作数据。
  • 视图技术
    1. Struts1:主要使用 JSP 作为视图技术,并且需要使用 Struts 的标签库来进行数据显示和表单处理。Struts 的标签库相对复杂,学习成本较高。
    2. Struts2:支持多种视图技术,如 JSP、FreeMarker、Velocity 等,并且提供了丰富的标签库来简化视图开发。Struts2 的标签库更加简洁和易用,提高了开发效率。

  • 原理

Struts1 是早期的 Web 应用框架,基于 Servlet 技术和 MVC 设计模式,采用单例模式的 Action 处理请求。Struts2 是在 WebWork 框架的基础上发展而来,采用了更灵活的设计理念,每个请求创建一个新的 Action 实例,使用 ValueStack 和 OGNL 进行数据传递。

  • 要点

  1. 架构设计上,Struts1 基于 Servlet API 且 Action 是单例,Struts2 基于过滤器且 Action 每个请求创建一个实例。
  2. Action 设计方面,Struts1 需继承特定类,Struts2 可以是普通 Java 类。
  3. 数据传递不同,Struts1 用 ActionForm,Struts2 用 ValueStack 和 OGNL。
  4. 视图技术上,Struts2 支持更多视图技术且标签库更丰富。

  • 应用

可以研究如何将 Struts1 项目迁移到 Struts2,以及在实际项目中如何根据需求选择合适的 Struts 版本。例如,在一个旧的 Struts1 项目中,考虑将其逐步迁移到 Struts2 以提高项目的可维护性和可扩展性。

10. 什么是 Hibernate

  • 定义

Hibernate 是一个开源的对象关系映射(ORM,Object Relational Mapping)框架,用于在 Java 应用程序和关系型数据库之间建立映射关系。它允许开发者使用面向对象的方式来操作数据库,而不需要编写大量的 SQL 语句。

Hibernate 的主要功能包括:

  1. 对象关系映射:将 Java 对象映射到数据库表,将对象的属性映射到表的字段,实现对象和数据库记录之间的相互转换。例如,一个 Java 的 User 类可以映射到数据库中的 user 表,User 类的属性可以映射到 user 表的字段。
  2. 事务管理:提供了事务管理机制,支持声明式和编程式事务管理,确保数据的一致性和完整性。在一个事务中,如果某个操作失败,整个事务会回滚,保证数据的正确性。
  3. 查询语言:提供了 Hibernate 查询语言(HQL,Hibernate Query Language),它类似于 SQL,但操作的是 Java 对象而不是数据库表。使用 HQL 可以方便地进行数据库查询,而不需要关心具体的数据库表结构。

java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.List;

public class HibernateExample {
    public static void main(String[] args) {
        // 创建 SessionFactory
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        // 打开 Session
        Session session = sessionFactory.openSession();
        // 开始事务
        session.beginTransaction();
        // 使用 HQL 查询
        String hql = "FROM Employee";
        List<Employee> employees = session.createQuery(hql, Employee.class).list();
        for (Employee employee : employees) {
            System.out.println(employee.getName());
        }
        // 提交事务
        session.getTransaction().commit();
        // 关闭 Session
        session.close();
        // 关闭 SessionFactory
        sessionFactory.close();
    }
}

  • 原理

Hibernate 通过读取配置文件(如 hibernate.cfg.xml)和映射文件(如 Employee.hbm.xml 或使用注解)来建立 Java 对象和数据库表之间的映射关系。当应用程序操作 Java 对象时,Hibernate 会根据映射关系自动生成相应的 SQL 语句,并与数据库进行交互。

  • 要点

  1. 是一个 ORM 框架,实现对象和数据库的映射,提高开发效率。
  2. 提供事务管理和 HQL 查询语言,确保数据的一致性和方便查询。
  3. 通过配置文件和映射文件建立映射关系,实现对象和数据库的解耦。

  • 应用

可以深入学习 Hibernate 的高级特性,如缓存机制、关联映射、性能优化等,以及如何将 Hibernate 与其他框架(如 Spring)进行集成。例如,使用 Spring 和 Hibernate 结合的方式来构建企业级应用程序,利用 Spring 的 IoC 和 AOP 功能来管理 Hibernate 的 Session 和事务。

 友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90518703

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM常见概念之条件移动

问题 当我们有分支频率数据时&#xff0c;有什么有趣的技巧可以做吗&#xff1f;什么是条件移动&#xff1f; 基础知识 如果您需要在来自一个分支的两个结果之间进行选择&#xff0c;那么您可以在 ISA 级别做两件不同的事情。 首先&#xff0c;你可以创建一个分支&#xff…

Android AI ChatBot-v1.6.3-28-开心版[免登录使用GPT-4o和DeepSeek]

Android AI ChatBot- 链接&#xff1a;https://pan.xunlei.com/s/VOLi1Ua071S6QZBGixcVL5eeA1?pwdp3tt# 免登录使用GPT-4o和DeepSeek

集成学习(上):Bagging集成方法

一、什么是集成学习&#xff1f; 在机器学习的世界里&#xff0c;没有哪个模型是完美无缺的。就像古希腊神话中的"盲人摸象"&#xff0c;单个模型往往只能捕捉到数据特征的某个侧面。但当我们把多个模型的智慧集合起来&#xff0c;就能像拼图一样还原出完整的真相&a…

DeepSeek R1 本地部署指南 (3) - 更换本地部署模型 Windows/macOS 通用

0.准备 完成 Windows 或 macOS 安装&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下内容 Windows 和 macOS 命令执行相同&#xff1a; Windows 管理员启动&#xff1a;命令提示符 CMD ma…

【TI MSPM0】Timer学习

一、计数器 加法计数器&#xff1a;每进入一个脉冲&#xff0c;就加一减法计算器&#xff1a;每进入一个脉冲&#xff0c;就减一 当计数器减到0&#xff0c;触发中断 1.最短计时时间 当时钟周期为1khz时&#xff0c;最短计时时间为1ms&#xff0c;最长计时时间为65535ms 当时…

Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面

如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端&#xff0c;支持本地部署和API集成。它可以将任何文档或内容转化为上下文&#xff0c;供各种语言模型&#xff08;LLM&#xff09;在对话中使用。以下是…

信奥赛CSP-J复赛集训(模拟算法专题)(27):P5016 [NOIP 2018 普及组] 龙虎斗

信奥赛CSP-J复赛集训(模拟算法专题)(27):P5016 [NOIP 2018 普及组] 龙虎斗 题目背景 NOIP2018 普及组 T2 题目描述 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n n n 个兵营(自左至右编号 1 ∼ n 1 \sim n 1∼n),相邻编号的兵营之间…

多模态大模型常见问题

1.视觉编码器和 LLM 连接时&#xff0c;使用 BLIP2中 Q-Former那种复杂的 Adaptor 好还是 LLaVA中简单的 MLP 好&#xff0c;说说各自的优缺点&#xff1f; Q-Former&#xff08;BLIP2&#xff09;&#xff1a; 优点&#xff1a;Q-Former 通过查询机制有效融合了视觉和语言特征…

SpringBoot项目实战(初级)

目录 一、数据库搭建 二、代码开发 1.pom.xml 2.thymeleaf模块处理的配置类 3.application配置文件 4.配置&#xff08;在启动类中&#xff09; 5.编写数据层 ②编写dao层 ③编写service层 接口 实现类 注意 补充&#xff08;注入的3个注解&#xff09; 1.AutoWir…

计算机网络——总结

01. 网络的发展及体系结构 网络演进历程 从1969年ARPANET的4个节点发展到如今覆盖全球的互联网&#xff0c;网络技术经历了电路交换到分组交换、有线连接到无线覆盖的革命性变革。5G时代的到来使得网络传输速度突破10Gbps&#xff0c;物联网设备数量突破百亿级别。 网络体系…

Umi-OCR- OCR 文字识别工具,支持截图、批量图片排版解析

Umi-OCR 是免费开源的离线 OCR 文字识别软件。无需联网&#xff0c;解压即用&#xff0c;支持截图、批量图片、PDF 扫描件的文字识别&#xff0c;能识别数学公式、二维码&#xff0c;可生成双层可搜索 PDF。内置多语言识别库&#xff0c;界面支持多语言切换&#xff0c;提供命令…

高速网络包处理,基础网络协议上内核态直接处理数据包,XDP技术的原理

文章目录 预备知识TCP/IP 网络模型&#xff08;4层、7层&#xff09;iptables/netfilterlinux网络为什么慢 DPDKXDPBFPeBPFXDPXDP 程序典型执行流通过网络协议栈的入包XDP 组成 使用 GO 编写 XDP 程序明确流程选择eBPF库编写eBPF代码编写Go代码动态更新黑名单 预备知识 TCP/IP…

C++:背包问题习题

1. 货币系统 1371. 货币系统 - AcWing题库 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每种货币使用的次数不限。 不同种类的货币&#xff0c;面值可能是相同的。 现在&#xff0c;要你用这 V 种货币凑出 N 元钱&#xff0c;请问共有多少种不同的…

数据可信安全流通实战,隐语开源社区Meetup武汉站开放报名

隐语开源社区 Meetup 系列再出发&#xff01;2025 年将以武汉为始发站&#xff0c;聚焦"技术赋能场景驱动"&#xff0c;希望将先进技术深度融入数据要素流转的各个环节&#xff0c;推动其在实际应用场景中落地生根&#xff0c;助力释放数据要素的最大潜能&#xff01…

java使用Apache POI 操作word文档

项目背景&#xff1a; 当我们对一些word文档&#xff08;该文档包含很多的标题比如 1.1 &#xff0c;1.2 &#xff0c; 1.2.1.1&#xff0c; 1.2.2.3&#xff09;当我们删除其中一项或者几项时&#xff0c;需要手动的对后续的进行补充。该功能主要是对标题进行自动的补充。 具…

免费开源的NAS解决方案:TrueNAS

TrueNAS是业内知名的FreeNAS系统的升级版&#xff0c;是一款开源的网络存储系统&#xff0c;具有高性能、稳定性和易用性等优点。 TrueNAS目前有三个版本&#xff0c;分别是TrueNAS CORE、TrueNAS ENTERPRISE、TrueNAS SCALE。其中&#xff0c;TrueNAS CORE基于FreeBSD开发&…

LeetCode热题100精讲——Top1:两数之和【哈希】

你好&#xff0c;我是安然无虞。 文章目录 题目背景两数之和C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题&#xff0c;用这3种数据类型足矣 两数之和 题目链接&#xff1a;两数…

Rocky9.5基于sealos快速部署k8s集群

首先需要下载 Sealos 命令行工具&#xff0c;sealos 是一个简单的 Golang 二进制文件&#xff0c;可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …

阿里云服务器环境部署 四 MySQL主从配置

安装MySQL 导入mysql镜像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…

项目日记 -云备份 -服务器配置信息模块

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【项目日记-云备份】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 代码已上传 gitee 目录 前言配置信息文件文件配置类getInstance 获得实例readConfigFile 读取配置信息文件 测试 #mermaid-svg-ewlCpjdOf0q0VTLI {font-family:…