各位童鞋,本文主要搭建SSM框架(Spring,SpringMVC,MyBatic),希望能帮助到刚刚学习这些框架的小伙伴,以及能够直接上手实现业务,代码中都做了详细的说明。废话不多说,下面直接进入主题(文末会附上源码地址)
目录
一 创建Maven项目
博主这里用的是IDEA创建的项目,和Eclipse的结构都差不多,下图是SSM搭建的整体结构图
二 配置文件
这里需要的配置文件主要有1.mybatis-config.xml 2.mapper.xml 3.jdbc.properties 4.applicationContext.xml 5.springmvc-servlet.xml 6.web.xml
2.1 配置mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启驼峰命名自动转换
一般数据库命名规则一般是user_name,而我们实体类中一般使用userName,开启后就可以自动映射了
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
</configuration>
2.2 配置mapper.xml
这里博主就配置了一个UserMapper,童鞋们,你们可以根据功能的模块需求,自己可以在/resources/mybatis/mapper文件夹下添加添加其他的模块,例如:添加一个订单模块的话,加一个OrderMapper.xml,内容修改下即可
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间就是接口的全限定名路径-->
<mapper namespace="com.agu.mapper.UserMapper">
<!--id的值:要和接口UserMapper下的方法名一致
resultType:1.要和方法返回值类型一样,或者是返回值类型的集合
2.原本需要写返回值类型的权限定名路径,但是我们在applicationContext里配置了别名所属的包
所以只要写类名即可 -->
<select id="findAllUsers" resultType="User">
select * from tb_user
</select>
</mapper>
2.3 配置jdbc.properties
小伙伴们,博主这里用的mysql数据库,这里配置的时候,注意要把第二行改成你们自己的数据库名,以及用户名和密码都要改成你们自己的用户名和密码(注意:后面千万不能加空格,之前博主配置的时候无意中多加了个空格,找了半天错误)
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123
2.4 配置applicationContext.xml
applicationContext配置文件项目启动的时候就要加载了,所以我们要把数据源,事务,切面和一些配置文件引入进来,主要结构有:
1.引入jdbc.properties配置文件位置
2.数据源dataSource
3.引入mybatis-config.xml文件位置
4.引入mapper.xml文件位置
5.事务管理器
6.切面配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 引入外部的属性资源文件,把我们刚刚配置的jdbc配置文件引入进来 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 扫包,只需要扫service的即可,Controller的包springMVC会扫描,mapper层的,下面类会帮我们扫描 -->
<context:component-scan base-package="com.agu.service"></context:component-scan>
<!-- 使用专门扫描mapper接口的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.agu.mapper"></property>
</bean>
<!-- 配置数据源 ,这里了用的是阿里巴巴的德鲁伊数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--sqlSession工厂,我们对数据库增删改查就靠他-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入配置的数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 注入mybatis-config配置文件 -->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<!-- 注入mapper.xml文件位置,
这里的/**/*.xml写法,只要是/mybatis/mapper下的都可以注入进来,哪怕里面又加了几个文件夹-->
<property name="MapperLocations" value="classpath:mybatis/mapper/**/*.xml"></property>
<!-- 配置别名所属的包名,配置了这个,我们UserMapper.xml文件下的resultType就只需要写类名即可-->
<property name="typeAliasesPackage" value="com.agu.domain"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--配置事务的属性,如果方法名是find开头,只允许查询业务,不允许增删改业务,
这样可以防错,如果写了删除或者增加功能,则会抛出异常,提醒开发人员-->
<tx:method name="find*" read-only="true"/>
<!--其他方法做增删改功能-->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面
配置了事务后,我们肯定要告诉spring,哪些方法需要加上事务 -->
<aop:config>
<!--配置切点-->
<aop:pointcut expression="execution(* com.agu.service.impl.*.*(..))" id="pointcut"/>
<!--将advice注入程序中pointcut位置的代码-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
</beans>
2.5 配置springmvc-servlet.xml
此配置文件主要配置了controller扫描,注解驱动,视图解析器,处理静态资源
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描,扫描controller包 -->
<context:component-scan base-package="com.agu.controller"></context:component-scan>
<!-- mvc注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置springMVC视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--有时我们需要将数据响应到某个页面,例如响应到/jsp/users.jsp,controller只需要返回"users"-->
<!--url路径的前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--url路径的后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 处理静态资源拦截问题,如果是静态资源的请求,则默认服务器的servlet处理,
如果不是,则交给DispatcherServlet处理-->
<mvc:default-servlet-handler/>
</beans>
2.6 配置web.xml
此配置文件主要是加载之前配置的springmvc-servlet.xml文件和applicationContext.xml文件以及配置字节码过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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_2_5.xsd" version="2.5">
<!-- 配置字节码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 指定spring配置文件名 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<!-- 工程启动时,创建IOC容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc入口 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定springmvc配置文件路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-servlet.xml</param-value>
</init-param>
<!--项目启动时,就加载此servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截除了jsp以外的所有请求(不是/*) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.7 配置log4j.properties
此配置文件主要针对异常问题进行定位
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
2.8 引入依赖
在pom.xml文件下添加下这些依赖即可
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.agu</groupId>
<artifactId>SSMDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!--配置webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!--配置spring jdbc,用来加载DataSourceTransactionManager-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!--配置切面的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!--mybatis,用来加载SqlSessionFactoryBean和MapperScannerConfigurer-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--日志文件-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
<!--json处理工具包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!-- 连接池,用来加载DruidDataSource-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!--javaScript标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
三 测试
测试之前先要添加java文件,创建mysql数据库,以及创建jsp页面
3.1 创建java文件
3.1.1 UserController类
package com.agu.controller;
import java.util.List;
import com.agu.domain.User;
import com.agu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("list")
public String test1(Model model) {
List<User> users = userService.findAllUsers();
model.addAttribute("userList", users);
return "users";
}
}
3.1.2 User实体类
package com.agu.domain;
import java.io.Serializable;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getUpdated() {
return updated;
}
public void setUpdated(Date updated) {
this.updated = updated;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", name=" + name
+ ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created
+ ", updated=" + updated + "]";
}
}
3.1.3 UserService接口
package com.agu.service;
import com.agu.domain.User;
import java.util.List;
public interface UserService {
/**
* 查询所有用户信息
* @return
*/
public List<User> findAllUsers();
}
3.1.4 UserServiceImpl实现类
package com.agu.service.impl;
import com.agu.domain.User;
import com.agu.mapper.UserMapper;
import com.agu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAllUsers() {
List<User> list = userMapper.findAllUsers();
return list;
}
}
3.1.5 UserMapper类
package com.agu.mapper;
import java.util.List;
import com.agu.domain.User;
public interface UserMapper {
public List<User> findAllUsers();
}
3.2 创建MySql数据库表
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Version : 50527
Source Host : localhost:3306
Source Database : mybatis
Target Server Type : MYSQL
Target Server Version : 50527
File Encoding : 65001
Date: 2018-07-17 16:28:28
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
`password` varchar(100) DEFAULT NULL COMMENT '密码',
`name` varchar(100) DEFAULT NULL COMMENT '姓名',
`age` int(10) DEFAULT NULL COMMENT '年龄',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`created` datetime DEFAULT NULL COMMENT '创建时间',
`updated` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1', '1984-08-08', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '2', '1991-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '2', '1989-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1988-09-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '1', '1985-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1988-08-08', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('8', 'xiaofeng', '123456', '萧峰', '30', '1', '2018-06-25', '2018-06-25 18:42:25', '2018-06-25 18:42:25');
INSERT INTO `tb_user` VALUES ('12', 'zhendeshuai', '565656', '吴彦祖', '26', '1', '2018-06-26', '2018-06-26 14:55:59', '2018-06-26 15:12:12');
INSERT INTO `tb_user` VALUES ('14', 'jiumozhi', '123456', '鸠摩智', '30', '1', '2018-06-26', '2018-06-26 23:53:15', '2018-06-26 23:53:15');
INSERT INTO `tb_user` VALUES ('21', 'zhangsan1234', '12345', '杰克', '20', '1', '2000-01-01', '2018-07-07 21:50:26', '2018-07-07 21:50:26');
INSERT INTO `tb_user` VALUES ('22', 'zhangsanqwe1', '123455', '张三', '30', '1', '1999-02-25', '2018-07-07 21:51:20', '2018-07-07 21:51:20');
3.3 创建users.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="/css/user.css"/>
</head>
<body>
<table id="customers" border="1px">
<tr>
<th>编号</th>
<th>用户名</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>出生日期</th>
<th>创建时间</th>
<th>更新时间</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.userName}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>
<c:choose>
<c:when test="${user.sex==1}">男</c:when>
<c:otherwise>女</c:otherwise>
</c:choose>
</td>
<td>
<fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>
</td>
<td>
<fmt:formatDate value="${user.created}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<fmt:formatDate value="${user.updated}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
3.4 结果
上面文件配置好了之后,可以直接用tomcat服务器启动,启动后的结果如下:
四 源码下载地址
百度网盘:https://pan.baidu.com/s/133xngfk83-SDb6tzDJGujw
密码:uref
如果觉得文章不错,还请帮忙点下"赞",各位的支持,能鼓励我更大的写作热情。谢谢!
我用的是IDEA开发工具,每个工具的配置