快速搭建一个SpringBoot项目

SpringBoot 简介

Spring Boot 是由 Pivotal 团队提供的一套开源框架,可以简化 Spring 应用的创建及部署。它提供了丰富的 Spring 模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot 通过自动配置功能,降低了复杂性,同时支持基于 JVM 的多种开源框架,可以缩短开发时间,使开发更加简单和高效。

Spring Boot 官网地址 Getting Started | Building an Application with Spring Boot

Spring Boot 官方文档地址 Index of /spring-boot/docs/2.2.6.RELEASE/reference

父项目的创建

创建一个 Maven 项目,pom.xml 中实现版本的管理,标识是一个Spring Boot项目。

xml 复制代码
<!--标志是 springboot 的项目-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <junit.version>4.12</junit.version>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
    <dependencies>
        <!--springboot-web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.2</version>
        </dependency>
        <!--mybatis-spring-boot-starter-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>
    </dependencies>
</dependencyManagement>

创建一个子项目

IDEA 基本配置,配置目录结构

配置项目名和目录名一致

配置Maven依赖路径

配置 jdk 环境

pom.xml 文件中不需要加入版本了,父项目和子项目的关联自动生成,没有的需要自己手动添加。 编写主启动类,配置包扫描的路径

@SpringBootApplicationSpring Boot 的组合注解,标识这个类值项目的主启动类。主要目的是开启自动配置。

注解的源码如下

java 复制代码
package org.springframework.boot.autoconfigure;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};
	
	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;

}

@ComponentScan

1、开发者可以通过basePakage等属性来细粒度的定制@ComponentScan自动扫描的范围

2、如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。这就是Spring Boot的启动类为什么最好放在root package包下面的原因

@SpringBootConfiguration

此注解继承了@Configuration注解,功能基本一致,都标识了当前类是配置类,且会在当前类内声明一个或多个以@Bean注解标记的方法实例纳入到Spring容器中。并且实例方法就是方法名。

注解的源码如下

java 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

   @AliasFor(annotation = Configuration.class)
   boolean proxyBeanMethods() default true;

}

@Configuration

@Configuration注释类表明其主要目的是作为bean定义的源,继承了 @Component注解类 @Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系

注解的源码如下

less 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

   @AliasFor(annotation = Component.class)
   String value() default "";

   boolean proxyBeanMethods() default true;

}

@Component注解

标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean

less 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

   String value() default "";
}

@MapperScan("com.best.mapper")

mapper 包扫描的注解,扫描mapper层接口

SpringApplication.run(ApplicationClient.class,args);

run 方法主要作用是

1、创建一个SpringApplication对象,对象初始化时保存事件监听器,容器初始化类以及判断是否为web应用,保存包含main方法的主配置类。

2、利用创建好的对象执行run() 准备spring的上下文,完成容器的初始化,创建,加载等。会在不同的时机触发监听器的不同事件。下面是这个对象调用方法的源码

java 复制代码
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
   return run(new Class<?>[] { primarySource }, args);
}

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
   return new SpringApplication(primarySources).run(args);
}

Spring Boot 项目的主启动类

java 复制代码
@SpringBootApplication
@MapperScan("com.best.mapper")
public class ApplicationClient {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationClient.class,args);
    }
}

配置 application.yml,配置端口号,配置mybatis和数据源配置

yml 复制代码
# server
server:
  port: 80

# mybatis
mybatis:
  configuration:
    cache-enabled: true
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapper/*.xml

# spring
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/java?serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

实体类,对应数据库的字段

@Data 辣椒插件注解,标识类上,生成一个类的get/set、toString方法 @AllArgsConstructor 辣椒插件注解,标识在类上,生成类的有参构造 @NoArgsConstructor 辣椒插件注解,标识在类上,生成类的无参构造 @Accessors(chain = true) 辣椒插件注解,对象可链式写法

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;

    private String username;

    private String password;
}

mapper接口编写,推荐 MybatisX 插件

@Mapper 标识这个是Dao层接口的注解,mybatis可以扫描到这个接口

java 复制代码
@Mapper
public interface UserMapper {
    List<User> list();
}

service 接口

java 复制代码
public interface UserService {
    List<User> list();
}

service 接口实现类

@Service 标识这个实现类是业务层接口实现类

java 复制代码
@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> list() {
        return userMapper.list();
    }
}

mapperxml文件 编写 SQL语句的文件

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.best.mapper.UserMapper">
    
    <select id="list" resultType="com.best.entity.User">
        select *
        from user;
    </select>
</mapper>

控制器类

@RestController 复合注解标识了这个类是控制器,所有的方法默认由@ResponseBody注解修饰

源码如下

java 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

   @AliasFor(annotation = Controller.class)
   String value() default "";
}

@RequestMapping("/user") 标识请求的路径

@ResponseBodyjava对象转为json格式的数据

java 复制代码
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public ResponseData<List<User>> list() {
        log.info("查询全部 >>>   {} ", userService.list());
        return ResponseData.success("成功", userService.list());
    }

    /**
     * 需要返回一个 JSON 型的对象
     */
    @ResponseBody
    @GetMapping("/list2")
    public List<User> list2() {
        System.out.println(userService.list());
        return userService.list();
    }

}

