Mybatis介绍
Mybatis作为一个持久层框架,对jdbc操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花精力去处理例如注册驱动、创建connection、创建statement、设置参数、结果集检索等jdbc繁杂的代码过程。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射成Java对象返回。
Mybatis解决jdbc编程的问题:
- 数据库频繁的连接创建、释放造成资源浪费;在SqlMapConfig.xml中配置数据库连接池进行管理
- SQL语句写在Java代码中不易维护;将SQL语句配置在XXXmapper.xml文件中,实现代码分离
- sql传参麻烦;Mybatis自动将java对象映射至SQL语句,通过statement中的parameterType定义输入参数的类型
- 对象解析麻烦;Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型
Mybatis参数传递#{} 和 ${}
参考
#{}和${}
最大的区别就是#{}会在使用的时候被加上 '' 引号,${}
直接传值不做任何处理
select * from info where name= #{name} #传递得到的结果是:...where name = '博客园'
select * from info where name= ${name} #传递得到的结果是:...where name = 博客园
#{}
最大的好处就是可以很大程度上防止SQL注入,#{}
会对传入的参数做预编译处理,也就是会当做字符串来处理。${}
则会把值直接传递给sql,如name = xxx and 1=1这种情况就会导致恶意注入sql获取信息或其他恶意操作,很危险。
Mybatis和Hibernate
-
相同点:
Hibernate与Mybatis都可以是通过SessionFactoryBuilder由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session来开启执行事务和SQL语句。 -
不同点:
1. 对象管理的对比:Hibernate是ORM解决方案,采用面向对象的视角来持久化Java应用中的数据,移植性更好,Mybatis需要自行写SQL管理。
2. sql优化方面:Hibernate的查询会把表中所有字段查询出来,存在性能损耗。Mybatis的sql是手动编写的,按需查找。
3. 开发速度对比:考虑两者的特性及性能,还有实际项目需求;如果只是简单的CRUD选Hibernate,对于大型项目涉及到复杂sql选Mybatis。
Hibernate缓存
Hibernate一级缓存是Session缓存,对Session的生命周期进行管理。
Hibernate二级缓存是SessionFactory缓存,被所有Session共享,除了以内存作为存储介质外还可以选用硬盘等外部存储设备。
Spring和SpringMVC
Spring是一个一站式的框架,提供了表现层(SpringMVC)到业务层(Spring)再到数据层(Springdata)的全套解决方案,Spring的两大核心IOC(控制反转)和AOP(面向切面编程)。Spring IOC和AOP 原理
- IOC:控制反转,传统过程中当一个对象依赖于另一个对象时,会由该对象去创建另一个对象,有了IOC后将创建过程交给IOC,又Spring创建bean,从而只需要给该对象注入即可。Spring IOC原理
- AOP:面向切面编程,将公共服务封装到一个可重用模块,比如权限认证、日志管理、事务处理等。Spring AOP简单Demo实现
SpringMVC执行
- 用户请求匹配DispatcherServlet(前端控制器)的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理
- DispatcherServlet接收到请求后,将根据请求信息交给HandlerMapping(处理器映射器)
- HandlerMapping根据用户的url请求查询匹配该url的Handler(处理器),并返回一个执行链
- DispatcherServlet在请求HandlerAdapter(处理器适配器)调用相应的Handler进行处理并返回ModelAndView(数据和视图)给DispatcherServlet
- DispatcherServlet将ModelAndView请求ViewReslover(视图解析器),返回具体View
- DispatcherServlet将View(视图)进行渲染视图(即 将模型数据填充至视图中)
- DispatcherServlet将页面响应给用户
组件说明
- DispatcherServlet
首先看下web.xml配置文件:<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
这里就是Servlet的配置,只不过这个Servlet是系统已经实现好的前端控制器:DispatcherServlet,相当于mvc模式中的c,是整个流程控制的中心,调用其他组件来处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
- HandlerMapping
public interface HandlerMapping { @Nullable HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception; }
HandlerMapping是一个接口,DispatcherServlet调用HandlerMapping根据请求url找到需要执行的处理器(这里实际返回的是执行链),springmvc提供了不同的映射器实现不同的映射方式,如:配置文件方式,实现接口方式,注解方式等。该接口里面只有一个方法:getHandler,该方法可以通过传入的参数请求对象HTTPServletRequest,得到HandlerExecutionChain(里面包含了处理器对象和拦截器)。可以简单的理解为该方法通过request请求对象获得要执行的处理器(每种HandlerMapping实现类返回的处理器不一定相同,有可能是处理器中的方法,也有可能是处理器本身)。
BeanNameURLHandlerMapping是默认的HandlerMapping实现类,它的getHandler方法返回的是处理器类。常用的HandlerMapping实现类有:@Controller public class HelloController { @RequestMapping("/sayHello") public String sayHello(){ System.out.println("hello"); return "success"; } }
RequestMappingHandlerMapping:该类采用注解方式进行映射,使用最广泛,也最简单,只需要在类或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是处理器类中的方法。
SimpleURLHandlerMapping:采用配置文件的方式进行映射,适用性最强,需要在配置文件里面配置,它的getHandler方法返回的是处理器类。
Handler
Handler是继DispatcherServlet的后端处理器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发Handler。HandlerAdapter
DispatcherServlet通过HandlerAdapter调用处理器,因为不同的HandlerMapping实现类返回的处理器格式不是固定的,所以处理请求时需要HandlerAdapter做适配。public interface HandlerAdapter { //判断该适配器是否支持传入的handler(处理器) boolean supports(Object handler); //使用给定的handler处理请求,也就是执行handler @Nullable ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler) throws Exception; long getLastModified(HttpServletRequest var1, Object var2); }
HandlerAdapter也是一个接口,它里面有两个重要的方法:
boolean supports(Object handler);这个方法可以判断该适配器是否支持传入的handler
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler)throws Exception;这个方法使用给定的handler处理请求,也就是执行handler。
常用的HandlerAdapter实现类就是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。
在spring mvc的核心配置文件中加上:<mvc:annotation-driven />就会自动帮我们注册RequestMappingHanlderMapping和RequestMappingHandlerAdapter<!-- 配置spring创建容器时要扫描的包 --> <context:component-scan base-package="cn.xh"></context:component-scan> <!-- 配置视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven />
- ModelAndView
执行处理器,返回ModelAndView给DispatcherServlet,这里ModelAndView类指的是执行完处理器以后需要在视图显示的数据和视图,执行处理器后,将数据保存在ModelAndView的Model属性中,将要显示的视图(通常为逻辑视图名)保存在View属性中,然后返回。ModelAndView类可以将处理器和视图渲染之间的紧密联系解耦合。@RequestMapping("/findModelAndView") public ModelAndView findModelAndView(){ System.out.println("modelAndView"); ModelAndView md = new ModelAndView(); User u1 = new User(); u1.setUid(1); u1.setName("zhangsan"); u1.setAge(23); md.addObject("user",u1); md.setViewName("aa"); return md; }
- ViewReslover
ViewReslover根据处理器返回的ModelAndView中的逻辑视图名为中央控制器返回一个可用的View实例。public interface ViewResolver { @Nullable View resolveViewName(String viewName, Locale var2) throws Exception; }
接口ViewReslover里面有一个方法:resolveViewName,负责将处理结果生成View视图。
ViewReslover首先根据逻辑视图名解析成物理视图名(即具体的页面地址),再生成View对象。
- View
public interface View { void render(@Nullable Map<String, ?> model, HttpServletRequest var2, HttpServletResponse var3) throws Exception; }
springmvc框架提供了很多的View视图类型的支持,包括:jstlView,freemarkerView、pdfView等。我们最常用的视图就是jsp。
View接口里面有一个方法render,可以将数据model渲染到视图。DispatcherServlet根据View渲染视图(数据model已填充至视图)响应给用户。
Spring boot和Spring区别
-
Spring boot相比于Spring:
- Spring Boot可以建立独立的Spring应用程序
- 内嵌了如Tomcat,Jetty等容器,可以直接跑起来,不用再做部署工作了
- 无需再像Spring那样搞一堆繁琐的xml配置文件
- 可以自动配置Spring
- 提供了一些现有的功能,如亮度工具、表单验证以及一些外部配置等第三方功能
- 提供的pom可以简化maven的配置