下一步,静心慢行。

![javaweb](/assets/blogImg/javaweb.jpg)

1. Servlet与JSP

1.1 页面请求工作流程是怎么样的

一个Web应用程序一般都是由客户端程序与服务器端程序两部分组成。

1) 用户通过浏览器输人链接地址来请求所需的资源。
2) 浏览器接受用户的请求,并把该请求组装成指定的格式发送给服务器端,客户端与服 务器端之间通过HTTP来完成具体的交互。其中请求的数据流中主要包含HTTP(HyperText Transfer Protocol,超文本传输协议,建立在TCP/IP基础上的一个协议,主要用来实现客户端 与服务器端之间的通信)请求方法( GET或POST)、请求的网址(URL, Uniform Resource Lo­cator, 统一资源定位符)以及请求的一些参数信息。
3) 服务器接收到客户端发来的请求,并查找用户所需要的资源。
4) 服务器查找到用户请求的资源后,把该资源返回给客户端。
5) 服务器通过把响应消息组装成特定的消息格式后返回给客户端,这个过程通过HTTP 来完成。响应的数据流主要包含状态编码(代表请求成功或失败),Content - type (例如text、 picture, HTML等),响应消息的内容(图片或HTML格式的内容)。
6) 浏览器对HTML进行解析,并把响应结果展现给用户。

1.2 HTTP中的GET和POST方法有什么区别

HTTP请求的方法有很多种类,例如GET、POST、HEAD、TRACE、OPTIONS等,但是 GET与POST是两个最常用的方法。

GET主要功能是从服 务器端获取用户所需资源,并将其作为响应返回给客户端,这些资源可以是HTML页面、图片、文档等内容中的任何一种,但需要注意的是,GET方法的作用主要用来获取服务器端资源信息,就如同数据库中査询操作一样,不会影响到资源自身的状态,例如删除、修改或新增资源都是不允许的。

POST方法提供了比GET方法更强大的功能,它除了能够从服务器端获取资源外,同时还可以向服务器上传数据。

虽然GET方法主要用来从服务器上获取数据,也可以向服务器上传数据,但是一般不建议采用GET方法来向服务器上传数据,而是推荐使用POST方法实现该功能。

1) 采用GET方法向服务器上传数据时,一般将数据添加到URL后面,并且二者用“?” 连接,各个变量之间用“&”连接。由于对URL的长度存在限制,因此采用这种方法能上传的数据量非常小,通常在1024Byte左右。而POST方法传递数据是通过HTTP请求的附件进行的,传送的数据量更大一些,一般默认为不受限制的。

2) 由于GET方法上传的数据是添加在URL中的,上传的数据被彻底“暴露”出来了,本身存在安全隐患。而POST方法向服务器提交的内容在URL中并没有明文显示,对用户都是不可见的,安全性更好一些。

例题:
在HTTP中,用于发送大量数据的方法是( )。

A.GET B.POST C.PUT D.OPTIONS

答案:B

1.3 什么是Servlet

Servlet是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容。

当Web服务器获取到一个对Servlet的请求时,该服务器将会把这请求交给对应的容器来处理,容器通过调用Servlet的方法(doGet()或doPost())来响应客户端的请求。
Servlet处理客户端请求有如下几个步骤:

1) 用户通过单击一个链接来向Servlet发起请求。
2) Web服务器接收到该请求后,会把该请求交给相应的容器来处理,当容器发现这是对 Servlet发起的请求后,容器此时会创建两个对象:HttpServletResponse和HttpServletRequest。
3) 容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程,同时把第2)步中创建的两个对象以参数的形式传递到新创建的线程中。
4) 容器调用Servlet的service ()方法来完成对用户请求的响应,service ()方法会调用 doPost()或doGet()方法来完成具体的响应任务,同时把生成的动态页面返回给容器。
5) 容器把响应消息组装成HTTP格式返回给客户端。此时,这个线程运行结束,同时删除第2)步创建的两个对象。

例题:
1.Servlet处理请求的方式为( )。
A.以进程的方式 B.以程序的方式 C.以线程的方式 D.以响应的方式

答案:C

1.4 doPost()方法与doGet()方法怎么选择

