前言:由于Spring一直在提倡使用Java配置来进行整合,后来的SpringBoot也是由此而生的,故本文主要使用Java注解配置来整合,xml使用于映射文件(由于mybatis的映射xml可以提供的功能和简便性远比Java的要多)以及web.xml(载入log4j配置文件)。

一、项目结构目录(基于Maven):


二、配置类及配置文件

1. WebAppInitializer

package com.inmock.ssm.config; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.Filter; /** * 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地配置DispatcherServlet和Spring应用上下文 * ,在容器创建时上述两个就会加载到Servlet中 */ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // 将DispatcherServlet映射到“/”  @Override protected String[] getServletMappings() { return new String[] { "/" }; } // 返回ContextLoaderListener创建地应用上下文的bean  @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { SpringMybatisConfig.class }; } // 返回DispatcherServlet应用上下文的bean  @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { DispatcherConfig.class }; } // 添加过滤器,实现编码过滤  @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[]{characterEncodingFilter}; } }
View Code

在服务器启动时,上述配置类作为入口。

2. DispatcherConfig

package com.inmock.ssm.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc //启用SpringMVC @ComponentScan(basePackages = {"com.inmock.ssm.controller", "com.inmock.ssm.service",  "com.inmock.ssm.dao"}) // 扫描service、repository、controller public class DispatcherConfig { // 配置JSP视图解析器  @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); // 解析视图的前缀 resolver.setSuffix(".jsp"); // 视图的后缀 resolver.setExposeContextBeansAsAttributes(true); return resolver; } }
View Code

该类为springmvc相关的配置类。

@Configuration注解标明该类为配置类

@EnableWebMvc注解标明该类为springmvc的配置类

@ComponentScan注解标明扫描指定的包以加载指定的包内的bean,并加载到Spring应用上下文中

3. SpringMybatisConfig

package com.inmock.ssm.config; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration @EnableTransactionManagement //开启事务管理 @MapperScan(basePackages = "com.inmock.ssm.dao") //扫描Mybatis的Mapper接口 @PropertySource("classpath:properties/jdbc.properties") // 读取jdbc配置 public class SpringMybatisConfig { // 读取jdbc属性文件属性 @Value("${jdbc.url}") private String url; @Value("${jdbc.driver}") private String driver; @Value("${jdbc.username}") private String user; @Value("${jdbc.password}") private String password; //配置c3p0数据库  @Bean public DataSource dataSource() throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 实例化c3p0连接池  dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(user); dataSource.setPassword(password); dataSource.setMaxPoolSize(30); // 设置保持的最大连接数量 dataSource.setMinPoolSize(10); // 设置保持的最小连接数量 dataSource.setInitialPoolSize(10); // 设置连接池初始化的连接数量 dataSource.setAutoCommitOnClose(false); // 关闭连接后不自动提交 dataSource.setCheckoutTimeout(1000); // 设置连接超时时间 dataSource.setAcquireRetryAttempts(3); // 当获取连接失败时重新尝试的次数 return dataSource; } //配置mybatis的sqlSessionFactoryBean  @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); // 注入连接池对象 sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("config/mybatis-config.xml")); // 注入mybatis配置文件 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); // 注入mapper接口需要的映射文件 sqlSessionFactoryBean.setTypeAliasesPackage("com.inmock.ssm.entity"); // 使用别名(非全类名) return sqlSessionFactoryBean; } //配置事务管理  @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }
View Code

该类为spring的数据访问层有关的配置类。

@EnableTransactionManagement 是开启spring支持的声明式事务管理,只需在要使用事务管理的类或方法上添加一个@Transactional注解即可。

@MapperScan 是扫描指定的包下的mybatis的映射接口

@PropertySource 是读取jdbc配置

4. 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> <!-- 配置全局属性 --> <settings> <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --> <setting name="useGeneratedKeys" value="true" /> <!-- 使用列别名替换列名 默认:true --> <setting name="useColumnLabel" value="true" /> <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} --> <setting name="mapUnderscoreToCamelCase" value="true" /> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings> </configuration>
View Code

配置mybatis相关的配置文件,由于spring对于mybatis的支持尚未完善,故这里我使用xml的配置形式。

5. web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 日志记录 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:properties/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>6000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> </web-app>
View Code

载入log4j的配置文件到spring中

三、属性文件

1. jdbc.properties

#数据库连接 jdbc.username=root jdbc.password=root jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmdemo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
View Code

jdbc连接的相关属性文件,其中 allowMultiQueries=true 是用于支持多条SQL语句同时发送到数据库。

2. log4j.properties

### set log levels ###
log4j.rootLogger = INFO , console , debug , error

### console ###
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 = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n

### log file ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File = /WEB-INF/logs/debug.log
log4j.appender.debug.Append = true
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### exception ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = /WEB-INF/logs/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
View Code

spring日志的相关属性文件,在spring启动时加载到spring上下文中。

四、补全应用所需的类

1. UserDao

package com.inmock.ssm.dao; import com.inmock.ssm.entity.User; import org.springframework.stereotype.Repository; @Repository public interface UserDao { User selectUserById(String id); }
View Code

@Repository标明是一个bean,是mybatis的映射接口

2. UserDao.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.inmock.ssm.dao.UserDao"> <select id="selectUserById" parameterType="string" resultType="User"> SELECT * FROM student WHERE id = #{id} </select> </mapper>
View Code

和UserDao映射接口对应的映射文件,具体的数据访问过程

3. UserService

package com.inmock.ssm.service; import com.inmock.ssm.entity.User; public interface UserService { User selectUserById(String id); }
View Code

服务层接口,提供服务层功能接口

4. UserServiceImpl

package com.inmock.ssm.service.impl; import com.inmock.ssm.dao.UserDao; import com.inmock.ssm.entity.User; import com.inmock.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService{ @Autowired UserDao userDao; @Override public User selectUserById(String id) { return userDao.selectUserById(id); } }
View Code

服务层接口实现,提供具体实现

5. UserController

package com.inmock.ssm.controller; import com.inmock.ssm.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; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value="/views/user") public class UserController { @Autowired UserService userService; @RequestMapping(method = RequestMethod.GET) public String showUserMessage(Model model) { model.addAttribute("user", userService.selectUserById("1")); return "user"; } }
View Code

springmvc的控制层

@Controller 标明是一个bean,是springmvc的控制层

@RequestMapping 标明指定路径为该controller的映射路径

6. User

package com.inmock.ssm.entity; public class User { String id; String name; String sex; int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
View Code

User实体

7. user.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page isELIgnored="false" %> <%-- Created by IntelliJ IDEA. User: chenlongjie Date: 2018/8/4 Time: 21:35 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>UserPage</title> </head> <body> user: <c:out value="${user.getName()}"/> </body> </html>
View Code

视图层