前言
前面已经介绍 Spring 和 Mybatis 整合 https://ddnd.cn/2018/12/01/Spring-Mybatis/ , 而本篇介绍在 IDEA 下 Spring,Spring MVC,Mybatis(SSM)三个框架的整合, 在阅读本篇之前, 建议大家先去了解一下 Spring,Spring MVC,Mybatis(三大框架基础入门传送门 https://ddnd.cn/categories/ ), 会达到事半功倍的效果. 至于 Spring MVC 相对于 Servlet,JSP 的优点这里就不累赘了, 大家可以上网查阅相关资料. 本篇注重整合思路, 整合过程以及整合过程中出现的坑.
项目目录
添加依赖包
- pom.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>ddnd</groupId>
- <artifactId>ddnd</artifactId>
- <version>1.0-SNAPSHOT</version>
- <properties>
- <!-- spring 版本号 -->
- <spring.version>4.2.5.RELEASE</spring.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.4.6</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.3.2</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.13</version>
- </dependency>
- <!-- 添加 spring 核心依赖 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</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-oxm</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>org.springframework</groupId>
- <artifactId>spring-webmvc</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-context-support</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring.version}</version>
- </dependency>
- </dependencies>
- </project>
创建数据库和数据表
本文中使用 MySQL, 为了演示方便, 仅创建个简单的数据库 spring, 还有数据表 user. 数据表创建 SQL 代码.
CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=240 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
新建数据库对应的实体类
为了实现与数据库中的 user 表进行关系映射, 这里新建一个 User 类: User.java
package cn.ddnd.www.Entity; public class User { int id; String email; String password; public void setId(int id) { this.id = id; } public int getId() { return id; } public void setPassword(String password) { this.password = password; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public String getEmail() { return email; } }
新建 Mapper.xml 文件和 Mapper 接口(Dao 层)
这里注意 Mapper.xml 文件名要和 Mapper 接口的名字相同
1.Mapper 接口: UserDao.java
package cn.ddnd.www.Dao; import cn.ddnd.www.Entity.User; public interface UserDao { public User getUserByEmail(String email); }
这里为了测试, 仅编写一个接口, 即通过用户 email 查询到用户的信息.
Mapper.xml 文件: UserDao.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.ddnd.www.Dao.UserDao"> <select id="getUserByEmail" resultType="User"> select * from user where email = #{email} </select> </mapper>
这里需要注意用一下: 我们使用的是 IDEA, 而 IDEA 默认是不编译 main/src/java 目录下的 xml 文件的, 即在编译的时候不会把将这些 xml 一块打包进 classes 文件, 而是直接丢弃. 为了解决这个问题, 有两种方法, 1. 将 xml 文件都放到 resources 目录下. 2. 配置 maven 的 pom 文件. 这里我就用第一种方法, 将 mapper.xml 文件都放到 resources 目录.
Mybatis 配置文件
Mybatis-config.xml <?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> <typeAliases> <typeAlias type="cn.ddnd.www.Entity.User" alias="User"></typeAlias> </typeAliases> </configuration>
这里为 cn.ddnd.www.Entity.User 这个类设置个 User 的别名, 这样直接使用 User 即可使用 cn.ddnd.www.Entity.User 这个类.
Spring MVC 配置文件
Spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value=""></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
这里配置个 InternalResourceViewResolver 解析器, prefix 属性指定资源文件的前缀, 因为我的资源文件就放在 Web 目录下, 所以我这个属性留空, suffix 属性配置资源页面的后缀.
Spring 配置文件
前面配置完 Mybatis 是不是觉得配置的代码很少, 很简单? 这是因为 Mybatis 的一些配置都放在 Spring 中配置啦! 接下来看我们 Spring 的配置文件. applicationContext.xml
<?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" 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"> <context:component-scan base-package="cn.ddnd.www"></context:component-scan> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring?serverTimezone=GMT+8"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- 配置 Mybatis 的 SqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入连接池数据源配置 --> <property name="dataSource" ref="dataSource"></property> <!-- 注入 mybatis 配置信息 注意加上 classpath 不然编译出来后是找不到 Mybatis-config.xml 的文件的 --> <property name="configLocation" value="classpath:Mybatis-config.xml"></property> <!--mapper.xml 和 mapper.java 不在同一个目录 则配置此参数 --> <property name="mapperLocations" value="classpath:mapper/*.xml"></property> </bean> <!-- 配置 Mybatis 的 Mapper 映射器 这个是指定接口配置 --> <!--<bean id="userBean" class="org.mybatis.spring.mapper.MapperFactoryBean">--> <!--SqlSessionFactory 是用来指定生成实现 SqlSession 接口的 SqlSessionTemplate 对象的 --> <!--<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>--> <!--mapperInterface 指定我们 Mapper 对应的接口 --> <!--<property name="mapperInterface" value="cn.ddnd.www.Dao.UserDaoao"></property>--> <!--</bean>--> <!-- 扫描 Mapper 接口并注册为 Bean 这个是通过扫描包来配置 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.ddnd.www.Dao" /> </bean> </beans>
在 applicationContext 配置了 Mybatis 的数据源, SqlSessionFactory,Mapper 映射器, 为了简便我们选择用扫描包的方式注册. 这里需要注意一下几点:
添加 mapperLocations 属性: 因为我们把 Mapper.xml 文件和 Mapper 接口放在了不同的目录下, 所以我们需要在配置 Mybatis 的 SqlSessionFactory 时候添加一个属性 mapperLocations, 即指定 mapper.xml 文件的路径.
启动扫描 JavaBean:
<context:component-scan base-package="cn.ddnd.www"></context:component-scan>
扫描指定包下的所有 JavaBean,
添加 xml 命名空间:
xmlns:context="http://www.springframework.org/schema/context" , xsi:schemaLocation="http://www.springframework.org/schema/context
, 不然会出现通配符的匹配很全面, 但无法找到元素'context:component-scan' 的声明的问题.
路径前添加 classpath: 在指定 xml 路径的时候, 需要以
classpath: 文件路径
的形式, 不然会出现 xml 文件找不到的问题, 因为工程编译后 xml 文件都是放在 classes 的文件夹下.
编写 Service 层
虽然前面已经编写了 Dao 层 (UserDao) 了, 但是 Dao 层的工作主要是做数据持久化的, 而 Service 层则负责业务模块的逻辑应用设计, Service 调用已定义的 Dao 层的接口实现数据的持久化.
package cn.ddnd.www.Service; import cn.ddnd.www.Dao.UserDao; import cn.ddnd.www.Entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class Uservice { @Autowired UserDao userDao; public User getUserByEmail(String email) { return userDao.getUserByEmail(email); } }
编写 Controller 层
package cn.ddnd.www.Controller; import cn.ddnd.www.Entity.User; import cn.ddnd.www.Service.Uservice; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.Web.bind.annotation.RequestMapping; import org.springframework.Web.servlet.ModelAndView; @Controller public class IndexController { @Autowired Uservice uservice; @RequestMapping(value = "/") public ModelAndView Index(){ User user; user = uservice.getUserByEmail("xue8@ddnd.cn"); return new ModelAndView("index", "user", user); } }
这里自动装配 Service 层的 Uservice, 实现数据查询, 查询结果将在 View 层显示. 这里为了方便, 默认查询 email 为 xue8@ddnd.cn 的用户信息.
编写 View 层
<%-- Created by IntelliJ IDEA. User: xueba Date: 2018/11/29 Time: 17:34 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <HTML> <head> <title>SSM 整合</title> </head> <body> email:${user.email} <br> id:${user.id} <br> password:${user.password} <br> </body> </HTML>
将查询出来的用户信息显示出来.
配置 Web.xml
<?xml version="1.0" encoding="UTF-8"?> <Web-App xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>Spring</servlet-name> <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Spring</servlet-name> <url-pattern></url-pattern> </servlet-mapping> </Web-App>
在 Web.xml 中配置前端控制器 DispatcherServlet, 负责发送每个请求到合适的处理程序.
运行测试
源码下载: SSM 整合例子 https://github.com/xue8/Java-Demo/tree/master/SSM
来源: https://juejin.im/post/5c1621a051882545e24f01dd