快速搭建一个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属性

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

相关推荐
程序员爱钓鱼1 小时前
Go语言实战案例-创建模型并自动迁移
后端·google·go
javachen__1 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
uzong7 小时前
技术故障复盘模版
后端
GetcharZp7 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程7 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研7 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi8 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国9 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy9 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack9 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt