SSM框架——詳細整合教程(Spring+SpringMVC+MyBatis)
最近在學習Spring+SpringMVC+MyBatis的整合。以下是參考網上的資料自己實踐操作的詳細步驟。
1、基本概念
1.1、Spring
Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的複雜性而建立的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
1.2、SpringMVC
Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。Spring MVC 分離了控制器、模型物件、分派器以及處理程式物件的角色,這種分離讓它們更容易進行定製。
1.3、MyBatis
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
2、開發環境搭建以及建立Maven Web專案
參看之前的博文: https://jq.qq.com/?_wv=1027&k=5S094Ug
3、SSM整合
下面主要介紹三大框架的整合,至於環境的搭建以及專案的建立,參看上面的博文。這次整合我分了2個配置檔案,分別是spring-mybatis.xml,包含spring和mybatis的配置檔案,還有個是spring-mvc的配置檔案,此外有2個資原始檔:jdbc.propertis和log4j.properties。完整目錄結構如下(最後附上原始碼下載地址):

使用框架的版本:
Spring 4.0.2 RELEASE
Spring MVC 4.0.2 RELEASE
MyBatis 3.2.6
3.1、Maven引入需要的JAR包
在pom.xml中引入jar包
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
com.javen.maven01
maven01
war
0.0.1-SNAPSHOT
maven01 Maven Webapp
http://maven.apache.org
4.0.2.RELEASE
3.2.6
1.7.7
1.2.17
junit
junit
3.8.1
test
javax.servlet
javax.servlet-api
3.1.0
-->
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
javax
javaee-api
7.0
mysql
mysql-connector-java
5.1.36
commons-dbcp
commons-dbcp
1.2.2
jstl
jstl
1.2
log4j
log4j
${log4j.version}
com.alibaba
fastjson
1.1.41
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.13
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
maven01
org.eclipse.jetty
jetty-maven-plugin
9.2.8.v20150217
80
shutdown
9966
3.2、整合SpringMVC
3.2.1、配置spring-mvc.xml
配置裡面的註釋也很詳細,主要是自動掃描控制器,檢視模式,註解的啟動這三個。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
text/html;charset=UTF-8
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
3.2.2、配置web.xml檔案
配置的spring-mvc的Servlet就是為了完成SpringMVC+MAVEN的整合。
web.xml
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
Archetype Created Web Application
contextConfigLocation
classpath:spring-mybatis.xml
-->
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
-->
org.springframework.web.util.IntrospectorCleanupListener
-->
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
/
/index.jsp
3.2.3、Log4j的配置
為了方便除錯,一般都會使用日誌來輸出資訊,Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。
Log4j的配置很簡單,而且也是通用的,下面給出一個基本的配置,換到其他專案中也無需做多大的調整,如果想做調整或者想了解Log4j的各種配置,參看我轉載的一篇博文,很詳細:http://blog.csdn.net/zhshulin/article/details/37937365
下面給出配置檔案目錄:

log4j.properties
log4j.rootLogger=INFO,Console,File
#定義日誌輸出目的地為控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以靈活地指定日誌輸出格式,下面一行是指定具體的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#檔案大小到達指定尺寸的時候產生一個新的檔案
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定輸出目錄
log4j.appender.File.File = logs/ssm.log
#定義檔案最大大小
log4j.appender.File.MaxFileSize = 10MB
# 輸出所以日誌,如果換成DEBUG表示輸出DEBUG以上級別日誌
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n
3.2.4、使用Jetty測試

package com.javen.model;
public class User {
private Integer id;
private String userName;
private String password;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName == null ? null : userName.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password="
+ password + ", age=" + age + "]";
}
java高階架構群:702895903
}
package com.javen.controller;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.javen.model.User;
@Controller
@RequestMapping("/user")
// /user/**
public class UserController {
private static Logger log=LoggerFactory.getLogger(UserController.class);
// /user/test?id=1
@RequestMapping(value="/test",method=RequestMethod.GET)
public String test(HttpServletRequest request,Model model){
int userId = Integer.parseInt(request.getParameter("id"));
System.out.println("userId:"+userId);
User user=null;
if (userId==1) {
user = new User();
user.setAge(11);
user.setId(1);
user.setPassword("123");
user.setUserName("javen");
}
log.debug(user.toString());
model.addAttribute("user", user);
return "index";
}
}


在瀏覽器中輸入:http://localhost/user/test?id=1

到此 SpringMVC+Maven 整合完畢
3.3 Spring與MyBatis的整合
取消 3.2.2 web.xml中註釋的程式碼
3.3.1、建立JDBC屬性檔案
jdbc.properties(檔案編碼修改為utf-8)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/maven
username=root
password=root
#定義初始連線數
initialSize=0
#定義最大連線數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000
此時的目錄結構為

