SpringBoot 来玩转以前的 SSM

  • 1、创建测试数据库表
  • 2 创建项目
  • 3 配置 Maven
  • 4 加入依赖 pom.xml
  • 4.1 添加 SpringBoot 父工程坐标
  • 4.2 添加 web 启动器
  • 4.3 管理 JDK 版本
  • 4.4 java jps依赖
  • 4.5 目前的 pom.xml
  • 5 整合 SpringMVC
  • 5.1 SpringBoot 启动类
  • 5.2 创建实体类 User
  • 5.3 修改端口
  • 5.4 访问静态资源
  • 5.5 初步测试
  • 5.5 如果出现中文乱码问题
  • 5.6 配置日志级别
  • 5.7 添加拦截器
  • 6 整合 jdbc 和事务
  • 7 整合连接池
  • 7.1 HikariCP 连接池 Mysql5.X
  • 7.2 Mysql6.X 以上
  • 7.3 Druid 连接池
  • 8 整合 mybatis
  • 8.1 mybatis
  • 8.2 通用 mapper
  • 8.3 修改启动类
  • 8.4 创建 Service
  • 8.5 创建 controller
  • 9 运行项目
  • 10 项目地址


1、创建测试数据库表

# 创建 spring boot 测试数据库
CREATE DATABASE IF NOT EXISTS db_sb;

# 创建 spring boot 测试数据表
CREATE TABLE IF NOT EXISTS `user_info`(
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(60) DEFAULT NULL COMMENT '用户笔名',
  `password` varchar(60) DEFAULT NULL COMMENT '用户密码',
  `realname` varchar(60) DEFAULT NULL COMMENT '用户真实姓名',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `gender` int(2) DEFAULT NULL COMMENT '性别:0-男,1-女',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  `updatetime` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

# 插入两条数据
insert into `user_info` (`id`, `username`, `password`, `realname`, `birthday`, `gender`, `createtime`, `updatetime`) 
values('1','zhangqi','123456789qaz','张柒','2020-12-12','1','2020-12-12 10:03:52','2020-12-12 10:03:55');
insert into `user_info` (`id`, `username`, `password`, `realname`, `birthday`, `gender`, `createtime`, `updatetime`)
values('2','lisi','qazwsxedc123','李四','2020-12-13','0','2020-12-13 10:04:17','2020-12-13 10:04:21');

2 创建项目

(1)创建一个 maven 项目:

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring


(2)创建项目组ID 和名称

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring_02


(3)创建项目名以及项目存储路径

spring boot pagehelper mysql 设置方言 springboot改成ssm_MVC_03

(4)选择依赖导包方式:

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring_04

3 配置 Maven

spring boot pagehelper mysql 设置方言 springboot改成ssm_java_05


spring boot pagehelper mysql 设置方言 springboot改成ssm_java_06

4 加入依赖 pom.xml

4.1 添加 SpringBoot 父工程坐标

<!-- 添加 SpringBoot 父工程坐标-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

4.2 添加 web 启动器

为了让 SpringBoot 帮我们完成各种自动配置,我们必须引入 SpringBoot 提供的自动配置依赖,我们称为启动器。因为我们是 web 项目,这里我们引入 web 启动器:

<dependencies>
    	<!-- 添加 web 启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

4.3 管理 JDK 版本

<!-- 管理jdk版本 -->
    <properties>
        <java.version>1.8</java.version>
    </properties>

4.4 java jps依赖

<!-- java jps依赖 @Table @Id 等注解 -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>

4.5 目前的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.zc.sb</groupId>
    <artifactId>springboot-study</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 添加 SpringBoot 父工程坐标-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

    <!-- 管理jdk版本 -->
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 添加 web 启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 实体类操作 lombok @Data 等注解-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
        <!-- java jps依赖 @Table @Id 等注解 -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
</project>

其中 lombok 需要 IDEA 安装插件:

spring boot pagehelper mysql 设置方言 springboot改成ssm_MVC_07


spring boot pagehelper mysql 设置方言 springboot改成ssm_spring_08


提示需要重启 IDEA 生效。

5 整合 SpringMVC

虽然默认配置已经可以使用 SpringMVC 了,不过我们有时候需要进行自定义配置。

5.1 SpringBoot 启动类

SpringBoot 项目通过 main 函数即可启动,我们需要创建一个启动类:
java 资源目录下创建包 com.zc ,在包 zc 下创建类 **BootStudyApplicaton **:

package com.zc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @作者: zc
 * @时间: 2021/1/28 17:30
 * @描述: SpringBoot 启动类
 */
@SpringBootApplication
public class BootStudyApplicaton {
    public static void main(String[] args) {
        SpringApplication.run(BootStudyApplicaton.class, args);
    }
}

5.2 创建实体类 User

java 资源目录下创建包 com.zc.pojo ,在包 pojo 下创建类 User

package com.zc.pojo;

import lombok.Data;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Date;
import java.sql.Timestamp;

/**
 * @作者: zc
 * @时间: 2021/1/28 17:02
 * @描述: 实体类
 *          lombok 依赖注解 @Data 加载属性 getter setter 方法
 */
@Table(name = "user_info")
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String username;
    private String password;
    private String realname;
    private String birthday;
    private Integer gender;
    private String createtime;
    private String updatetime;
}

