整合springmvc和mybatis就相当于ssm整合。
整合思想:
对于springmvc和mybatis整合项目的系统架构可以看作为:
表现层(springmvc)------>业务层(service接口)-------->持久层(mybatis)------->数据库
spring用来管理各层中所建立的类文件,以及类中的相互调用
由于调用关系是从从左往右调用,所以整合的话从持久层开始整合。
一、整合dao层(mybatis和spring的整合)
首先清楚配置mybatis需要哪些文件。
两类: 1.配置mybatis环境的配置文件
2.dao层中生成的文件(类和xml文件)
配置环境的配置文件:
1.sqlMapConfig.xml
配置nybatis运行的环境,总体属性。一般在这里配置dao层生成的文件,但是由于mybatis和spring的整合,在spring的配置扫描管理dao层生成的文件的时候会进行自动配置这里不用配置了。
示例代码:
2.applicationContext-dao.xml
此为spring管理dao层的配置文件。
1.连接数据库。(配置数据源,建立sqlSessionFactory在建立sqlSessionFactory中将mybatis的全局配置文件sqlMapConfig.xml)引入进去。
2.进行dao的扫描。通过spring来管理mapper
示例代码:
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 ,使用dacp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- sqlSessionFactory的配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件 -->
<property name="configLocation" value="/WEB-INF/classes/mybatis/sqlMapConfig.xml"></property>
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包名
如果扫描多个包,每个包中间使用半角逗号分隔
-->
<property name="basePackage" value="cn.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
dao层文件生成:
在一个包中生成mapper.java和mapper.xml文件
可以通过逆向工程自动生成。
二、整合service
1.定义service接口
public interface ItemsService {
//商品查询列表
public List<ItemsCustom>findItemsList(ItemsQueryVo itemsQueryVo)throws Exception;
}
2.定义接口实现类
public class ItemsServiceImpl implements ItemsService {
@Autowired
private ItemsMapperCustom itemsMapperCustom;
@Override
public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)
throws Exception {
// TODO Auto-generated method stub
return itemsMapperCustom.findItemsList(itemsQueryVo);
}
}
这里面要调用dao,即创建dao,即dao要自动注入。
3.在applicationContext-service.xml中管理service
<!-- 商品管理的service -->
<bean id="itemsService" class="cn.service.impl.ItemsServiceImpl"></bean>
4.事务管理 在applicationContext-transation.xml中进行事务管理
<!-- 事务管理器 对mybatis操作数据库事务控制,spring使用jdbc的事务控制器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 dataSource在applicationContext-dao中配置了 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="select*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* cn.service.impl.*.*(..))"
/>
</aop:config>
</beans>
三、整合springmvc
由于springmvc就是在spring的一部分,所以直接配置好springmvc就行了
配置springmvc就是配置前端控制器,处理映射器,适配器,视图解析器。
1.配置前端控制器(在web.xml中配置)
<!-- springMVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器,适配器等)
如果你不配置contextConfigLocation,则默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--
第一种:*.action.访问以.action结尾的由DispatcherServlet进行解析
第二种:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
使用这一种方法可以使用RESTful风格的url
第三种:/*,这样配置不对,使用这种配置,最终要 转发到一个jsp页面时,仍然由DispatcherServlet进行解析 ,根据jsp页面找不到handel,会报错
-->
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
2.配置处理映射器,适配器,视图解析器(springmvc.xml中配置)
<!-- 注解handler的配置 -->
<!-- 可单个配置也可扫描配置
<bean class="zhujieItemsController"/> -->
<!-- 组建扫描 ,扫描组建可以扫描controller、service-->
<context:component-scan base-package="cn.controller"></context:component-scan>
<!-- 配置注解映射器和适配器 -->
<!-- 注解映射器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
注解适配器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
-->
<!-- 使用mvc:annotation-driver代替上面的配置,
同时mvc:annotataion-driver默认加载了很多参数绑定方法
比如:json转换加载器会默认加载。 推荐使用。
-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置视图解析器
解析jsp默认使用jstl标签,calsspath下要有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 配置jsp路径的后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
3.编写handler(controller)
会用到service,要自动注入
@Autowired
private ItemsService itemsService;
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
//调用service查找商品库,查询商品列表io
ItemsQueryVo itemsQueryVo=new ItemsQueryVo();
List<ItemsCustom>itemsList=itemsService.findItemsList(null);
//返回ModelAndView
ModelAndView modelAndView=new ModelAndView();
//相当于request的setAtrribute,在jsp页面中通过itemsList中的数据
modelAndView.addObject("itemsList", itemsList);
//制定试图
//下边的路径,如果在视图解析器中配置jsp的前缀和jsp的后缀
//则路径原来为:“WEB-INF/jsp/items/itemsList.jsp”
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
四、加载spring容器
将管理上面的applicationContext加入到spring容器中
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>