Spring MVC 整合 SSM(上)
1. 前言
本节课程将和大家讲解在 Spring MVC 项目中如何集成 MyBatis 。Mybatis 为 Spring MVC 项目提供了数据库访问能力,通过本次课程,你需要重点掌握集成的流程。本节课程通过一个登录小案例引出对 MyBatis 的使用。
2. 集成流程
要把 MyBatis 集成到 Spring MVC 项目中,首先要做的第一件事情,便是添加 MyBatis 依赖包。仅仅添加 MyBatis 依赖包还不够 ,因为 Spring MVC 并不直接支持 MyBatis,所以,需要借助于第三方的 mybatis-spring 插件包充当 MyBatis 和 Spring 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 核心模块之间的连接。