ssm整合(springMVC+spring+MyBatis)
三层:表现层(springMVC)、业务层(spring)、持久层(MyBatis)
核心思想:用spring整合springMVC和MyBatis两个框架
创建项目的时候要确认每一个组件都是可以使用的,可以利用测试的方式来测试这个框架是否可以使用
开始整合
思路
1.测试业务层(SpringMVC)
2.测试表现层(Spring)
3.整合持久层(MyBatis)
案例
1.新建一个maven项目,并导入所需要的各种约束
添加org.apche.maven.archetypes:maven-archetype-webapp属性
然后添加pom.xml中坐标,并固定版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>8.0.15</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!--容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!--el表达式-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency> <!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
2.测试业务层,通过一个测试文件,来测试spring框架是否正常
配置spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启扫描注解-->
<context:component-scan base-package="cn.henhaochi">
<!--某些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!--仅扫描某些注解-->
<!--<context:include-filter type="annotation" expression=""/>-->
</context:component-scan>
</beans>
新建一个xxxserver.java文件,需要添加注解@Service(value = “accountService”),在文件中创建一个test方法
然后再新建一个测试文件
@Test
public void run1() {
//加载配置文件
ApplicationContext aContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取对象
AccountService aService = (AccountService) aContext.getBean("accountService");
//调用方法
aService.findAllAccount();
}
3.测试表现层
新建一个SpringMVC的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="cn.henhaochi.controller"/>
<!--视图解析器,即配置前后缀-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--解析前缀-->
<property name="prefix" value="/pages/"/>
<!--解析后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源-->
<mvc:resources mapping="/image/**" location="/image/"/>
<!--开启SpringMVC-->
<mvc:annotation-driven/>
</beans>
然后通过一个jsp页面中的一个超链接,连接到Controller文件的对应方法中;在输出台可以看到响应的值,代表成功
4.整合持久层
注意:处理查询都是需要添加事务的
创建mybatis-config.xml文件,用来配置MyBatis的相关配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 别名定义 -->
<typeAliases>
<package name="cn.henhaochi.domain"/>
</typeAliases>
</configuration>
在Spring的配置文件中配置MyBatis部分
<!--整合MyBaits-->
<!-- 读取db.properties -->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 扫描entity包 使用别名 -->
<!--<property name="typeAliasesPackage" value="com.moy..test.entity"/>-->
<!-- 扫描sql配置文件:mapper需要的xml文件,默认位置在resources/下 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--配置mapper扫描器-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.henhaochi.mapper"/>
</bean>
<!--配置spring框架声明事务管理-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--引入连接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务通知,引入事务管理器-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--find开头的只读,还可以设置隔离级别-->
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--配置aop增强-->
<aop:config>
<!--引入事务通知-->
<!--execution(public(可省略) *(返回类型) 需要增强aop的方法)-->
<!--cn.henhaochi.service.impl.*ServiceImpl.*(..))代表impl包下的所有以 ServiceImpl结尾的类中,任意个参数的方法-->
<aop:advisor advice-ref="txAdvice" pointcut="execution(public * cn.henhaochi.service.impl.*ServiceImpl.*(..))"/>
</aop:config>
创建xxxDao/xxxMapper的对应.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.henhaochi.dao.AccountDao">
<select id="findAllAccount" resultType="cn.henhaochi.domain.Account">
SELECT * FROM account
</select>
<insert id="saveAccount" parameterType="cn.henhaochi.domain.Account">
INSERT INTO account (`name`, `money`) VALUES (#{name}, #{money});
</insert>
</mapper>