3.3.2、建立spring-mybatis.xml配置檔案
這個檔案就是用來完成spring和mybatis的整合的。這裡面也沒多少行配置,主要的就是自動掃描,自動注入,配置資料庫。註釋也很詳細,大家看看就明白了。
spring-mybatis.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
destroy-method="close">
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
3.4、JUnit測試
經過以上步驟,我們已經完成了Spring和mybatis的整合,這樣我們就可以編寫一段測試程式碼來試試是否成功了。
3.4.1、建立測試用表
既然我們需要測試,那麼我們就需要建立在資料庫中建立一個測試表,這個表建的很簡單,SQL語句為:
-- ----------------------------
-- Table structure for `user_t`
-- ----------------------------
DROP TABLE IF EXISTS `user_t`;
CREATE TABLE `user_t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(40) NOT NULL,
`password` varchar(255) NOT NULL,
`age` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_t
-- ----------------------------
INSERT INTO `user_t` VALUES ('1', '測試', '345', '24');
INSERT INTO `user_t` VALUES ('2', 'javen', '123', '10');
3.4.2、利用MyBatis Generator自動建立程式碼
參考博文:關注我:私信回覆“進群”
這個可根據表自動建立實體類、MyBatis對映檔案以及DAO介面,當然,我習慣將生成的介面名改為IUserDao,而不是直接用它生成的UserMapper。如果不想麻煩就可以不改。完成後將檔案複製到工程中。如圖:

3.4.3、建立Service介面和實現類

下面給出具體的內容:
IUserService.jave
package com.javen.service;
import com.javen.model.User;
public interface IUserService {
public User getUserById(int userId);
}
UserServiceImpl.java
package com.javen.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.javen.dao.IUserDao;
import com.javen.model.User;
import com.javen.service.IUserService;
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
private IUserDao userDao;
public User getUserById(int userId) {
// TODO Auto-generated method stub
return this.userDao.selectByPrimaryKey(userId);
}
}
3.4.4、建立測試類
測試類在src/test/java中建立,下面測試類中註釋掉的部分是不使用Spring時,一般情況下的一種測試方法;如果使用了Spring那麼就可以使用註解的方式來引入配置檔案和類,然後再將service介面物件注入,就可以進行測試了。
如果測試成功,表示Spring和Mybatis已經整合成功了。輸出資訊使用的是Log4j列印到控制檯。
package com.javen.testmybatis;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.fastjson.JSON;
import com.javen.model.User;
import com.javen.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class) //表示繼承了SpringJUnit4ClassRunner類
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class TestMyBatis {
private static Logger logger = Logger.getLogger(TestMyBatis.class);
// private ApplicationContext ac = null;
@Resource
private IUserService userService = null;
// @Before
// public void before() {
// ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// userService = (IUserService) ac.getBean("userService");
// }
@Test
public void test1() {
User user = userService.getUserById(1);
// System.out.println(user.getUserName());
// logger.info("值:"+user.getUserName());
logger.info(JSON.toJSONString(user));
}
}
測試結果

3.4.5、建立UserController類
UserController.java 控制器
package com.javen.controller;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.javen.model.User;
import com.javen.service.IUserService;
@Controller
@RequestMapping("/user")
// /user/**
public class UserController {
private static Logger log=LoggerFactory.getLogger(UserController.class);
@Resource
private IUserService userService;
// /user/test?id=1
@RequestMapping(value="/test",method=RequestMethod.GET)
public String test(HttpServletRequest request,Model model){
int userId = Integer.parseInt(request.getParameter("id"));
System.out.println("userId:"+userId);
User user=null;
if (userId==1) {
user = new User();
user.setAge(11);
user.setId(1);
user.setPassword("123");
user.setUserName("javen");
}
log.debug(user.toString());
model.addAttribute("user", user);
return "index";
}
// /user/showUser?id=1
@RequestMapping(value="/showUser",method=RequestMethod.GET)
public String toIndex(HttpServletRequest request,Model model){
int userId = Integer.parseInt(request.getParameter("id"));
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.debug(user.toString());
model.addAttribute("user", user);
return "showUser";
}
// /user/showUser2?id=1
@RequestMapping(value="/showUser2",method=RequestMethod.GET)
public String toIndex2(@RequestParam("id") String id,Model model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.debug(user.toString());
model.addAttribute("user", user);
return "showUser";
}
// /user/showUser3/{id}
@RequestMapping(value="/showUser3/{id}",method=RequestMethod.GET)
public String toIndex3(@PathVariable("id")String id,Map model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.debug(user.toString());
model.put("user", user);
return "showUser";
}
// /user/{id}
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public @ResponseBody User getUserInJson(@PathVariable String id,Map model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.info(user.toString());
return user;
}
// /user/{id}
@RequestMapping(value="/jsontype/{id}",method=RequestMethod.GET)
public ResponseEntity getUserInJson2(@PathVariable String id,Map model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.info(user.toString());
return new ResponseEntity(user,HttpStatus.OK);
}
//檔案上傳、
@RequestMapping(value="/upload")
public String showUploadPage(){
return "user_admin/file";
}
@RequestMapping(value="/doUpload",method=RequestMethod.POST)
public String doUploadFile(@RequestParam("file")MultipartFile file) throws IOException{
if (!file.isEmpty()) {
log.info("Process file:{}",file.getOriginalFilename());
}
FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:\",System.currentTimeMillis()+file.getOriginalFilename()));
return "succes";
}
}
3.4.6、新建jsp頁面
file.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
上傳檔案
index.jsp
Hello World!
showUser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
測試
${user.userName}
至此,完成Spring+SpingMVC+mybatis這三大框架整合完成。
3.4.7、部署專案
輸入地址:http://localhost/user/jsontype/2

專案下載地址:https://jq.qq.com/?_wv=1027&k=5S094Ug