从Web容器处理HTTP请求的流程中可以看岀,最终的请求都会交给Servlet来处理,而 Servlet是通过调用service()方法来处理请求的,service()方法会根据不同的请求类型分别调用 doPost()方法(用于处理POST请求)或doGet()方法(用于处理GET请求)来处理用户请求,实现对客户的响应。如果请求是GET,就调用doGet()方法;如果请求是POST,就调用 doPost()方法。

当HTTP请求中的method属性为get时,调用doGet()方法;当method属性为 post时,则调用doPost()方法。

1.5 什么是Servlet的生命周期

Servlet运行在容器中,没有main()方法,因此,整个生命周期都是由容器来控制的。
Servlet的生命周期只有两个状态:未创建状态与初始化状态。这两种状态的转换主要是由3个重要的方法来进行控制:init( )、service()和destroy()。

Servlet的生命周期可以分为加载、创建、初始化、处理客户请求和卸载5个段**

1)加载。容器通过类加载器使用Servlet类对应的文件来加载Servlet。
2)创建。通过调用Servlet的构造函数来创建一个Servlet实例。
3)初始化。通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已被创建但向客户端提供服务之前调用的,需要注意的是,init()方法只会被调用一次。
4)处理客户请求。 Servlet —旦被创建后,它就可以为客户端提供服务了。每当有新的客户请求到来时,容器都会创建一个新的线程来处理该请求,接着会调用Servlet的service。方法来完成客户端的请求,当然,service)方法会根据请求的method属性值的不同调用决定是 调用doGet()方法还是调用doPOSt()方法来完成具体的响应。
5)卸载。容器在卸载Servlet之前需要调用destroy()方法,让Servlet自己释放其占用的系统资源,一旦destroy方法被调用,容器就不会再向这个Servlet发送任何请求消息了。如果容器需要这个Servlet,那么就必须重新创建并初始化一个实例。需要注意的是,destroy()方法只会被调用一次。

例题:
在Servlet的生命周期中,容器只调用一次的方法是( )。
A. service B. getServletConfig C. init D. destroy

答案:C,D

1.6 JSP与Servlet有何异同

JSP与Servlet的相同点为:JSP可以被看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成动态页面。由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。

JSP与Servlet的不同点为:
①Servlet的实现方式是在Java中嵌人HTML代码,编写和修 改HTML非常不方便,所以它比较适合做流程控制、业务处理;而JSP的实现方式为在HTML 中嵌人Java代码,比较适合页面的显示。
②Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletRequest对象、 HttpServletResponse对象以及HttpServlet对象得到。

1.7 Servlet中forward和redirect有什么区别

forward是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端浏览器的地址栏中不会显示转向后的地址,还是原来的地址。由于在整个定向的过程中用的是同一个Request,因此forward会将Request的信息带到被定向的JSP或Servlet中使用。

redirect则是客户端的重定向,是完全的跳转,即客户端浏览器会获取到跳转后的地址, 然后重新发送请求,因此浏览器中会显示跳转后的地址。同时,由于这种方式比forward方式多了一次网络请求,因此其效率要低于forward方式。
forward

引申:filter的作用是什么?主要实现什么方法?
filter使用户可以改变一个request并且修改一个response。filter不是一个Servlet,它不能产
生一个response,但它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。filter其实是一 个 “Servlet Chaining”(Servlet 链)
一个filter的作用包括以下几个方面:

1) 在Servlet被调用之前截获。
2) 在Servlet被调用之前检查Servlet Request。
3) 根据需要修改Request头和Request数据。
4) 根据需要修改Response头和Response数据。
5) 在Servlet被调用之后截获。

例题:
下列有关forward和redirect的描述中,正确的是( )。
A. forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求
B.执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原 来的地址
C.执行redirect时,服务器端告诉浏览器重新去请求地址
D.forward是内部重定向,redirect是外部重定向

答案:B、C、D

1.8 JSP的内置对象有哪些

JSP —共提供有9个内置对象:
request (请求对象) 、 response (响应对象) 、 pageContext (页面上下文对象) 、 session (会话对象) 、 application (应用程序对象) 、 out (输出对象) 、 config (配置对象) 、 page (页面对象)与exception (例外对象)。

