Spring MVC 整合 SSM(上)
1. 前言
本節(jié)課程將和大家講解在 Spring MVC 項目中如何集成 MyBatis 。Mybatis 為 Spring MVC 項目提供了數(shù)據(jù)庫訪問能力,通過本次課程,你需要重點掌握集成的流程。本節(jié)課程通過一個登錄小案例引出對 MyBatis 的使用。
2. 集成流程
要把 MyBatis 集成到 Spring MVC 項目中,首先要做的第一件事情,便是添加 MyBatis 依賴包。僅僅添加 MyBatis 依賴包還不夠 ,因為 Spring MVC 并不直接支持 MyBatis,所以,需要借助于第三方的 mybatis-spring 插件包充當 MyBatis 和 Spring MVC 之間的橋梁。
既然要連接到數(shù)據(jù)庫,數(shù)據(jù)源是不能少的,本節(jié)課程使用 DBCP 做數(shù)據(jù)庫連接池,使用 MySql 做臺臺數(shù)據(jù)存儲系統(tǒng)。
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>
<!-- 數(shù)據(jù)庫驅動包 -->
<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 連接數(shù)據(jù)庫時,需要添加 spring-jdbc 依賴包。
2.2 注冊組件
MyBatis 依賴 2 個很重要的核心組件:
- SqlSessionFactory: 創(chuàng)建與數(shù)據(jù)庫的連接,用來創(chuàng)建管理 SqlSession 組件;
- SqlSession: 提供相關的數(shù)據(jù)庫操作方法。
為 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");
// 其它與數(shù)據(jù)庫連接池有關的配置
return basicDataSource;
}
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean SqlSessionFactory() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//注入數(shù)據(jù)源組件
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 提供的數(shù)據(jù)源連接對象;
- SqlSessionFactoryBean: 用來替代 MyBatis 中的 SqlSessionFactory;
- MapperScannerConfigurer: 用來指定 MyBatis 映射器的位置。
Tips: Spring MVC 中集成 MyBatis 時,可以讓 MyBatis 有自己獨立的配置文件,也可以沒有。但一般情況下,建議還是提供。如下面的代碼。
Resource configResource=new ClassPathResource("com/hm/config/mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(configResource);
所以,需要創(chuàng)建一個 mybatis-config.xml 文件。
3. 登錄功能
做好了前面的基礎配置后,現(xiàn)在實現(xiàn)登錄功能。
登錄功能的業(yè)務描述很簡單:登錄者輸入個人的用戶名和密碼,發(fā)送請求到服務器,由服務器端的控制器從數(shù)據(jù)庫中檢查是否存在此登錄者的信息。
所以,在完成登錄功能之前,先在 MySQL 數(shù)據(jù)庫中創(chuàng)建一張 user 表:
3.1 創(chuàng)建登錄頁面
<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: 當使用者點擊登錄按鈕,發(fā)送登錄請求之前,可以在客戶端使用 JS 驗證數(shù)據(jù)格式的合法性。
既然是 OOP 編碼,自然少不了構建用戶類,此類的數(shù)據(jù)結構與用戶表的表結構有對等關系。
public class User {
private Integer userId;
//登錄名
private String userLoginName;
//真實姓名
private String userName;
private String userPassword;
}
3.2 創(chuàng)建映射器接口
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 能根據(jù)接口位置自動找到 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 測試
創(chuàng)建處理登錄請求的控制器:
@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. 小結
本章節(jié)和大家一起講解了在 Spring MVC 項目中如何使用 MyBatis JDBC 框架。整個過程和單獨使用 MyBatis 沒有什么太多不同。差異在于,需要引入一個中間模塊,作為 MyBatis 和 Spring MVC 之間的橋梁。 引入的中間模塊提供有專用于 Sprig MVC 項目的 2 大組件:
- SqlSessionFactoryBean;
- MapperScannerConfigurer。
利用這 2 大組件便能在 Spring MVC 中構建起和 MyBatis 核心模塊之間的連接。