数据库 ibd 文件备份

ibd文件是数据库建表时候生成的一个二进制文件,描述了表的结构和数据,文件还有与表头结构关联

mysql开启远程服务,可通过本机的ip实现远程连接

SQL 复制代码
mysql> use mysql;
Database changed
mysql> select host from user where user  = 'root';
+-----------+
| host      |
+-----------+
| localhost |
+-----------+
1 row in set (0.00 sec)

mysql> update user set host = '%' where user = 'root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select host from user where user  = 'root';
+------+
| host |
+------+
| %    |
+------+
1 row in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

MySQL 查看 idb 表存储位置

SQL 复制代码
mysql> show variables like '%datadir%';
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| datadir       | C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)

MySQL备份

SQL 复制代码
cd /d C:\ProgramData\MySQL\MySQL Server 8.0\Data\java

ibd2sdi --dump-file back.txt user.ibd
会生成一个 back.txt 文件存储 user 的信息

mysql> alter table user discard tablespace;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_java |
+----------------+
| user           |
| user_copy1     |
| user_copy2     |
| user_copy3     |
+----------------+
4 rows in set (0.01 sec)

但是文件没有了

mysql> alter table user import tablespace;
Query OK, 0 rows affected, 2 warnings (0.05 sec)

恢复文件
  
mysql> select * from user;
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
|      1 | 1        | 1        |
|      2 | 2        | 2        |
|      3 | 3        | 3        |
+--------+----------+----------+
3 rows in set (0.00 sec)

mysql> insert into user(userid,username,password) values (4,"a","a");
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
|      1 | 1        | 1        |
|      2 | 2        | 2        |
|      3 | 3        | 3        |
|      4 | a        | a        |
+--------+----------+----------+
4 rows in set (0.00 sec)

MySQL 的转储

SQL 复制代码
存储数据库文件
..\Data\java>mysqldump -u root -p java > dump.sql
Enter password: ******

拷贝数据库文件到 B 服务器

B 服务器中创建对应的数据库
create database java;

导入数据库文件到数据库中
..\Data\test>mysql -u root -p java < dump.sql
Enter password: ******

查看存储
C:\ProgramData\MySQL\MySQL Server 8.0\Data\test>mysql -u root -p
Enter password: ******
  
mysql> use java;
Database changed
mysql> show tables;
+----------------+
| Tables_in_java |
+----------------+
| user           |
| user_copy1     |
| user_copy2     |
| user_copy3     |
+----------------+
4 rows in set (0.00 sec)

mysql> select * from user;
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
|      1 | 1        | 1        |
|      2 | 2        | 2        |
|      3 | 3        | 3        |
|      4 | a        | a        |
|      5 | a        | a        |
+--------+----------+----------+
5 rows in set (0.00 sec)

mysql> insert into user (userid,username,password) values (6,"s","s");
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
|      1 | 1        | 1        |
|      2 | 2        | 2        |
|      3 | 3        | 3        |
|      4 | a        | a        |
|      5 | a        | a        |
|      6 | s        | s        |
+--------+----------+----------+
6 rows in set (0.00 sec)

两台服务器通过ibd文件导入

SQL 复制代码
A 机的数据库文件 ibd 文件导出传到 B 机上

B 机在数据库中创建和 ibd 表相同的表结构定义即可,插入一条数据

CREATE TABLE `user`  (
  `userid` int NOT NULL,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户密码',
  PRIMARY KEY (`userid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (4, 'a', 'a');
B 机 清除表空间
alter table user discard tablespace;

此时数据库中有表但是 Data 目录下没有 ibd 文件,但是数据库表无法查看

导入表空间后,A 机的表可用,可以添加数据
alter table user import tablespace;

INSERT INTO `user` VALUES (2, 'a', 'a');

数据库创建表的总结

所有的数据库表的设计添加 id 自增,tablename_id,create_time,update_time属性

阿里巴巴编程规范一定要看

相关推荐
向前看-2 小时前
验证码机制
前端·后端
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
AskHarries5 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion6 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp7 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder7 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚8 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心8 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴9 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲9 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端