1.Spring-mvc原理
- 客户端请求提交到DispathcerServlet
- 由DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet讲请求提交到Controller
- Controller调用业务逻辑处理后, 返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器, 找到ModelAndView指定的视图
- 视图负责讲结果显示到客户端.
2.Struts2工作流程
- 用户发出一个
HttpServletRequest请求 - 这个请求经过一系列的过滤器
Filter来传送. 如果Struts2 与Site Mesh插件以及其他的框架进行了集成, 则请求首先要经过可选的ActionContextCleanUp过滤器. - 调用
FilterDispatcher.FilterDispatcher是控制器的核心, 它通过询问 ActionMapper 来确定该请求是否需要调用某个Action. 如果需要调用某个Action, 则FilterDispatcher就把请求转交给ActionProxy来处理. -
ActionProxy通过配置管理器Configuration Manager询问框架的配置文件struts.xml, 从而找到需要调用的Action类. -
ActionProxy创建一个ActionInvocation的实例, 该实例使用命名模式来调用. 在Action执行的前后,ActionInvocation实例根据配置文件加载与Action相关的所有拦截器Interceptor. - 一旦
Action执行完毕,ActionInvocation实例根据struts.xml文件中的配置找到相对应的返回结果, 返回结果通常是一个JSP或者FreeMarker的模版. - 最后,
HttpServletRequest响应通过web.xml文件中配置的过滤器返回.
3. Hibernate的工作原理
1. Hibernate的初始化,创建Configuration对象.
这一步用来读取xml配置文件和映射文件的信息到Configuration对象的属性中. 具体为
- 从Hibernate配置文件Hibernate.cfg.xml中读取配置文件信息, 存放到
Configuration对象(内存)中 - 根据配置文件中的mapping元素加载所有的实体类对应的映射文件到
Configuration
2. 创建SessionFactory实例.
通过Configuration对象读取到的配置文件信息创建 SessionFactory, 即将Configuration对象内的配置信息存入SessionFactory的内存(属性)中. SessionFactory充当数据存储源的代理, 并负责创建Session对象. 得到SessionFactory对象后, Configuration对象的使命就结束了.
3. 创建Session实例, 建立数据库连接.
Session通过SessionFactory打开, 创建一个Session对象就相当于在数据库建立了一个新的连接. Session对象用来操作实体对象, 并把这些操作专程对数据中数据的增加, 删除, 查询和修改操作.
4.创建Transaction实例, 开始一个事物
Transaction用于事物管理, 一个`Transaction对象对应的事物可以包括多个操作, 在使用 Hibernate进行增加, 删除和修改操作时必须先创建Transaction对象.
5.利用Session的方法进行持久化操作,将实体对象持久化到数据库中.
6.提交操作结果并结束事物,对实体对象的持久化操作结束后, 必须提交事物
7. 关闭Session, 与数据库断开连接.
4.spring事物管理
- 使用声明式事物管理
- 配置Spring JDBC 中的数据源事务管理
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
- 配置注解式事务处理
<tx:annotation-driven transaction-manager="txManager"/>
- 使用声明式事物
@Transactional
public Object 业务方法(){
业务过程
添加数据
删除数据
修改数据
添加数据
}
5.MyBatis哪几种方式传参?
- 传递单个参数, 直接写就可以, 参数类型可以是String, 也可以是基本类型
<select id="findById" parameterType="string" resultType="string">
select user_name from user where id=#{id}
</select>
- 传递单个参数, 参数类型是封装类, xml增加说明
<insert id="addUser" parameterType="cn.tedu.entity.User">
insert into user set id=#{id},name=#{name}
</insert>
- 传递多个参数, 把参数放在map中, 传递这个map做为参数
<insert id="addUser" parameterType="map">
insert into user set id=#{id}, name=#{name}
</insert>
- 直接传参数, 使用@Param标注, 传参使用标注名或者序列
Java代码:
public int find(@Param("username")String username,@Param("password")String password);
XML
<select id="find" parameterType="string" resultType="Integer">
select count(*) from user
where username=#{username} and password=#{password}
</select>
另一种写法
<select id="find" parameterType="string" resultType="Integer">
select count(*) from user
where username=#{0} and password=#{1}
</select>
- 封装类使用@Param标注, 一般不怎么用, 使用多个实体类才这样做
Java代码:
public int update(@Param("user")User user);
XML
<update id="update" parameterType="cn.tedu.entity.User>
update user set username=#{user.username}, password=#{password}
where userid=#{user.id}
</update>