5.3 修改端口

SpringBoot 默认加载配置文件是 application.properties ,在资源目录 resources 下新建该文件:

# 映射端口
server.port=80

访问地址就从 localhost:8080 变为 localhost:80(80 端口可省略)。

5.4 访问静态资源

现在,我们的项目是一个 jar 工程,那么就没有 webapp,我们的静态资源该放哪里呢?

回顾博客:了解 SpringBoot 的自动配置原理 在该博客目录 2.2 默认配置属性 ResourceProperties 类中主要定义了就定义了静态资源的默认查找路径:

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring_09


默认的静态资源路径为:

A、classpath:/META-INF/resources/

B、classpath:/resources/

C、classpath:/static/

D、classpath:/public/

只要静态资源放在这些目录中任何一个,SpringMVC 都会帮我们处理。

我们习惯会把静态资源放在classpath:/static/目录下。

我们在项目资源目录 resources 下创建目录 static,并且添加一些静态资源 test.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
<h2>这个一个测试的 HTML 文件</h2>
</body>
</html>

5.5 初步测试

启动 SpringBoot :

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring boot_10


在浏览器地址栏输入:http://localhost/test.html

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring boot_11


测试成功!

此时日志什么都没有,我们需要 debug 级别日志,默认显示 info 级别以上的;

5.5 如果出现中文乱码问题

在配置文件 application.properties 中加入:

# 解决中文乱码的问题
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8

5.6 配置日志级别

在项目资源目录 resources 下新建文件 application.yml

#配置日志级别
logging:
  level:
    com.zc: debug                 #包名: 级别 (参数是一个map,可以配置多个)
    org.springframework: debug

5.7 添加拦截器

(1)拦截器也是我们经常需要使用的,在 SpringBoot 中该如何配置呢?
拦截器不是一个普通属性,而是一个类,所以就要用到 java 配置方式了。
在 SpringBoot 官方文档中有这么一段说明:

If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

翻译:

如果你想要保持Spring Boot 的一些默认MVC特征,同时又想自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),你应该让一个类实现WebMvcConfigurer,并且添加@Configuration注解,但是千万不要@EnableWebMvc注解。如果你想要自定义HandlerMappingHandlerAdapterExceptionResolver等组件,你可以创建一个WebMvcRegistrationsAdapter实例 来提供以上组件。

如果你想要完全自定义SpringMVC,不保留SpringBoot提供的一切特征,你可以自己定义类并且添加@Configuration注解和@EnableWebMvc注解。

总结:通过实现 WebMvcConfigurer并添加@Configuration注解来实现自定义部分SpringMvc配置。

(2)首先我们定义一个拦截器:
java 资源目录下新建包 com.zc.interceptor ,包下新建类 LoginInterceptor :

package com.zc.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @作者: zc
 * @时间: 2021/1/28 17:50
 * @描述: 拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
                             Object handler) {
        logger.debug("preHandle method is now running!");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) {
        logger.debug("postHandle method is now running!");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                Object handler, Exception ex) {
        logger.debug("afterCompletion method is now running!");
    }
}

(3)然后,我们定义配置类,注册拦截器:
java 资源目录下新建包 com.zc.config ,包下新建类 MvcConfig:

package com.zc.config;

import com.zc.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @作者: zc
 * @时间: 2021/1/28 17:52
 * @描述: 配置类注册拦截器
 */
public class MvcConfig implements WebMvcConfigurer {
    /**
     * 通过@Bean注解,将我们定义的拦截器注册到Spring容器
     * @return
     */
    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