根据以上9个内置对象的作用的不同,可以将它们分为4类。
第一类,与Servlet有关的page和config;
第二类,与Input/Output 有关的out, request和response;
第三类,与Context有关的application, session 和 pageContext;
第四类,与Error有关的exception。

1.9 Web开发中如何指定字符串的编码

String result = “Text”;
result = new String(str.getBytes(“ISO-8859-1” ),”GBK”);
result = result. trim();

在Web开发时也可以通过response. setContentType()方法来指定JSP页面 显示的编码格式。

1.10 什么是Ajax

Ajax = 异步 JavaScript 和XML。
Ajax是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面。

ajax的使用及实现步骤
(1) 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
(2) 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3) 设置响应HTTP请求状态变化的函数.
(4) 发送HTTP请求.
(5) 获取异步调用返回的数据.
(6) 使用JavaScript和DOM实现局部刷新.

1.11 cookie和session有什么区别

cookie是在HTTP下,服务器或脚本可以维护客户工作站上信息的一种方式。它是由Web 服务器保存在用户浏览器上的小文件,可以包含有关用户的信息(如身份识别号码、密码等 信息)。
session是指用来在客户端与服务器端之间保持状态的解决方案以及存储结构。
区别:

1) cookie机制釆用的是在客户端保持状态的方案,即数据存放在客户的浏览器上;而ses- sion机制釆用的是在服务器端保持状态的方案,即数据放在服务器上。
2) cookie安全性不够。
3) cookie性能更高一些。
4) 单个cookie保存的数据不能超过4KB ,很多浏览器都限制一个站点最多保存20个cookie;而session不存在此问题。

一般情况下,将用户登录信息等重要信息存放至session中,而其他需要保留的信息可以放在cookie中。

2. Spring框架部分

2.1 Spring 的理解

Spring 是一个 IOC 和 AOP 容器框架。 Spring 主要核心是:

(1)控制反转(IOC):传统的 java 开发模式中,当需要一个对象时,我们会自己创建一个对象,而在 Spring 开发模式中,Spring 容器使用了工厂模式为我们创建了所需要的对象,我们直接调用 Spring 为我们提供的对象即可,这就是控制反转的思想。实例化一个 java 对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法。当使用 spring 时我们不需要关心通过何种方式实例化一个对象,spring 通过控制反转机制自动为我们实例化一个对象。

(2)依赖注入(DI):Spring 使用 Java Bean 对象的 Set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

(3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

在 Spring 中,所有管理的对象都是 JavaBean 对象,而 BeanFactory 和 ApplicationContext 就是 spring 框架的两个 IOC 容器,现在一般使用 ApplicationContext,其不但包含了 BeanFactory 的作用,同时还进行更多的扩展。

2.2 Spring Bean 生命周期

1.Spring 容器 从 XML 文件中读取 Bean 的定义,并实例化 Bean。

2.Spring 根据 Bean 的定义填充所有的属性。

3.如果 Bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。

4.如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递 beanfactory 给 setBeanFactory 方法。

5.如 果 有 任 何 与 bean 相 关 联 的 BeanPostProcessors , Spring 会 在postProcesserBeforeInitialization()方法内调用它们。

6.如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。

7.如果有 BeanPostProcessors 和 bean 关联,这些 bean 的 postProcessAfterInitialization()方法将被调用。

8.如果 bean 实现了 DisposableBean,它将调用 destroy()方法。注意:

有两个重要的 bean 生命周期方法,第一个是 setup() , 它是在容器加载 bean 的时候被调用。第二个方法是 teardown() 它是在容器卸载类的时候被调用。

The bean 标签有两个重要的属性 init-method 和 destroy-method。使用它们你可以自己定制初始化和注销方法。它们也有相应的注解@PostConstruct 和@PreDestroy。

2.3 Spring 中的设计模式

代理模式—Spring 中两种代理方式,若目标对象实现了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 类代理,若目标对象没有实现任何接口,spring 使用 CGLIB 库生成目标对象的子类。

单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。

模板方法模式—用来解决代码重复的问题。比如: RestTemplate, JmsTemplate, JpaTemplate。

前端控制器模式—Srping 提供了 DispatcherServlet 来对请求进行分发。

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

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

工厂模式—在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。Spring 中使用 BeanFactory 用来创建对象的实例。

2.4 Spring 注解

Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代 XML 方式的 bean 描述,可以将 bean 描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。
注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解的装配模式。

<beans>

<context:annotation-config/>

<!-- bean definitions go here -->

</beans>

在 context:annotation-config/标签配置完成以后,就可以用注解的方式在 Spring 中向属
性、方法和构造方法中自动装配变量。
几种比较重要的注解类型:
1.@Required:该注解应用于设值方法。
2.@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
3.@Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧义。
4.JSR-250 Annotations: Spring 支持基于 JSR-250 注解的以下注解,@Resource、 @PostConstruct 和 @PreDestroy。

2.5 Spring 事务

Spring 支持两种类型的事务管理:

1.编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
2.声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和 XML 配置来管理事务。
Spring 事务配置示例(使用 tx 标签配置的拦截器)

<!-- 定义事务管理器(声明式的事务) -->

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<!-- 配置 Advice 通知 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes>

<tx:method name="*" propagation="REQUIRED" /> </tx:attributes>

</tx:advice>

<!-- 配置切点切面 -->

<aop:config>

<aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" />

<aop:advisor advice-ref="txAdvice"

pointcut-ref="interceptorPointCuts" />

</aop:config>

3. SpringMVC框架部分

3.1 SpringMVC 执行流程

SpringMvc
1、用户发送请求至 DispatcherServlet(前端控制器);

2、DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器);

