1 概述
SpringBoot 和 Spring 关系
- Spring特指的是 SpringFramework【IoC、AOP】
- SpringBoot本质是是基于SpringFramework再封装的一个上层应用框架,简化各种配置,提升开发效率
- 因此,只要会了 Spring 和 SpringMVC,那么 SpringBoot 就很容易上手。
2 入门程序
2.1 快速创建
- 以 IDEA 开发工具为例
-
New Project
->Spring Initializr
-> 填写各种信息 -> 选择Spring Web
(其他则需选择,若是入门程序仅选择该项即可) ->Finish
-
默认项目结构
<!-- 默认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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn</groupId> <artifactId>spring-boot-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
简化项目结构
-
即默认生成的项目结构稍复杂,入门程序用不到那么多目录,可以删除。当然不删也行。
-
主要就是删除
.mvn
、mvnw
和mvnw.cmd
,以及resources
目录下的static
和templates
目录。 -
删除多余文件和目录后,项目结构如下
-
-
启动项目
- 直接运行自动生成的
SpringBootDemoApplication
类即可,略
- 直接运行自动生成的
2.2 手动引依赖
- 推荐该方式,因为快速创建SpringBoot工程需要去官网下载模板,国外网站有时比较慢访问不到
-
创建普通maven工程
-
引入依赖
<?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> <!--手动添加父项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn</groupId> <artifactId>spring-boot-demo2</artifactId> <version>1.0-SNAPSHOT</version> <!--手动修改版本(非必须)--> <properties> <java.version>11</java.version> </properties> <dependencies> <!--手动添加web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--手动添加测试依赖(非必须)--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
-
启动项目
-
启动类
App
(必须)package cn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
-
配置文件
application.yml
(非必须,默认端口8080)server: port: 8081
-
-
项目结构
3 web样例
- 使用 SpringBoot + mybatis 构建一个简单型web项目
环境搭建
-
SQL脚本
CREATE TABLE `t_users`( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL DEFAULT '', `gender` tinyint(4) NOT NULL DEFAULT '0' COMMENT '//1 male,2 female', `age` int(11) NOT NULL DEFAULT '0', `telphone` varchar(255) NOT NULL DEFAULT '', `register_mode` varchar(255) NOT NULL DEFAULT '' COMMENT '//byphone,bywechat,byalipay', `third_party_id` varchar(64) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `telphone_unique_index` (`telphone`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8; INSERT INTO `t_users` VALUES(1,'zhangsan',1,30,'18362610001','byphone',''); INSERT INTO `t_users` VALUES(15,'lisi',1,20,'18362610002','byphone',''); INSERT INTO `t_users` VALUES(20,'wangwu',1,1,'18362610003','byphone',''); INSERT INTO `t_users` VALUES(21,'zhaoliu',1,31,'18362610004','byphone',''); INSERT INTO `t_users` VALUES(22,'xiaohong',2,20,'18362610005','byphone','');
-
依赖
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>springboot-basic</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> </dependencies> </project>
-
配置文件
server: port: 8081 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: jdbc:mysql://192.168.192.133:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false mybatis: configuration: map-underscore-to-camel-case: true # 开启驼峰映射
编码
-
项目结构图
-
实体类
package cn.pojo; import lombok.Data; @Data public class User { private Integer id; private String name; private Integer gender; private Integer age; private String telphone; private String registerMode; private String thirdPartyId; }
-
持久层
package cn.mapper; import cn.pojo.User; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper { @Select("select * from t_users") List<User> findAll(); @Select("select * from t_users where id = #{id}") User findUserById(int id); }
-
控制层
package cn.controller; import cn.mapper.UserMapper; import cn.pojo.User; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController @RequestMapping("user") public class UserController { // 简单demo,业务层service略,直接调用持久层接口 @Resource private UserMapper userMapper; @RequestMapping("all") public List<User> findAll() { return userMapper.findAll(); } /** * 查询所有用户 * 访问 http://localhost:8081/user/all * 结果 * [ * { * "id": 1, * "name": "zhangsan", * "gender": 1, * "age": 30, * "telphone": "18362610001", * "registerMode": "byphone", * "thirdPartyId": "" * }, * { * "id": 15, * "name": "lisi", * "gender": 1, * "age": 20, * "telphone": "18362610002", * "registerMode": "byphone", * "thirdPartyId": "" * }, * { * "id": 20, * "name": "wangwu", * "gender": 1, * "age": 1, * "telphone": "18362610003", * "registerMode": "byphone", * "thirdPartyId": "" * }, * { * "id": 21, * "name": "zhaoliu", * "gender": 1, * "age": 31, * "telphone": "18362610004", * "registerMode": "byphone", * "thirdPartyId": "" * }, * { * "id": 22, * "name": "xiaohong", * "gender": 2, * "age": 20, * "telphone": "18362610005", * "registerMode": "byphone", * "thirdPartyId": "" * } * ] */ @RequestMapping("get") public User getUser(@RequestParam("id") Integer id) { return userMapper.findUserById(id); } /** * 查询指定用户(法一:普通url方式) * 访问 http://localhost:8081/user/get?id=1 * 结果 * { * "id": 1, * "name": "zhangsan", * "gender": 1, * "age": 30, * "telphone": "18362610001", * "registerMode": "byphone", * "thirdPartyId": "" * } */ @RequestMapping("{id}") public User findUser(@PathVariable Integer id) { return userMapper.findUserById(id); } /** * 查询指定用户(法二:restful格式) * 访问 http://localhost:8081/user/15 * 结果 * { * "id": 15, * "name": "lisi", * "gender": 1, * "age": 20, * "telphone": "18362610002", * "registerMode": "byphone", * "thirdPartyId": "" * } */ }
-
启动类
package cn; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan("cn/mapper") @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
-
访问接口进行测试
- 略,见第三步“控制层”中的注释
-
补充:SpringBoot测试类
package test; import cn.App; import cn.mapper.UserMapper; import cn.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.util.List; @SpringBootTest(classes = App.class) public class MyTest { @Resource private UserMapper userMapper; @Test public void testFindAll() { List<User> users = userMapper.findAll(); users.forEach(user -> System.out.println(user)); /** * 配置文件application.yml中开启驼峰映射 * (注: thirdPartyId 没有结果是因为数据库表中没有值) * User(id=1, name=zhangsan, gender=1, age=30, telphone=18362610001, registerMode=byphone, thirdPartyId=) * User(id=15, name=lisi, gender=1, age=20, telphone=18362610002, registerMode=byphone, thirdPartyId=) * User(id=20, name=wangwu, gender=1, age=1, telphone=18362610003, registerMode=byphone, thirdPartyId=) * User(id=21, name=zhaoliu, gender=1, age=31, telphone=18362610004, registerMode=byphone, thirdPartyId=) * User(id=22, name=xiaohong, gender=2, age=20, telphone=18362610005, registerMode=byphone, thirdPartyId=) * * 配置文件application.yml中关闭驼峰映射 * (registerMode和thirdPartyId直接为null,说明没有映射上。因为数据库字段使用的下划线而User类中属性用的驼峰) * User(id=1, name=zhangsan, gender=1, age=30, telphone=18362610001, registerMode=null, thirdPartyId=null) * User(id=15, name=lisi, gender=1, age=20, telphone=18362610002, registerMode=null, thirdPartyId=null) * User(id=20, name=wangwu, gender=1, age=1, telphone=18362610003, registerMode=null, thirdPartyId=null) * User(id=21, name=zhaoliu, gender=1, age=31, telphone=18362610004, registerMode=null, thirdPartyId=null) * User(id=22, name=xiaohong, gender=2, age=20, telphone=18362610005, registerMode=null, thirdPartyId=null) */ } @Test public void testFindUserById() { User user = userMapper.findUserById(1); System.out.println(user); // User(id=1, name=zhangsan, gender=1, age=30, telphone=18362610001, registerMode=byphone, thirdPartyId=) } }
- 源码链接 blogs-springboot