web后台复习

目录

1、HTTP 请求的 GET 与 POST 方式的区别

1.HTTP请求格式:

2、解释一下什么是 servlet

3、说一说 Servlet 的生命周期

4、Servlet 的基本架构

5、什么情况下调用 doGet()和 doPost()

6、Request 对象的主要方法

7、forward 和 redirect 的区别

8、jsp 有哪些内置对象?作用分别是什么、

9、JSP 的常用指令

10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别

11、四种会话跟踪技术作用域

12、MVC 的各个部分都有那些技术来实现?如何实现

13、web.xml 文件中可以配置哪些内容

14、session 和 cookie 有什么区别

15、Java 反射技术主要实现类有哪些,作用分别是什么

16、讲一下什么是 Spring

17、Spring 的 IOC 和 AOP 机制

18、Spring 中 Autowired 和 Resource 关键字的区别

19、依赖注入的方式有几种,各是什么

20、解释一下 spring bean 的生命周期

21、解释 Spring 支持的几种 bean 的作用域

22、Spring 基于 xml 注入 bean 的几种方式

23、Spring 框架中都用到了哪些设计模式

24、Spring MVC 流程

25、SpringMVC 怎么样设定重定向和转发的

26、SpringMVC 常用的注解有哪些

27、什么是 MyBatis

28、MyBatis 的优点和缺点

29、#{}和${}的区别是什么

30、当实体类中的属性名和表中的字段名不一样 ,怎么办

31、如何执行批量插入

32、MyBatis 实现一对一有几种方式?具体怎么操作的

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

34、Mybatis 的一级、二级缓存


1、HTTP 请求的 GET 与 POST 方式的区别

1. get 是从服务器上获取数据,post 是向服务器传送数据。
2. 请求的时候参数的位置有区别:get 的参数是拼接在 url 后面,用户在浏览器地址栏可以看到;post 是放在 http 包的包体中
3. 能提交的数据有区别,get 方式能提交的数据只能是文本,且大小不超过 1024 个字节,而 post 不仅可以提交文本还有二进制文件。
所以说想上传文件的话,那我们就需要使用 post 请求方式
4. get 安全性非常低,post 安全性较高;比如说用户注册,不能把用户提交的注册信息用 get 的方式,会把用户的注册信息都显示在
Url 上,是不安全的

1.HTTP请求格式:

<request line>

<headers>

<blank line>

<request-body>

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体

HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST(开发关心的只有GET请求和POST请求)。


2、解释一下什么是 servlet

Servlet 是服务器端的程序,动态生成 html 页面发送到客户端,但是这样程序里会有很多 out.println(),java 与 html 语言混在一起很乱,所以后来 sun 公司推出了 JSP.其实 JSP 就是 Servlet,每次运行的时候 JSP 都首先被编译成 servlet 文件,然后再被编译成.class 文件运行。有了 jsp,在 MVC 项目中 servlet 不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制 jsp 与 javabean 之间的流转
其能够处理的请求有doGet(),doPost(),service()等方法,开发servlet时可以直接结成javax.servlet,http.HttpServlet

3、说一说 Servlet 的生命周期

Servlet 生命周期包括三部分:
初始化:Web 容器加载 servlet,调用 init()方法
处理请求:当请求到达时,运行其 service()方法。service()自动派遣运行与请求相对应的 doXX(
doGet 或者 doPost)方法。
销毁:服务结束,web 容器会调用 servlet 的 distroy()方法销毁 servlet。


4、Servlet 的基本架构

public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

5、什么情况下调用 doGet()和 doPost()

Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost()。

6、Request 对象的主要方法

setAttribute(String name,Object):设置名字为 name 的 request 的参数值
getAttribute(String name):返回由 name 指定的属性值
getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的 Body 的长度
getHeader(String name):获得 HTTP 协议定义的文件头信息
getHeaders(String name):返回指定名字的 request Header 的所有值,结果是一个枚举的实例
getHeaderNames():返回所以 request Header 的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有 name 指定的参数值
getParametervalues(String name):获得有 name 指定的参数的所有值
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的 IP 地址
getSession([Boolean create]):返回和请求相关 Session
getServerName():获取服务器的名字

7、forward 和 redirect 的区别

转发与重定向
(1)从地址栏显示来说
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏
览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址;
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL.
(2)从数据共享来说
forward:转发页面和转发到的页面可以共享 request 里面的数据.
redirect:不能共享数据.
(3)从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
(4)从效率来说
forward:高.
redirect:低

8、jsp 有哪些内置对象?作用分别是什么、

名称
作用
request
包含用户端请求的信息
response
包含服务器传回客户端的响应信息
session
与请求有关的会话期
pageContext
管理网页属性
application
服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
out
向客户端输出数据
config
servlet 的架构部件
page
指网页本身
exception
针对错误页面才可使用