    /**
     * 重写接口中的addInterceptors方法,添加自定义拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 通过 registry 来注册拦截器,通过 addPathPatterns 来添加拦截路径
        registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
    }
}

(4)结构如下:

spring boot pagehelper mysql 设置方言 springboot改成ssm_MVC_12


接下来运行并查看日志:

因为我们记录的 log 级别是 debug,默认是显示 info 以上,我们需要进行配置(上面已经在 application.yml 中配置)。

SpringBoot 通过 logging.level.*=debug 来配置日志级别,*填写包名:

如果 application.yml 中没有配置,可在 application.properties 中配置:

#设置 com.zc 包的日志级别为 debug (上面yml己写)
logging.level.com.zc=debug

创建日志对象可以用注解替代:

spring boot pagehelper mysql 设置方言 springboot改成ssm_MVC_13

6 整合 jdbc 和事务

spring 中的 jdbc 连接和事务是配置中的重要一环,在 SpringBoot 中该如何处理呢?
答案是不需要处理,我们只要找到 SpringBoot 提供的启动器即可:

<!-- SpringBoot 提供的 jdbc 和事务配置的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

当然,不要忘了数据库驱动,SpringBoot 并不知道我们用的什么数据库,这里我们选择 MySQL:

<!-- Mysql 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

至于事务,SpringBoot 中通过注解来控制。就是我们熟知的@Transactional

7 整合连接池

7.1 HikariCP 连接池 Mysql5.X

其实,在刚才引入 jdbc 启动器的时候,SpringBoot 已经自动帮我们引入了一个连接池:

spring boot pagehelper mysql 设置方言 springboot改成ssm_spring_14


HikariCP 应该是目前速度最快的连接池了,我们看看它与 c3p0 的对比:

spring boot pagehelper mysql 设置方言 springboot改成ssm_java_15


因此,我们只需要指定连接池参数即可:

配置文件 application.properties

mysql5.X 的版本:

# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/db_sb?characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10

7.2 Mysql6.X 以上

mysql6.X 以上的版本(application.yml):

spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_sb?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
    type: com.mysql.cj.jdbc.MysqlDataSource

mysql6.X 以上的版本 application.properties :

spring.datasource.url=jdbc:mysql://localhost:3306/db_sb?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.mysql.cj.jdbc.MysqlDataSource

7.3 Druid 连接池

当然,如果你更喜欢 Druid 连接池,也可以使用 Druid 官方提供的启动器:

<!-- Druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

而连接信息的配置与上面是类似的,只不过在连接池特有属性上,方式略有不同:

#初始化连接数
spring.datasource.druid.initial-size=1
#最小空闲连接
spring.datasource.druid.min-idle=1
#最大活动连接
spring.datasource.druid.max-active=20
#获取连接时测试是否可用
spring.datasource.druid.test-on-borrow=true
#监控页面启动
spring.datasource.druid.stat-view-servlet.allow=true

8 整合 mybatis

8.1 mybatis

(1)SpringBoot 官方并没有提供 Mybatis 的启动器,不过 Mybatis官网自己实现了:

<!--mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

(2)配置,基本没有需要配置的:

# mybatis 别名扫描
mybatis.type-aliases-package=com.zc.pojo
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml
#开启驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true

(3)需要注意,这里没有配置 mapper 接口扫描包,因此我们需要给每一个 Mapper 接口添加 @Mapper 注解,才能被识别。

@Mapper
public interface UserMapper {
}

8.2 通用 mapper

通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可:
github项目地址

<!-- 通用mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

如果导入了通用 Mapper 的启动器,就不需要在 pom.xml 配置连接池和 mybatis 了,注释掉:

<!--

        <!– SpringBoot 提供的 jdbc 和事务配置的启动器 –>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!– mybatis 启动器 –>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
-->

不需要做任何配置就可以使用了。
在项目 java 资源目录新建包 com.zc.mapper ,在包下新建接口类 UserMapper:

package com.zc.mapper;

import com.zc.pojo.User;
import tk.mybatis.mapper.common.Mapper;

/**
 * @作者: zc
 * @时间: 2021/1/28 18:18
 * @描述: 映射接口类,继承的类中实现了数据表操作
 */

public interface UserMapper extends Mapper<User> {
}

8.3 修改启动类

package com.zc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * @作者: zc
 * @时间: 2021/1/28 17:30
 * @描述: SpringBoot 启动类
 */
@SpringBootApplication
// 注意使用了导入通用 mapper 包下 tk.mybatis....MapperScan
@MapperScan({"com.zc.mapper"})
public class BootStudyApplicaton {
    public static void main(String[] args) {
        SpringApplication.run(BootStudyApplicaton.class, args);
    }
}

8.4 创建 Service

在项目 java 资源目录新建包 com.zc.service ,在包下新建接口类 UserService:

package com.zc.service;

import com.zc.mapper.UserMapper;
import com.zc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @作者: zc
 * @时间: 2021/1/28 18:17
 * @描述: jdbc 和事务配置
 */
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryById(long id){
        return userMapper.selectByPrimaryKey(id);
    }

    // 事务
    @Transactional
    public void insertUser(User user){
        userMapper.insert(user);
    }

}

如果 userMapper 报错变红,Alt + Enter 选择第一项再回车,再选择带 “X” dis… 的选项,去除错误标志。

8.5 创建 controller

在项目 java 资源目录新建包 com.zc.controller ,在包下新建接口类 UserController:

package com.zc.controller;

import com.zc.pojo.User;
import com.zc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @作者: zc
 * @时间: 2021/1/29 10:26
 * @描述: Controller 层,获取数据返回页面
 */

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/hello")
    public User hello() {
        User user = this.userService.queryById(1);
        return user;
    }
}

9 运行项目

地址栏输入:http://localhost/hello

spring boot pagehelper mysql 设置方言 springboot改成ssm_java_16


页面得到 User 对象的 Json 数据。

如果页面报以下错:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jan 29 10:33:01 CST 2021
There was an unexpected error (type=Internal Server Error, status=500).
nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. ### The error may exist in com/zc/mapper/UserMapper.java (best guess) ### The error may involve com.zc.mapper.UserMapper.selectByPrimaryKey ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

数据库 url 连接的后缀缺少 serverTimezone=UTC:

spring.datasource.url=jdbc:mysql://localhost:3306/db_sb?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false

10 项目地址

此学习项目地址:
github-springboot-study