像InternalResourceViewResolver这种能解析所有的视图,即永远能返回一个非空View对象
的ViewResolver,一定要把它放在ViewResolver链的最后面。
DispatcherServlet执行过程:前端控制器接收请求,前端控制器请求处理映射器,处理映射器根据配置找到
对应的Handler,将结果返回给前端控制器,前端控制器请求处理适配器执行Handler,Handler执行完后返回
ModelAndView给前端控制器,前端控制器请求视图解析器找到对应的视图返回给前端控制器,前端控制器对
视图渲染并装填模型数据到view的request域
--------------------------------Mybatis的整体架构-----------------------------------------
Mybatis的部分基础模块:
在实际开发中,一般很少使用Mybatis的事务管理,而是Mybatis和Spring集成时,使用Spring管理事务
1.数据源:在数据源中提供了所有建立数据库连接的信息。
2.缓存机制:Mybatis提供了一级缓存和二级缓存。需要注意的是Mybatis自带的这两级缓存与Mybatis及
整个应用是运行在JVM中的,共享一块堆内存,如果两级缓存的数据量过大,可能会影响系统中其它功能的
运行,所以需要缓存大量数据时,建议考虑Redis、Memcache等缓存产品。
3.Binding模块:Mybatis通过Binding模块将用户自定义的Mapper接口与映射配置文件关联起来,系统
可以通过自定义Mapper接口中的方法执行相应的Sql语句完成数据库操作。
Mybatis的初始化流程:
任何框架的启动无非是加载自己运行时所需的配置信息,Mybatis的配置信息
主要在mybatis-config.xml中,这些XML配置信息,Mybatis将其存入Configuration中,Configuration作为
配置信息的容器。等Configuration对象初始化完成后,就可以使用Mybatis操作数据库了。换言之,Mybatis
初始化的过程就是创建Configuration对象的过程。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//初始化流程主要代码
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List list = sqlSession.selectList("");
(1)将配置文件mybatis-config.xml加载成InputStream输入流。
(2)通过SqlSessionFactoryBuilder的build()方法创建SqlSessionFactory
对象。
(3)通过SqlSessionFactory的openSession()方法创建SqlSession对象。
(4)执行Mapper文件中的查询语句,获取查询结果。
MyBatis的初始化流程主要发生在第(2)步,SqlSessionFactoryBuilder根据
传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的
SqlSessionFactory实例。
MyBatis的初始化要经过以下几步:
(1)客 户 端 Client 调 用 SqlSessionFactoryBuilder 对 象 的
build(inputStream)方法。
(2)SqlSessionFactoryBuilder 会 根 据 输 入 流 inputStream 等 信 息 创 建
XMLConfigBuilder对象。
(3)SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法。
(4)XMLConfigBuilder对象返回Configuration对象。
(5) SqlSessionFactoryBuilder 根 据 Configuration 对 象 创 建 一 个
DefaultSessionFactory对象。
(6)SqlSessionFactoryBuilder 返 回 DefaultSessionFactory 对 象 给
Client,供Client使用。
SqlSessionFactoryBuilder().build(inputStream);主要涉及MyBatis的初始化流
程,而 sqlSessionFactory.openSession()、sqlSession.selectList("") 和
sqlSession.close()涉及MyBatis执行流程。
Mybatis的执行流程:
(1)SqlSessionFactory调用openSession()方法获取SqlSession对象,
SqlSession对象封装了对数据库的CRUD(增删改查)和事务控制。
(2)为SqlSession传递一个配置SQL语句的Statement Id和参数,然后返回结
果。Statement Id = namespace + <select> 标签的id属性.
MyBatis在初始化的时候,会将MyBatis的配置信息全部加载到内存中,使用
Configuration实例来维护。可以使用sqlSession.getConfiguration()方法来获取。
AyUserMapper.xml配置文件加载到内存中会生成一个对应的MappedStatement对象,
然后以key="com.ay.dao.AyUserDao. findById ",value为MappedStatement对象
的形式维护到Configuration的一个Map中。当以后需要使用的时候,只需要通过Id值
获取即可。
综上所述,SqlSession的职能是,根据Statement Id,在MyBatis配置对象
Configuration中获取到对应的MappedStatement对象,然后调用MyBatis执行器来
执行具体的操作。
(3)MyBatis执行器Executor根据SqlSession传递的参数执行query()方法,
最 后 会 创 建 一 个 StatementHandler 对 象,然后将必要的参数传递给
StatementHandler,使用StatementHandler来完成对数据库的查询,最终返回List
结果集。
Executor的功能和作用是:
1.根据传递的参数,完成SQL语句的动态解析,生成BoundSql对象,供StatementHandler使用。
2.为查询创建缓存,以提高性能。
3.创建JDBC的Statement连接对象,传递给StatementHandler对象,返回List查询结果。
(4)StatementHandler对象负责设置Statement对象中的查询参数、处理JDBC
返回的resultSet,将resultSet加工为List集合返回。
StatementHandler对象主要完成以下两个工作:
1.对于JDBC的PreparedStatement类型的对象,在创建的过程中,使用的是SQL
语句,字符串会包含若干个"?"占位符,其后再对占位符进行设值,
StatementHandler通过parameterize(statement)方法对Statement进行设
值。
2.StatementHandler 通 过 List<E> query(Statement statement,
ResultHandler resultHandler)方法来完成执行Statement,和将Statement
对象返回的resultSet封装成List。
StatementHandler的parameterize(Statement)方法调用了ParameterHandler
的 setParameters(statement) 方 法 , ParameterHandler 的
setParameters(Statement)方法负责根据输入的参数对statement对象的"?"占
位符处进行赋值。
参考书籍:Spring+Mybatis企业应用实战