教你十分钟构建好 SpringBoot + SSM 框架

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 教你十分钟构建好 SpringBoot + SSM 框架

作者:Howie_Y
链接:https://juejin.im/post/5b53f677f265da0f8f203914

目前最主流的 java web 框架应该是 SSM,而 SSM 框架由于更轻便与灵活目前受到了许多人的青睐。而 SpringBoot 的轻量化,简化项目配置, 没有 XML 配置要求等优点现在也得到了大众的青睐。

而本文,我将教大家如何在 intellij idea 中快速构建好一个 Maven + Spring + SpringMVC + MyBatis + SpringBoot 的框架,做到了足够精简,让你可以立刻开始你的 web 项目。

附上这个简单的框架构建的 github 地址 SSM-SpringBoot:

一. 创建项目

选择 Spring Initiallizr

 

添加最基本的几个依赖 Web,MySQL,MyBatis,其他需求可以后续再添加 ; 数据库选择了 MySQL

二. 配置数据源

数据源中存储了所有建立数据库连接的信息

1. 配置 IDEA 数据源

输入地址,端口,用户名,密码等等完成设置

 

2. 配置 spring 数据源

application.properties 文件添加:

1234
spring.datasource.url = jdbc:mysql://xx.xx.xx.x:xxx/xxx?characterEncoding=utf8&allowMultiQueries=true&useSSL=falsespring.datasource.username = rootspring.datasource.password = 123456spring.datasource.driver-class-name = com.mysql.jdbc.Driver

spring.datasource.url = jdbc:mysql://xx.xx.xx.x:xxx/xxx?characterEncoding=utf8&allowMultiQueries=true&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.jdbc.Driver

  • url  : 数据源 url ,格式为 jdbc:mysql://Host(主机名或 IP 地址):Post(端口)/Database(数据库名称),其中 allowMultiQueries = true : 允许多条 sql 同时执行(分号分隔);useSSL : 是否进行 SSL 连接,根据实际情况选择
  • username : 用户名
  • password : 密码
  • driver-class-name : 驱动名,不同的数据库有不同的 Drivername,如 oracle 数据库的 oracle.jdbc.driver.OracleDriver,MySQL 数据库为 com.mysql.jdbc.Driver

三. Spring 注解

  • 使用 @Controller / @RestController 注解标注一个控制器,表明这个类是作为控制器的角色而存在的
  • 使用 @Service 注解标注一个业务层类
  • 使用 @Repository 注解标注一个持久层 mapper 接口
  • 使用 @Component 注解标注其他组件
  • 使用 @Configuration 注解标注配置类

四. MyBatis

整个项目的构建最主要的部分就是 springboot 和 mybatis 的整合,而 springboot 也提供了十分方便的方式。

1. xml 文件

  • 声明为映射文件
  • namespace : 指该映射文件对应的映射接口 ; 一般来说,一个 XML 映射配置文件对应一个命名空间,而这个命名空间又对应一个接 口
    1234
    ?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.swit.dao.MyMapper"/mapper

?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.swit.dao.MyMapper”
/mapper

2. application.properties

  • Mybatis 配置,指定了 mybatis 基础配置文件和实体类映射文件的地址
    12
    mybatis.mapperLocations = classpath:mapper/**/*.xmlmybatis.typeAliasesPackage = com.swit.model

mybatis.mapperLocations = classpath:mapper/**/*.xml
mybatis.typeAliasesPackage = com.swit.model

  • 配置 typeAliasesPackage 可以使得 com.swit.model 包内的实体类可以在映射文件中使用别名,如:
    12
    select id="getUser" parameterType="int" resultType="User"/select

select id=”getUser” parameterType=”int” resultType=”User”
/select

 

如没有配置 typeAliasesPackage ,则需要  resultType="com.swit.model.User"

  • 如果要对 MyBatis 通过 xml 文件进行另外的配置,则添加文件路径:
    1
    mybatis.config-locations=classpath:mybatis/mybatis-config.xml

mybatis.config-locations=classpath:mybatis/mybatis-config.xml