9、JSP 的常用指令

(1)page 指令: 属性最多的指令(实际开发中 page 指令默认),属性最多的一个指令,根据不同的属性,指导整个页面特性
格式:<%@ page 属性名 1= "属性值 1" 属性名 2= "属性值 2" ...%>
常用属性如下:
language:jsp 脚本中可以嵌入的语言种类,这个没用,写与不写一样的;
pageEncoding:当前 jsp 文件的本身编码---内部可以包含 contentType
contentType:response.setContentType(text/html;charset=UTF-8)
import:导入 java 的包
errorPage:当前页面出错后跳转到哪个页面
isErrorPage:当前页面是一个处理错误的页面
(2)include 指令: 页面包含(静态包含)指令,可以将一个 jsp 页面包含到另一个 jsp 页面中 格式:<%@ include file="被包含的文件地址"%>
(3)taglib 指令: 在 jsp 页面中引入标签库(jstl 标签库、struts2 标签库)
格式:<%@ taglib uri="标签库地址" prefix="前缀"%>

10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别

动态 INCLUDE 用 jsp:include 动作实现, <jsp:include page="included.jsp" flush="true"/>它总是会检查所含文件中的变化,适合用 于包含动态页面,并且可以带参数
静态 INCLUDE 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面 <%@ include file="included.html" %>

11、四种会话跟踪技术作用域

(1)page:一个页面
(2)request::一次请求
(3)session:一次会话
(4)application:服务器从启动到停止

12、MVC 的各个部分都有那些技术来实现?如何实现

MVC 是 Model-View-Controller 的简写。
Model 代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现)
View 是应用的表示面(由 JSP 页面产生)
Controller 是提供应用的处理过程控制(一般是一个 Servlet)
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。

13、web.xml 文件中可以配置哪些内容

web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验 证方式、错误页面.

14、session 和 cookie 有什么区别

1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。

15、Java 反射技术主要实现类有哪些,作用分别是什么

1.Class类:代表一个类

2.Field 类:代表类的成员变量(属性)

3.Method类:代表类的成员方法

4.Constructor 类:代表类的构造方法


16、讲一下什么是 Spring

Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,
目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:
基于XML的配置、基于注解的配置、基于Java的配置。
主要由以下几个模块组成:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。



 

17、Spring 的 IOC 和 AOP 机制

(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。


(2). 在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

(3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。

(4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入or控制反转。 注入方式有两种:依赖注入和设置注入;

IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。


1、AOP面向方面编程基于IoC,是对OOP的有益补充;

2、 AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
3、 实现AOP的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。


 

18、Spring 中 Autowired 和 Resource 关键字的区别

@Resource @Autowired 都是做 bean 的注入时使用,其实 @Resource 并不是 Spring 的注解,它的包 是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。
1 、共同点
两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。
2 、不同点
(1) @Autowired
@Autowired
Spring
提 供 的 注 解
需 要 导 入 包 org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入。
public class TestServiceImpl {
    @Autowired 
    private UserDao userDao;
    @Autowired 
    public void setUserDao(UserDao userDao) {

    this.userDao = userDao;

 }
}
@Autowired 注解是按照类型( byType )装配依赖对象,默认情况下它要求依赖对象必须存在,如果允
null 值,可以设置它的 required 属性为 false 。如果我们想使用按照名称( byName )来装配,可以结 合@Qualififier 注解一起使用。
public class TestServiceImpl 
{ @Autowired 

@Qualifier("userDao") 
private UserDao userDao;
 }

19、依赖注入的方式有几种,各是什么

一、构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
优点:
对象初始化完成后便可获得可使用的对象。
缺点:
当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函 数,麻烦。
二、setter 方法注入
IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类。
优点:
灵活。可以选择性地注入需要的对象。
缺点:
依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
三、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参
数就是要注入的对象。
优点
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
缺点:
侵入行太强,不建议使用。
PS:什么是侵入行?
如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是 侵入性。

20、解释一下 spring bean 的生命周期

首先说一下 Servlet 的生命周期:实例化,初始 init,接收请求 service,销毁 destroy;
Spring 上下文中的 Bean 生命周期也类似,如下:
(1)实例化 Bean:
对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入
另一个尚未初始化的依赖时,
容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当
容器启动结束后,通过获取 BeanDe fifi nition 对象中的信息, 实例化所有的 bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在 BeanWrapper 对象中,紧接着,Spring 根据 BeanDe fifi nition 中的信息 以及 通过 BeanWrapper 提供的设置属性
的接口完成依赖注入。
接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:
①如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,此处传递的就是 Spring 配置文
件中 Bean 的 id 值;
②如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,传递的 是 Spring 工厂自身。
③如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用
setApplicationContext(ApplicationContext)方法,传入 Spring 上下文;
(4)BeanPostProcessor:
如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用
postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method:
如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s)方法;由于
这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean 了。
(7)DisposableBean:
当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的
destroy()方法;
(8)destroy-method:
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

21、解释 Spring 支持的几种 bean 的作用域

Spring 容器中的 bean 可以分为 5 个范围:
(1) singleton:默认,每个容器中只有一个 bean 的实例,单例的模式由 BeanFactory 自身来维护。
(2) prototype:为每一个 bean 请求提供一个实例。
(3) request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回 收。
(4) session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean
会随之失效。
(5) global-session:全局作用域,global-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器
中工作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局
变量需要存储在 global-session 中。全局作用域与 Servlet 中的 session 作用域效果相同。

 


22、Spring 基于 xml 注入 bean 的几种方式

(1) Set 方法注入;
(2) 构造器注入:①通过 index 设置参数的位置;②通过 type 设置参数类型;
(3) 静态工厂注入;
(4) 实例工厂;
详细内容可以阅读:https://blog.csdn.net/a745233700/article/details/89307518

23、Spring 框架中都用到了哪些设计模式

(1)工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean 默认为单例模式。
(3)代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被
制动更新,如 Spring 中 listener 的实现--ApplicationListener。

24、Spring MVC 流程

1.用户发送请求被前端DispatcherServlet捕获;

2.DispatcherServlet捕获到请求后,调用HandlerMapping处理映射器,请求获取Handle;

3.处理器映射器跟据请求url找到具体的处理器,生成处理器对象及处理器拦截器并返回给DispatcherServlet;

4.DispatcherServlet调用HandlerAdapter处理器适配器;解析器,由框架提供

1、 用户发送请求至前端控制器 DispatcherServlet。
2、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器
(如果有则生成)一并返回给 DispatcherServlet。
4、 DispatcherServlet 调用 HandlerAdapter 处理器适配器。
5、 HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller 执行完成返回 ModelAndView。
7、 HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。
8、 DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
9、 ViewReslover 解析后返回具体 View。
10、DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet 响应用户。
组件说明:
以下组件通常使用框架提供实现:
DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件 之间的耦合性,提高每个组件的扩展性。
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方 式,注解方式等。
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、
excel 等。

25、SpringMVC 怎么样设定重定向和转发的

(1) 转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2) 重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

26、SpringMVC 常用的注解有哪些

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所 有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。
@ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户。

27、什么是 MyBatis

<select id=”selectorder”parametertype=”int”
resultetype=”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where
order_id=#{id};
</select>
(1) Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句
本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原
生态 sql,可以严格控制 sql 执行性能,灵活度高。
(2) MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了
几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3) 通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement
中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对
象并返回。(从执行 sql 到返回 result 的过程)。

28、MyBatis 的优点和缺点

优点:
(1) 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在
XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重
用。
(2) 与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
(3) 很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库
MyBatis 都支持)。
(4) 能够与 Spring 很好的集成;
(5) 提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系
组件维护。
缺点:
(1) SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定
要求。
(2) SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

29、#{}和${}的区别是什么

#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。

30、当实体类中的属性名和表中的字段名不一样 ,怎么办

1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
<select id=”selectorder”parametertype=”int” 
resultetype=”me.gacl.domain.order”>
 select order_id id, order_no orderno ,order_price price form orders where 
order_id=#{id}; 
</select>
2 种: 通过来映射字段名和实体类属性名的一一对应的关系
<select id="getOrder" parameterType="int" resultMap="orderresultmap">
        select * from orders where order_id=#{id}
</select>

<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<id property=”id” column=”order_id”>
<result property = “orderno” column =”order_no”/> 
<result property=”price” column=”order_price” /> 
</reslutMap>

31、如何执行批量插入

首先,创建一个简单的 insert 语句:
然后在 java 代码中像下面这样执行批处理插入:
63
// 注意这里 executortype.batch
sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name : names) {
mapper.insertname(name);
}
sqlsession.commit();
}catch(Exception
e){ e.printStackTrace(
);
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();
}

32、MyBatis 实现一对一有几种方式?具体怎么操作

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里面配置 association
节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。

33、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()方法的调用。这就是延迟加载的基本原理。
当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。

34、Mybatis 的一级、二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flfl ush 或 close 之后,该
Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用
PerpetualCache,HashMap
存储,不同在于其存储作用域为
Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现
Serializable 序列化接口(可用来保存对象的状态),可在它的映射 文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces)的进行了 C/U/D 操作后,默认该作用域下所
有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值