跳到主要内容

Spring MVC 整合 SSM(上)

1. 前言

本节课程将和大家讲解在 Spring MVC 项目中如何集成 MyBatisMybatisSpring MVC 项目提供了数据库访问能力,通过本次课程,你需要重点掌握集成的流程。本节课程通过一个登录小案例引出对 MyBatis 的使用。

2. 集成流程

要把 MyBatis 集成到 Spring MVC 项目中,首先要做的第一件事情,便是添加 MyBatis 依赖包。仅仅添加 MyBatis 依赖包还不够 ,因为 Spring MVC 并不直接支持 MyBatis,所以,需要借助于第三方的 mybatis-spring 插件包充当 MyBatisSpring MVC 之间的桥梁。

既然要连接到数据库,数据源是不能少的,本节课程使用 DBCP 做数据库连接池,使用 MySql 做台台数据存储系统。

2.1 添加依赖包

打开项目的 pom.xml 文件,在其中添加如下内容:

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 数据库驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.13.RELEASE</version>
<scope>compile</scope>
</dependency>

Tips:Spring MVC 连接数据库时,需要添加 spring-jdbc 依赖包。

2.2 注册组件

MyBatis 依赖 2 个很重要的核心组件:

  • SqlSessionFactory: 创建与数据库的连接,用来创建管理 SqlSession 组件;
  • SqlSession: 提供相关的数据库操作方法。

Spring MVC 项目添加的 mybatis-spring 依赖包中,提供了 2 个类似的组件。打开项目中的 RootConfig 类文件,在文件中添加如下的组件配置信息:

@Bean
public DataSource dataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/mystus");
basicDataSource.setUsername("root");
basicDataSource.setPassword("abc123");
// 其它与数据库连接池有关的配置
return basicDataSource;
}
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean SqlSessionFactory() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//注入数据源组件
sqlSessionFactoryBean.setDataSource(this.dataSource());
//指定 MyBatis 主配置文件的位置
Resource configResource=new ClassPathResource("com/hm/config/mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(configResource);
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer scannerConfigurer() {
//接口映射
MapperScannerConfigurer mapperScannerConfigurer=new MapperScannerConfigurer();
//依赖会话工厂
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
//指定扫描的 DAO 接口位置
mapperScannerConfigurer.setBasePackage("com.hm.web.dao");
return mapperScannerConfigurer;
}

解释一下上面的 3 个 Bean :

  • BasicDataSource: DBCP 提供的数据源连接对象;
  • SqlSessionFactoryBean: 用来替代 MyBatis 中的 SqlSessionFactory
  • MapperScannerConfigurer: 用来指定 MyBatis 映射器的位置。

Tips: Spring MVC 中集成 MyBatis 时,可以让 MyBatis 有自己独立的配置文件,也可以没有。但一般情况下,建议还是提供。如下面的代码。

Resource configResource=new ClassPathResource("com/hm/config/mybatis-config.xml");  
sqlSessionFactoryBean.setConfigLocation(configResource);

所以,需要创建一个 mybatis-config.xml 文件。

图片描述

3. 登录功能

做好了前面的基础配置后,现在实现登录功能。

登录功能的业务描述很简单:登录者输入个人的用户名和密码,发送请求到服务器,由服务器端的控制器从数据库中检查是否存在此登录者的信息。

所以,在完成登录功能之前,先在 MySQL 数据库中创建一张 user 表:

图片描述

3.1 创建登录页面

<h1>用户登录</h1>
<form action="user/login" method="post">
姓名:<input name="userLoginName" value="" type="text">
<br />
密码:<input name="userPassword" value="" type="password">
<br />
<input name="btnLogin" value="登录" type="submit">
<input name="btnRe" value="重置" type="reset">
</form>

Tips: 当使用者点击登录按钮,发送登录请求之前,可以在客户端使用 JS 验证数据格式的合法性。

既然是 OOP 编码,自然少不了构建用户类,此类的数据结构与用户表的表结构有对等关系。

public class User {
private Integer userId;
//登录名
private String userLoginName;
//真实姓名
private String userName;
private String userPassword;
}

3.2 创建映射器接口

MyBatis 是一个很有意思的地方,可以使用接口的方式映射对应的 SQL 语句,这个接口也叫映射器。

public interface UserMapper {
@Select("SELECT user_id userId,user_login_name userLoginName ,user_password userPassword
FROM user where user_login_name=#{userLoginName}")
public User getUser(String userLoginName);
}

SQL 语句可以使用 @select 等类似注解直接放置在映射器的方法之上。也可以把 SQL 语句存放在 XML 文件中。

如果 SQL 存放在 XML 中,官方文档有 2 点建议:

  • XML 的文件名最好保持和映射器接口同名,如 UserMapper.xml
  • 文件建议放在 UserMapper 接口所在的包中。MyBatis 能根据接口位置自动找到 XML 文件。

UserMapper.xml 内容如下面所示:

<mapper namespace="com.mk.web.dao.UserMapper">
<select id="getUser">
SELECT user_id userId,user_login_name userLoginName ,user_password userPassword
FROM user where user_login_name=#{userLoginName}
</select>
</mapper>

Tips: 建议大家使用 MyBatis 时,SQL 语句保存在 XML 文件中。SQL 语句放置在接口之上,SQL 语法和 JAVA 语法混合在一起,不便于维护。XML 文件的命名和位置最好采用官方建议的,如此,不用再做过多设置,MyBatis 就可以找到 XML 文件。

3.3 测试

创建处理登录请求的控制器:

@Autowired
private UserMapper UserMapper;

@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(User user,ModelMap map) {
String pwd=user.getUserPassword();
user= this.UserMapper.getUser(user.getUserLoginName());
if(user!=null) {
if (user.getUserPassword().equals(pwd)) {
map.addAttribute("loginUser", user);
return "index";
}
}
return "fail";
}

打开浏览器,进入登录页面。

图片描述

点击登录后,进入控制器,验证当前登录者的身份,验证通过,进入成功页面,验证不通过,进入失败页面。

3. 小结

本章节和大家一起讲解了在 Spring MVC 项目中如何使用 MyBatis JDBC 框架。整个过程和单独使用 MyBatis 没有什么太多不同。差异在于,需要引入一个中间模块,作为 MyBatis 和 Spring MVC 之间的桥梁。 引入的中间模块提供有专用于 Sprig MVC 项目的 2 大组件:

  • SqlSessionFactoryBean;
  • MapperScannerConfigurer。

利用这 2 大组件便能在 Spring MVC 中构建起和 MyBatis 核心模块之间的连接。