3. 添加对 mapper 类的扫描

以下两种方法二选其一

(1)可以选择在启动类添加 @MapperScan

value 为 mapper 类所在的包(注意这里是包的路径,而不是类的路径!)

1
@MapperScan(value = "com.swit.dao")

@MapperScan(value = “com.swit.dao”)

另外, @MapperScan 注解面向的是接口类,只要是加了注解的接口类都需要进行通过该注解来扫描

(2)可以在每个 mapper 类上添加 @mapper 注解

1234
@Mapper@Repositorypublic interface MyMapper {}

@Mapper
@Repository
public interface MyMapper {
}

到目前为止,你已经完成了你的项目的构建,下面我还会介绍些别的东西。

五. 其他要注意的点

1. @SpringBootApplication

  • 这个注解位于启动类
  • @SpringBootApplication 等价于以默认属性使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan, 所以启动类无需再添加这三个注解
  • @Configuration :标注一个类为配置类。
  • @EnableAutoConfiguration :开启自动配置。
  • @ComponentScan :自动收集所有的 Spring 组件

2. 部署服务器

如果你想把自己的 SpringBoot 项目部署到阿里云,腾讯云等服务器,那么你还需要加点东西。

  1. 如果需要通过打包的方式在web容器中进行部署,则需要继承 SpringBootServletInitializer 覆盖configure(SpringApplicationBuilder)方法
    12345678910
    public class SpringbootApplication extends SpringBootServletInitializer {   public static void main(String[] args) {       SpringApplication.run(SpringbootApplication.class, args);   }   @Override   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {       // 注意这里要指向原先用main方法执行的Application启动类       return builder.sources(SpringbootApplication.class);   } }

public class SpringbootApplication extends SpringBootServletInitializer {
   public static void main(String[] args) {
       SpringApplication.run(SpringbootApplication.class, args);
   }
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
       // 注意这里要指向原先用main方法执行的Application启动类
       return builder.sources(SpringbootApplication.class);
   }
}

2.pom 文件添加打包插件

1234567891011121314151617181920212223
build       !--打包后的项目名,url 前缀--   finalNameprojectName/finalName   plugins     plugin       groupIdorg.springframework.boot/groupId       artifactIdspring-boot-maven-plugin/artifactId     /plugin     plugin       groupIdorg.apache.maven.plugins/groupId       artifactIdmaven-compiler-plugin/artifactId       version3.1/version       configuration         !--设置编译时使用的 JDK 版本--         source1.8/source         !--设置运行时使用的 JDK 版本--         target1.8/target         !--设置为 true 则跳过测试--         skiptrue/skip       /configuration     /plugin   /plugins /build

build
       !–打包后的项目名,url 前缀–
   finalNameprojectName/finalName
   plugins
     plugin
       groupIdorg.springframework.boot/groupId
       artifactIdspring-boot-maven-plugin/artifactId
     /plugin
     plugin
       groupIdorg.apache.maven.plugins/groupId
       artifactIdmaven-compiler-plugin/artifactId
       version3.1/version
       configuration
         !–设置编译时使用的 JDK 版本–
         source1.8/source
         !–设置运行时使用的 JDK 版本–
         target1.8/target
         !–设置为 true 则跳过测试–
         skiptrue/skip
       /configuration
     /plugin
   /plugins
 /build

  1. 你很有可能还需要做个跨域处理
    123456789101112131415161718192021222324252627282930313233
    @Componentpublic class CorsFilter implements Filter {   /**    * json web token 在请求头的名字    */   private String tokenHeader = "X_Auth_Token";   @Override   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {       HttpServletResponse response = (HttpServletResponse) res;       HttpServletRequest request = (HttpServletRequest) req;       String token = request.getHeader("X_Auth_Token");       System.out.println(token + "token");       String Origin = request.getHeader("Origin");       System.out.println("Origin:" + Origin);       System.out.println("tokenHeader:" + this.tokenHeader);       Logger logger = Logger.getLogger(this.getClass());       logger.info("Origin:  " + Origin);       response.setHeader("Access-Control-Allow-Origin", Origin);       response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");       response.setHeader("Access-Control-Max-Age", "3600");       response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, " + this.tokenHeader);       response.setHeader("Access-Control-Allow-Credentials", "true");       chain.doFilter(req, res);   }    @Override   public void init(FilterConfig filterConfig) {   }    @Override   public void destroy() {   }}

