工程目录结构
配置pom文件
<!-- 版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<spring.version>4.3.0.RELEASE</spring.version>
<jackson.version>2.5.0</jackson.version>
<mysql-connector-java.version>5.1.37</mysql-connector-java.version>
<fastjson.version>1.2.3</fastjson.version>
<slf4j.version>1.7.12</slf4j.version>
<commons-io.version>2.4</commons-io.version>
<commons-fileupload.version>1.3.2</commons-fileupload.version>
<commons-collections.version>3.2.2</commons-collections.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-codec.version>1.10</commons-codec.version>
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
<druid.version>1.0.16</druid.version>
<mybatis.version>3.4.0</mybatis.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
<swagger.version>2.7.0</swagger.version>
<mybatis.generator>1.3.6</mybatis.generator>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<logback.version>1.2.3</logback.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- spring -->
<!--spring 核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring beans 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring事务包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- jdbc驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!--common 组件 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!-- javax.servlet相关 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.8.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
build>
<finalName>ssm</finalName>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis.generator}</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>com.qiukeke</groupId>
<artifactId>mybatis-generator-limit-plugin</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Spring集成Mybatis
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* 非Web组件的配置
* @author hollins
*
*/
//注解表明这个类是一个Bean的配置类。
@Configuration
//注解激活Aspect自动代理 等同于<aop:aspectj-autoproxy/>
@EnableAspectJAutoProxy
//扫描配置文件
@PropertySource(value = "classpath:config/jdbc.properties")
@MapperScan(value = "com.ssm.dal",annotationClass = Mapper.class)
//@ComponentScan注解表示启用组件扫描,等同于xml文件中的
@ComponentScan(basePackages ="com.ssm.adapter.impl")
//开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。
@EnableAsync
//@EnableTransactionManagement注解开启注解式事务的支持。
@EnableTransactionManagement
//@EnableScheduling注解开启计划任务的支持。一般都需要@Scheduled注解的配合。
//@EnableScheduling
public class DataSourceConfig {
Logger logger = LoggerFactory.getLogger(getClass());
@Value("${spring.datasource.driverClassName}")
String driverClassName;
@Value("${spring.datasource.username}")
String dataSourceUserName;
@Value("${spring.datasource.password}")
String dataSourceUserPassword;
@Value("${spring.datasource.url}")
String dataSourceUrl;
@Value("${spring.datasource.initialSize}")
String dataSourceInitialSize;
@Value("${spring.datasource.minIdle}")
String dataSourceMinIdle;
@Value("${spring.datasource.maxActive}")
String dataSourceMaxActive;
@Value("${spring.datasource.maxWait}")
String dataSourceMaxWatit;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
String dataSourceTimeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
String dataSourceMinEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
String dataSourceValidationQuery;
@Value("${spring.datasource.testWhileIdle}")
String dataSourceTestWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
String dataSourceTestOnBorrow;
@Value("$spring.datasource.testOnReturn")
String dataSourceTestOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
String dadaSourcePoolPreparedStatements;
@Value("${spring.datasource.maxOpenPreparedStatements}")
String dataSourceMaxOpenPreparedStatements;
@Value("${spring.datasource.filters}")
String dataSourceFilters;
@Value("${spring.datasource.connectionProperties}")
String dataSourceConnectionProperties;
@Bean
public DataSource getDataSource() throws Exception{
logger.info("数据库配置初始化开始××××××××××××××××××××××××××××××××××××××××");
Map<String,Object> properties = new HashMap<>();
properties.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME,driverClassName);
properties.put(DruidDataSourceFactory.PROP_USERNAME,dataSourceUserName);
properties.put(DruidDataSourceFactory.PROP_PASSWORD,dataSourceUserPassword);
properties.put(DruidDataSourceFactory.PROP_URL,dataSourceUrl);
properties.put(DruidDataSourceFactory.PROP_INITIALSIZE,dataSourceInitialSize);
properties.put(DruidDataSourceFactory.PROP_MINIDLE,dataSourceMinIdle);
properties.put(DruidDataSourceFactory.PROP_MAXACTIVE,dataSourceMaxActive);
properties.put(DruidDataSourceFactory.PROP_MAXACTIVE,dataSourceMaxWatit);
properties.put(DruidDataSourceFactory.PROP_TIMEBETWEENEVICTIONRUNSMILLIS,dataSourceTimeBetweenEvictionRunsMillis);
properties.put(DruidDataSourceFactory.PROP_MINEVICTABLEIDLETIMEMILLIS,dataSourceMinEvictableIdleTimeMillis);
properties.put(DruidDataSourceFactory.PROP_VALIDATIONQUERY,dataSourceValidationQuery);
properties.put(DruidDataSourceFactory.PROP_TESTWHILEIDLE,dataSourceTestWhileIdle);
properties.put(DruidDataSourceFactory.PROP_TESTONBORROW,dataSourceTestOnBorrow);
properties.put(DruidDataSourceFactory.PROP_TESTONRETURN,dataSourceTestOnReturn);
properties.put(DruidDataSourceFactory.PROP_POOLPREPAREDSTATEMENTS,dadaSourcePoolPreparedStatements);
properties.put(DruidDataSourceFactory.PROP_MAXOPENPREPAREDSTATEMENTS,dataSourceMaxOpenPreparedStatements);
properties.put(DruidDataSourceFactory.PROP_FILTERS,dataSourceFilters);
properties.put(DruidDataSourceFactory.PROP_CONNECTIONPROPERTIES,dataSourceConnectionProperties);
logger.info("数据库配置初始化结束××××××××××××××××××××××××××××××××××××××××");
return DruidDataSourceFactory.createDataSource(properties);
}
/**
* 事务配置
**/
@Bean
public DataSourceTransactionManager transactionManager()throws Exception{
return new DataSourceTransactionManager(this.getDataSource());
}
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean()throws Exception{
logger.info("初始化SqlSessionFactoryBean开始××××××××××××××××××××××××××××××××××××××××");
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(this.getDataSource());//数据源
sqlSessionFactoryBean.setTypeAliasesPackage("com.ssm.dal.model");
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_URL_PREFIX+"/mybatis/*.xml";//数据库层xml文件地址
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
logger.info("初始化SqlSessionFactoryBean结束××××××××××××××××××××××××××××××××××××××××");
return sqlSessionFactoryBean;
}
}
Spring Mvc
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
//注解表明这个类是一个Bean的配置类。
@Configuration
//@EnableWebMVC注解用来开启Web MVC的配置支持。
//@EnableWebMvc
//@ComponentScan注解表示启用组件扫描,等同于xml文件中的
@ComponentScan(value = {"com.ssm.web", "com.ssm.swagger"})
public class WebConfig extends WebMvcConfigurerAdapter{
/**
* 允许跨域访问
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*");
}
/**
* 允许直接访问的资源
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
/**
* spring 方法参数验证
* @return
*/
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor(){
return new MethodValidationPostProcessor();
}
}
web.xml
import com.ssm.assembly.redis.RedisConfig;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
/**
* 初始化容器
*/
public class WeblabWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{DataSourceConfig.class,RedisConfig.class};// RedisConfig.class
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
FilterRegistration.Dynamic encodingFilter=servletContext.addFilter("characterEncodingFilter",new CharacterEncodingFilter());
encodingFilter.setInitParameter("encoding","UTF-8");
encodingFilter.setInitParameter("forceEncoding", "true");
encodingFilter.addMappingForUrlPatterns(null, true, "/*");
}
}
数据连接配置
jdbc.properties
## Development jdbc settings. ####
## MySQL. ##
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/user_manager?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=100
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=false
spring.datasource.maxOpenPreparedStatements=-1
spring.datasource.filters=stat,wall,slf4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;