Spring Boot Web项目搭建
技术选型
- 核心框架:Spring Boot
- 模板引擎:Thymeleaf
- 数据库:MySQL
- 持久层框架:MyBatis,MyBatis-Plus
- 动态多数据源:Dynamic
- 数据库连接池:Druid
- 安全框架:Apache Shiro
- 缓存:Redis
新建项目
- 创建项目:File > New > Project > Spring Assistant > (Default)Next > WEB(或其他需要的配置)
- 找不到Spring Assistant
- 需安装插件
- File > Setting > Plugins > Spring Assistant > Install > Restart Idea
- 提示 times out连接超时
- 可能是https://start.spring.io/网址访问不通导致
- 检查网络连接,防火墙等问题后检查连接
- File > Setting > Http Proxy > Check connection > (url) > ok
- 检查结果成功后,再重新新建项目
- Spring Boot的基础结构共三个文件:
- src/main/java 程序开发以及主程序入口
- src/main/resources 配置文件
- src/test/java 测试程序
- 若不需要可删除项目的 src 文件
- 找不到Spring Assistant
- 创建子模块:项目右击 > New > Module > Spring Assistant > (Default)Next - WEB(或其他需要的配置)
- 修改pom.xml配置文件,实现对父模块依赖的复用
开发配置
- 新建文件 application.yml
# 开发环境配置 server: # 服务器的HTTP端口,默认为80 port: 9020 servlet: # 应用的访问路径 context-path: /
- 引入lombok
- 作用
通过注释,消除模板代码,便捷的生成getter、setter、构造器、toString()、equals()等方法。 - 添加依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency>
- 编写实体类,使用@Data注解
- @Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
- 注意:lombok 的注解不能被继承。
- idea中使用时需要添加插件才能生效:
File > Settings > Plugins > Browse repositories… > 输入lombok > Install
- 作用
- 引入模板引擎
- 作用
- Spring boot 推荐使用来代替jsp
- 是一款用于渲染XML/XHTML/HTML5内容的模板引擎
- 特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用
- 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>${spring-boot-starter-thymeleaf.version}</version> </dependency>
- 页面引入
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
- 作用
- 热部署
- 参考Blog
<!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 --> </configuration> </plugin>
- IDEA配置
- File-Settings-Compiler-Build project automatically
- ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running
- 参考Blog
- 配置数据库MySQL
- 引入依赖
<!--MySQL驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency>
- 引入依赖
- 配置持久层框架 MyBatis
- 引入MyBatis依赖
<!--MyBatis 持久层框架--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot-starter.version}</version> </dependency>
- 引入MyBatis增强工具 Mybatis-plus 依赖
<!--MyBatis-Plus MyBatis增强工具--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> <!--<exclusions>--> <!--<exclusion>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-jdbc</artifactId>--> <!--</exclusion>--> <!--</exclusions>--> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-annotation</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-core</artifactId> <version>${mybatis-plus.version}</version> </dependency>
- 引入MyBatis依赖
- 整合动态多数据源 Dynamic
- dynamic-datasource:一个基于springboot的快速集成多数据源的启动器
- dynamic gitee地址
- 引入依赖
<!--动态多数据源--> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>${dynamic-datasource-spring-boot-starter.version}</version> </dependency>
- application.yml 配置数据源
spring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源. datasource: master: url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave_1: url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave_2: url: ENC(xxxxx) # 内置加密,使用请查看详细文档 username: ENC(xxxxx) password: ENC(xxxxx) driver-class-name: com.mysql.jdbc.Driver schema: db/schema.sql # 配置则生效,自动初始化表结构 data: db/data.sql # 配置则生效,自动初始化数据 continue-on-error: true # 默认true,初始化失败是否继续 separator: ";" # sql默认分号分隔符
- 使用 @DS 切换数据源
- @DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。
- 强烈建议只注解在service实现上
- 整合数据库连接池 Druid
- Alibaba官方github
参考blog - 引入依赖
<!--Druid 数据库连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid-version}</version> </dependency>
- application.yml 配置数据库连接池
druid: #连接池的设置 #初始化时建立物理连接的个数 initial-size: 5 #最小连接池数量 min-idle: 5 #最大连接池数量 maxIdle已经不再使用 max-active: 20 #获取连接时最大等待时间,单位毫秒 max-wait: 60000 #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 test-while-idle: true #既作为检测的间隔时间又作为testWhileIdel执行的依据 time-between-eviction-runs-millis: 60000 #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接 min-evictable-idle-time-millis: 30000 #用来检测连接是否有效的sql 必须是一个查询语句 #mysql中为 select 'x' #oracle中为 select 1 from dual validation-query: select 'x' #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true test-on-borrow: false #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true test-on-return: false #当数据库抛出不可恢复的异常时,抛弃该连接 exception-sorter: true #是否缓存preparedStatement,mysql5.5+建议开启 #pool-prepared-statements: true #当值大于0时poolPreparedStatements会自动修改为true max-pool-prepared-statement-per-connection-size: 20 #配置扩展插件 filters: stat,wall #通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: stat: mergeSql: true slowSqlMillis: 500 #合并多个DruidDataSource的监控数据 use-global-data-source-stat: true #设置访问druid监控页的账号和密码,默认没有 #stat-view-servlet.login-username: admin #stat-view-servlet.login-password: admin
- 修改tomcat url编码
tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # tomcat最大线程数,默认为200 max-threads: 800 # Tomcat启动初始化的线程数,默认值25 min-spare-threads: 30
- 修改启动文件
- @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) // 取消自动数据源自动配置
- Alibaba官方github
- 整合swager2
- 引入依赖
<!--swagger2--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger2.version}</version> <!--<exclusions> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> </exclusion> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </exclusion> </exclusions>--> </dependency> <!-- springfox-swagger原生ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger2.version}</version> </dependency> <!--swagger-bootstrap-ui增强ui--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>${swagger-bootstrap-ui.version}</version> </dependency>
- 新建swagger2配置文件
/** * Swagger2的接口配置 */ @Configuration @EnableSwagger2 public class SwaggerConfig { /** * 创建API */ @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) .apiInfo(apiInfo()) // 设置哪些接口暴露给Swagger展示 .select() // 扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 扫描指定包中的swagger注解 //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) // 扫描所有 .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } /** * 添加摘要信息 */ private ApiInfo apiInfo() { // 用ApiInfoBuilder进行定制 return new ApiInfoBuilder() // 设置标题 .title("标题:若依管理系统_接口文档") // 描述 .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") // 作者信息 .contact(new Contact(Global.getName(), null, null)) // 版本 .version("版本号:" + Global.getVersion()) .build(); } }
- 访问文档管理页面
页面url:http://localhost:serverPort/doc.html - 常用注释
- @Api(tags = " ") //注释类
- @ApiOperation(value = " ") //注释方法
- 引入依赖
- 整合Apache Shiro
- 引入依赖
<!--Shiro核心框架 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <!-- Shiro使用Srping框架 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency>
- 引入依赖
代码实现
- 实现基本数据查询
- 创建目录
├── java │ ├── system │ │ ├── controller │ │ │ └── UserController.java //系统用户控制器 │ │ ├── dao │ │ │ └── UserDao.java │ │ ├── pojo │ │ │ └── domain │ │ │ │ └── UserDO.java │ │ ├── service │ │ │ ├── impl │ │ │ │ ├── UserServiceImpl.java │ │ │ └── UserService.java ├── resources │ ├── mapper │ │ ├── system │ │ │ └── UserMapper.xml
- UserController.java
@Controller @RequestMapping("/system/user") public class UserController{ @GetMapping("/list") @ResponseBody public List<UserDO> list(){ List<UserDO> list = userService.list(); return list; } }
- UserService.java
public interface UserService extends IService<UserDO> { }
- UserServiceImpl.java
@Service("userService") public class UserServiceImpl extends ServiceImpl<UserDao, UserDO> implements UserService { }
- UserDO.java
@TableName("sys_user") @Data public class UserDO implements Serializable { // Serializable对象序列化的接口 private static final long serialVersionUID = 1L; // 自增ID @TableId(type = IdType.AUTO) }
- UserDao
public interface UserDao extends BaseMapper<UserDO> { }
- UserMapper.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.mur.admin.system.Dao.UserDao"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.mur.admin.system.pojo.domain.UserDO"> <id column="id" property="id" /> <result column="username" property="username"/> </resultMap> </mapper>
- 创建目录