一:SpringMVC
目录
1:SpringMVC是什么:
是一个实现了MVC模式的轻量级web框架。通过把Model,View,Conrtoller分离,从而把web分开,简化开发,方便操作。
2:SpringMVC的执行流程:
1:dispatchServert(前端控制器)发送请求到处理器映射器
2:处理器映射器返回一个处理器对象给前端控制器(如果有拦截器,这里还会返回一个拦截器对象)
3:前端控制器通过这个处理器对象找到合适的处理器适配器
4:处理器适配器执行完成后返回一个ModelAndView对象给前端控制器
5:前端控制器通过该对象找到视图解析器解析
6:视图解析器解析后返回一个View给前端控制器
7:前端控制器渲染这个View
8:前端控制器响应用户
3:SpringMvc的优点:
1:支持各种视图技术,不只是JSP
2:可以与Spring容器完美结合
3:支持各种请求资源的映射
4:SpringMVC如何重定向和转发:
forward:转发,在return前面加上
redirect:重定向,在return前面加上
5:SpringMVC与AJAX如何相互调用:
通过Jason框架可以把java中的对象转换成JS可以识别的jason数据。
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
6:如何解决POST和GET的乱码:
POST:加入编码过滤器
GET:更改tomcat配置;对参数重新编码
7:SpringMVC常用注解:
@RequestMapping:处理请求的映射
@RequestBody:将jason对象编程可识别的java对象
8:SpringMVC中拦截器怎么写:
1:实现HandlerInterceptor接口
2:在配置文件中配置拦截器
9:springMVC和struts2的区别有哪些:
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet)
而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例), struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
二:Mybatis:
1:Mybatis是什么:
mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发者只用关注sql本身,不用去注册驱动,加载链接等复杂的过程。
mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。
2:Mybatis工作原理:
mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。
读取配置文件
根据配置文件构建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
使用SqlSession对象操作数据库
关闭SqlSession
3:mapper接口工作原理:
通过jdk的动态代理方式为mapper接口创建proxy对象,代理对象会拦截接口中的方法,使它执行mapperStatement所代表的sql语句,并且把结果封装返回。
4:Mybatis优点:
1:支持对象关系映射
2:使用动态sql,是基于sql语句编程,更加灵活
3:能很好的与各类数据库兼容
4:能与Spring很好的集成
5:Mybatis缺点:
1:sql语句的编写工作量大
2:可移植性比较差,sql语句依赖于数据库,所以可移植性差
6:Mybatis分页原理
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。
可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
原理:分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,添加对应的物理分页语句和物理分页参数。
7:Mybatis一级二级缓存:
一次缓存:(默认开启)是SqlSession级别的缓存,缓存在SqlSession中,commit过后会清除
二级缓存:mapper级别的缓存,缓存在SqlSessionFactory中,需要开启,并且还需要实现序列化,(Serializable接口,实现序列化接口)commit过后还会存在,再次访问时就会先访问上次的缓存内容
8:MyBatis实现一对多有几种方式,怎么操作的?
有联合查询和嵌套查询。
联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。
9:Mybatis动态sql底层原理:
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
10:
5、MyBatis与Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
mybatis中一级缓存和二级缓存的简单介绍
mybatis的一级缓存:
MyBatis会在一个SqlSession对象中创建一个本地缓存,对于每一次查询,都会根据查询的条件去本地缓存中查找是否在缓存中,如果在缓存中,就直接从缓存中取出,然后返回给用户;否则,从数据库读取数据,将查询结果存入缓存并返回给用户。
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
如果缓存中有数据就不用从数据库中获取,大大提高系统性能。