@Component
public class CorsFilter implements Filter {
   /**
    * json web token 在请求头的名字
    */
   private String tokenHeader = “X_Auth_Token”;
   @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
       HttpServletResponse response = (HttpServletResponse) res;
       HttpServletRequest request = (HttpServletRequest) req;
       String token = request.getHeader(“X_Auth_Token”);
       System.out.println(token + “token”);
       String Origin = request.getHeader(“Origin”);
       System.out.println(“Origin:” + Origin);
       System.out.println(“tokenHeader:” + this.tokenHeader);
       Logger logger = Logger.getLogger(this.getClass());
       logger.info(“Origin:  “ + Origin);
       response.setHeader(“Access-Control-Allow-Origin”, Origin);
       response.setHeader(“Access-Control-Allow-Methods”, “POST, GET, PUT, OPTIONS, DELETE”);
       response.setHeader(“Access-Control-Max-Age”, “3600”);
       response.setHeader(“Access-Control-Allow-Headers”, “Origin, X-Requested-With, Content-Type, Accept, “ + this.tokenHeader);
       response.setHeader(“Access-Control-Allow-Credentials”, “true”);
       chain.doFilter(req, res);
   }

   @Override
   public void init(FilterConfig filterConfig) {
   }

   @Override
   public void destroy() {
   }
}

六. 整合其他组件

1. redis

redis 也是我们项目中经常用到的 NoSQL,经常用来做做缓存什么的。

依赖

1234
dependency   groupIdorg.springframework.boot/groupId   artifactIdspring-boot-starter-data-redis/artifactId/dependency

dependency
   groupIdorg.springframework.boot/groupId
   artifactIdspring-boot-starter-data-redis/artifactId
/dependency

application.properties

123456789101112131415161718
# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=123456# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=15# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=15# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

Redis数据库索引(默认为0)

spring.redis.database=0

Redis服务器地址

spring.redis.host=127.0.0.1

Redis服务器连接端口

spring.redis.port=6379

Redis服务器连接密码(默认为空)

spring.redis.password=123456

连接池最大连接数(使用负值表示没有限制)

spring.redis.pool.max-active=15

连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.pool.max-wait=-1

连接池中的最大空闲连接

spring.redis.pool.max-idle=15

连接池中的最小空闲连接

spring.redis.pool.min-idle=0

连接超时时间(毫秒)

spring.redis.timeout=0

2. Druid 数据源

针对监控而生的 DB 连接池

依赖

12345
dependency      groupIdcom.alibaba/groupId      artifactIddruid/artifactId      version1.0.20/version/dependency

dependency
      groupIdcom.alibaba/groupId
      artifactIddruid/artifactId
      version1.0.20/version
/dependency

application.properties

1234567891011121314
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.filters=statspring.datasource.maxActive=20spring.datasource.initialSize=5spring.datasource.maxWait=60000spring.datasource.minIdle=1spring.datasource.timeBetweenEvictionRunsMillis=60000spring.datasource.minEvictableIdleTimeMillis=300000spring.datasource.validationQuery=select 'x'spring.datasource.testWhileIdle=truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=falsespring.datasource.poolPreparedStatements=truespring.datasource.maxOpenPreparedStatements=20

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters=stat
spring.datasource.maxActive=20
spring.datasource.initialSize=5
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select ‘x’
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 教你十分钟构建好 SpringBoot + SSM 框架


 上一篇
Spring Boot 最流行的 16 条实践解读! Spring Boot 最流行的 16 条实践解读!
Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。 在本文中
下一篇 
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
本文为原创投稿文,作者:微笑面对生活 RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是用a