3、HandlerMapping 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 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 响应用户。

3.2如何解决POST请求中文乱码问题,GET的又如何处理呢?

在web.xml中加入:

<filter>

<filter-name>CharacterEncodingFilter</filter-name>

<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>

<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>

</filter>

<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> </filter-mapping> ```tern>/*</url-pattern>
</filter-mapping>

以上可以解决post请求乱码问题。对于get请求中文参数出现乱码解决方法有两个:

1.修改tomcat配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

2.另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

3.3 springmvc 常用注解

@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@PathVariable:用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量作为参数。

@requestParam : 主 要 用 于 在 SpringMVC 后台控制层获取参数 ,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 通过 boolean 设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

@ResponseBody : 该注解用于将 Controller 的方法返回的对 象,通过适当的 HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。使用时机:返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用 @RequestBody : 该注解常用来处理 Content-Type: 不是 application/x-www-form-urlencoded 编码的内容,例如 application/json, application/xml 等; @RequestHeader :可以把 Request 请求 header 部分的值绑定到方法的参数上。

@CookieValue :可以把 Request header 中关于 cookie 的值绑定到方法的参数上。

3.4 SpringMVC 和 Struts2 对比

①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。

4. Mybatis框架部分

4.1 JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

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

④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

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

4.2 MyBatis编程步骤是什么样的?

① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过sqlsession执行数据库操作
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话

4.3 使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。

4.4 SqlMapConfig.xml中配置有哪些内容?

SqlMapConfig.xml中配置的内容和顺序如下:

properties(属性)

settings(配置)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

4.5 简单的说一下MyBatis的一级缓存和二级缓存

Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

4.6 Mapper编写有哪几种方式?

①接口实现类继承SqlSessionDaoSupport

使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件

1、在sqlMapConfig.xml中配置mapper.xml的位置

<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>

2、定义mapper接口

3、实现类集成SqlSessionDaoSupport
mapper方法中可以this.getSqlSession()进行数据增删改查。

②使用org.mybatis.spring.mapper.MapperFactoryBean

1、在sqlMapConfig.xml中配置mapper.xml的位置

如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置

<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>

2、定义mapper接口
注意
1、mapper.xml中的namespace为mapper接口的地址
2、mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致

3、Spring中定义

<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

③使用mapper扫描器
1、mapper.xml文件编写,

注意:
mapper.xml中的namespace为mapper接口的地址
mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
如果将mapper.xml和mapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置

2、定义mapper接口
注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录

3、配置mapper扫描器

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

4、使用扫描器后从spring容器中获取mapper的实现对象