用SSM框架已经有一段时间了,但都没有完整地搭建过一次工程。前段时间比较有时间就自己试着搭建了一下,差不多都是用的最新的spring版本了,然后就在这个基础上做了很多的实验测试。最近想着还是记录一下整个搭建的过程,以便于自己日后参考。所以就重新翻新了一下,为了写得尽可能地详细点所以内容有点多。
GitHub的源码地址:SSMDemo GitHub源码
我是用的idea这个软件搭建的,我也一直使用的这个软件,非常好用,很适合做Java的朋友。
1.创建一个maven的web工程。
为了方便我尽可能地上截图了。
创建maven的web工程
项目名称
配置maven
上面的操作就完成了创建工程的基本操作了。
2.创建工程的包结构
创建好各层的测试类和常规的配置文件
整个工程的包结构就创建完成了。
3.导包,这是非常重要的一步,需要将我们使用的spring、springMVC和MyBatis的相关包都导进来,直接使用maven依赖。
直接上pom.xml的源码:
4.0.0
com.viking.SSDemo
SSMDemo
1.0-SNAPSHOT
war
SSMDemo Maven Webapp
http://www.example.com
5.0.0.RELEASE
3.4.5
1.7.25
1.2.17
junit
junit
4.11
test
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}
test
org.mybatis
mybatis
${mybatis.version}
com.github.pagehelper
pagehelper
4.1.6
tk.mybatis
mapper
3.3.8
org.mybatis
mybatis-spring
1.3.1
javax
javaee-api
8.0
provided
mysql
mysql-connector-java
5.1.39
commons-dbcp
commons-dbcp
1.4
jstl
jstl
1.2
log4j
log4j
${log4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.slf4j
slf4j-api
${slf4j.version}
com.alibaba
fastjson
1.2.42
org.codehaus.jackson
jackson-mapper-asl
1.9.13
commons-fileupload
commons-fileupload
1.3.3
commons-io
commons-io
2.6
commons-codec
commons-codec
1.11
SSMDemo
maven-clean-plugin
3.0.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.7.0
maven-surefire-plugin
2.20.1
maven-war-plugin
3.2.0
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
然后等待idea自动下载一堆jar的包,如果没有自动下载的可以点这里:
所有的包下载完成后控制台会有提示的。
*4.配置spring、spring和MyBatis的整合配置文件,最重要的一步也是最麻烦的一步同样也是最难的一步。不过不要怕,我们一步一步慢慢来。
这里内容有点多,就不多说啥了,直接粘代码,需要的复制过去就OK了。
spring-mybatis.xml文件源码:
spring-mvc.xml源码:
application/json;charset=UTF-8
WriteDateUseDateFormat
QuoteFieldNames
text/html;charset=UTF-8
web.xml文件也是需要配置的,源码如下:
Archetype Created Web Application
contextConfigLocation
classpath:/config/spring-mybatis.xml
log4jConfigLocation
classpath:config/log4j.properties
log4jRefreshInterval
60000
SpringEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
SpringEncodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
spring
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:config/spring-mvc.xml
1
spring
/
log4j相信大家都不陌生,在项目中我们常常会用到日志,因此非常有必要配置一下日志信息。
log4j.properties源码如下:
log4j.rootLogger = DEBUG,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 = %5p %d %C: %m%n
#每天打印一个日志文件
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File=E:/logs/SSMDemo.log
log4j.appender.File.Encoding=UTF-8
#打印所有级别的日志信息
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =%d{ABSOLUTE} %5p %c{1}\:%L - %m%n
log4j.logger.com.opensymphony=ERROR
log4j.logger.org.springframework=ERROR
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.PreparedStatement=INFO
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Statement=INFO
jdbc也是必不可少的一部分,毕竟数据都是来源于数据库的嘛。
jdbc.properties源码如下:
#开发环境
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydatabase_test
jdbc.user=your username
jdbc.password=your password
到这里我们的配置文件就算说完了(当然这是最基础的需要,SSM的功能十分强大,还可以嵌入很多很多的功能...)
5.依葫芦画瓢,编写各层的功能类即可,controller层主要写http请求的接口方法,service主要写各种业务操作算法等,mapper层也可以称为dao层(我的习惯是写成mapper层)主要是写映射到数据库的方法接口,**Mapper.xml文件主要是写mapper层中的接口功能的SQL语句实现。这样的分层管理应该可以兼容各种大大小小的项目了。
下面也贴上我的工程中各层的测试代码。
model实体类:
package com.ssm.model;
/**
* created by viking on 2018/07/04
* user实体类
*/
public class User {
private int id;
private String name;
private int age;
private String sex;
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
controller层:
package com.ssm.controller;
import com.ssm.model.User;
import com.ssm.service.UserService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* created by viking on 2018/07/04
* controller层接口类
*/
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
Logger log = Logger.getLogger(UserController.class);
@RequestMapping("select")
@ResponseBody
public Object userTest(int id){
System.out.println("测试成功~~"+id);
List user = userService.getUser(id);
System.out.println(user.toString());
log.info(user);
return user;
}
@RequestMapping("addUser")
public Object insertUser(int id,String name,int age,String sex){
userService.insertUser(id,name,age,sex);
return "OK";
}
@RequestMapping("selectAll")
public Object selectAll(){
return userService.selectAll();
}
@RequestMapping("update")
public Object update(){
return userService.update();
}
}
service层(service层一般都是比较复杂的,因此我习惯分成接口和实现类两部分)接口:
package com.ssm.service;
import com.ssm.model.User;
import java.util.List;
/**
* created by viking on 2018/07/04
* 业务层接口
*/
public interface UserService {
List getUser(int id);
void insertUser(int id, String name, int age, String sex);
List selectAll();
Object update();
}
service层实现类:
package com.ssm.service.impl;
import com.ssm.mapper.UserMapper;
import com.ssm.model.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* created by viking on 2018/07/04
* 业务层接口实现类
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public List getUser(int id) {
Map map = new HashMap();
map.put("id",id);
return userMapper.getUser(map);
}
public void insertUser(int id, String name, int age, String sex) {
Map param = new HashMap();
param.put("id",id);param.put("name",name);
param.put("age",age);param.put("sex",sex);
userMapper.insertUser(param);
}
public List selectAll() {
return userMapper.selectAll();
}
public Object update() {
Map param = new HashMap();
param.put("total",10);
param.put("name","测试一");
userMapper.update(param);
return "OK";
}
}
mapper层(dao层)接口:
package com.ssm.mapper;
import com.ssm.model.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* created by viking on 2018/07/04
* dao层接口
*/
public interface UserMapper {
List getUser(@Param("param") Map map);
void insertUser(@Param("param") Map param);
List selectAll();
void update(@Param("param") Map param);
}
**Mapper.xml MaBatsis映射文件配置文件,相当于mapper层接口的实现类了:
INSERT INTO user (id,name,age,sex) values(#{param.id},#{param.name},#{param.age},#{param.sex})
UPDATE USER SET id=id-#{param.total},age=age+#{param.total}
WHERE name=#{param.name}
为了方便大家拷下代码后可以直接启动,我把数据库的sql语句和数据也贴上,我用的是mysql数据库:
/*
Navicat MySQL Data Transfer
Source Server : mysql
Source Server Version : 50173
Source Host : localhost:3306
Source Database : mydatabase_test
Target Server Type : MYSQL
Target Server Version : 50173
File Encoding : 65001
Date: 2018-06-15 15:41:23
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('2', '测试二', '22', '男');
INSERT INTO `user` VALUES ('3', '小二郎', '18', '男');
INSERT INTO `user` VALUES ('4', '二郎', '18', '男');
INSERT INTO `user` VALUES ('5', '马英', '26', '女');
INSERT INTO `user` VALUES ('6', '王尼玛', '30', '男');
INSERT INTO `user` VALUES ('7', '张三疯', '109', '男');
INSERT INTO `user` VALUES ('8', '欧阳翻天', '76', '女');
INSERT INTO `user` VALUES ('9', '上官', '16', '女');
INSERT INTO `user` VALUES ('10', '李响', '30', '男');
INSERT INTO `user` VALUES ('11', '测试一', '0', '女');
我本地的数据库表结构截图:
到这里就完全结束了,整个工程就可以直接运行了。
6.顺带提一下在idea中配置tomcat的过程(懂的朋友可以直接忽略~)
配置好了之后再将tomcat添加到server中:
好了~tomcat的配置也完成了。
7.下面贴上我的本机运行效果图:
tomcat成功启动:
通过浏览器访问localhost:
再测试下我们的SSM工程里测试类的正常工作截图:
控制台的输出和日志信息:
该有的输出都是正常的,再看一下我们保存到本地的日志文件:
成功地保存了我们工程的输出日志。
一晚上坚持一口气写完整个日志,到这里终于完美地结束了,如果大家觉得在下写的记录有帮助,可以给下支持和订阅哦!
附上GitHub的源码地址:SSMDemo GitHub源码
如果有不对的地方,欢迎各位大佬指教,如果有不懂的地方,也欢迎大家留言,我们一起讨论。