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 项目:
(2)创建项目组ID 和名称
(3)创建项目名以及项目存储路径
(4)选择依赖导包方式:
3 配置 Maven
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 安装插件:
提示需要重启 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 类中主要定义了就定义了静态资源的默认查找路径:
默认的静态资源路径为:
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 :
在浏览器地址栏输入:http://localhost/test.html
测试成功!
此时日志什么都没有,我们需要 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 typeWebMvcConfigurer
but without@EnableWebMvc
. If you wish to provide custom instances ofRequestMappingHandlerMapping
,RequestMappingHandlerAdapter
, orExceptionHandlerExceptionResolver
, you can declare aWebMvcRegistrationsAdapter
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
注解。如果你想要自定义HandlerMapping
、HandlerAdapter
、ExceptionResolver
等组件,你可以创建一个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)结构如下:
接下来运行并查看日志:
因为我们记录的 log 级别是 debug,默认是显示 info 以上,我们需要进行配置(上面已经在 application.yml
中配置)。
SpringBoot 通过 logging.level.*=debug
来配置日志级别,*填写包名:
如果 application.yml
中没有配置,可在 application.properties
中配置:
#设置 com.zc 包的日志级别为 debug (上面yml己写)
logging.level.com.zc=debug
创建日志对象可以用注解替代:
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 已经自动帮我们引入了一个连接池:
HikariCP 应该是目前速度最快的连接池了,我们看看它与 c3p0 的对比:
因此,我们只需要指定连接池参数即可:
配置文件 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
页面得到 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