1.概述
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架。
- Spring(业务层):核心思想是IOC(控制反转),即不再需要显式地 'new' 一个对象,而是让Spring框架帮你来完成这一切。
- SpringMVC(控制层&&表现层):SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作
- mybatis(持久层):mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
2.实现
- 项目结构
- 创建一个tbl_employee表,用来测试:
(1).导入以下依赖
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--配置spring的IOC容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring数据库模块-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring的web模块-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--JSTL部分-->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.1</version>
</dependency>
<!--面向切面编程-->
<dependency>
<groupId>net.sourceforge.cglib</groupId>
<artifactId>com.springsource.net.sf.cglib</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--运行依赖的日志-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mybatis与spring整合需要的适配包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
(2).创建一个JavaBean类Employee,属性有
private Integer id;
private String lastName;
private String email;
private String gender;
(3).EmployeeMapper接口中有一个方法,获取所有表中所有的员工信息
public List<Employee> getEmps();
与之对应的Sql语句的映射文件EmployeeMapper.xml:
<select id="getEmps" resultType="com.ls.bean.Employee">
select * from tbl_employee
</select>
全局配置文件mybatis-config.xml,开启驼峰命名法:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>>
</settings>
(4).前期准备做好之后,接下来写配置文件,重点来啦!!!!
- web.xml
<!--springIOC容器随web一起启动-->
<!--spring配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springMVC配置-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- springMVC的配置文件spring-servlet.xml,SpringMVC只控制网站的跳转逻辑,所以只扫描控制器:
<!--
use-default-filters="false":只扫描控制器
默认为true:则扫描所有的控制器
-->
<context:component-scan base-package="com.ls" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--处理动态资源-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--处理静态资源-->
<mvc:default-servlet-handler/>
- Spring的配置文件,applicationContext.xml,Spring管理所有的业务逻辑,扫描除了控制器以外的注解:
<context:component-scan base-package="com.ls">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--引入数据库的配置文件-->
<context:property-placeholder location="classpath:dbconfig.properties"/>
<!--Spring用来控制业务逻辑,数据源,事务控制,aop-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driver}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--spring的事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启基于注解的事务-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!--整合mybatis
目的:1.spring来管理所有组件,mapper的实现类
service==>Dao @Autowired:自动注入mapper
2.spring用来管理事务:spring声明式事务
-->
<!--创建SqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--指定全局配置文件的位置-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!--指定mapper配置文件的位置-->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!--扫描所有的mapper接口的实现,让这些mapper能够自动注入
base-package:指定mapper接口的包名
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ls.dao"/>
</bean>
(5).添加业务逻辑,实现业务:
index.jsp作为程序的入口,通过点击这个超链接跳转到另一个页面,从而获得所有的员工信息
- index.jsp:
<a href="emps">查询所有的员工</a>
- 业务层EmpService:
@Service
@Transactional
public class EmpService {
@Autowired
private EmployeeMapper employeeMapper;
public List<Employee> getEmp(){
return employeeMapper.getEmps();
}
}
- 表现层EmpController:
根据页面的地址进入控制器,通过调用业务层的方法,获取数据封装到map集合中,传给list.jsp页面
@Controller
public class EmpController {
@Autowired
EmpService empService;
@RequestMapping("/emps")
public String emp(Map<String,Object> map){
List<Employee> emps= empService.getEmp();
map.put("allEmps", emps);
return "list";
}
}
- list.jsp
使用jstl(c标签)获取数据:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<table border="1">
<tr>
<td>id</td>
<td>lastName</td>
<td>email</td>
<td>gender</td>
</tr>
<c:forEach items="${allEmps}" var="emps">
<tr>
<td>${emps.id }</td>
<td>${emps.lastName }</td>
<td>${emps.email }</td>
<td>${emps.gender }</td>
</tr>
</c:forEach>
</table>
3.效果
4.结束啦!