要想创建springboot项目,首先得要有MAVEN(项目管理jar包依赖工具) 如果没有,可以参考一下这篇博客:(1条消息) 菜鸟教你如何安装MAVEN(还是不会,我把电脑吃咯)_Brilliant.Louis的博客-CSDN博客_maven安装不上
然后打开idea,将安装maven的本地路径设置为默认,这样以后每次创建新项目就不用每次都要重新设置maven的路径了。
Build->Build Tools->Maven
ps:要点击Override按钮,这样才能选中自己安装的maven文件的路径了。这作用相当于将maven的安装路径设置为全局控制了!
基于IDEA
new project(创建一个新工程)->选中Spring Initializr
设置springboot的版本2.x
基于国外官网
https://start.spring.io(步骤如上一致,只是界面不一样而已)
默认地址Default为spring官网
自定义custom国内官网:https://start.aliyun.com(更快)
博客详述:(2条消息) springboot系列(一):如何创建springboot项目及启动?| 超级详细,建议收藏_springboot 项目启动_bug菌¹的博客-CSDN博客
基于手工(了解即可)
步骤
1)创建普通的Maven工程
2)继承spring-boot-starter-parent
<parent>
<groupId>模块名groupId>
<artufactUd>spring-boot-starter-parentartufactUd>
<version>自己选用的springboot的版本号version>
parent>
3)添加spring-boot-starter-web依赖(pom.xml)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
4)制作引导类Application(模仿上面的springboot项目模板内容…)
注意:以上四个方案都要联网联网联网!!!
创建后,pom.xml文件没有蓝色标识,页面没有maven面板
解决的博客:(2条消息) Maven面板不见了怎么办(pom.xml被忽略,pom.xml文件变成灰色,并且有一个删除线怎么办)_�欢快↑㎡的博客-CSDN博客_idea的pom文件不见了
Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found
解决的博客:(2条消息) Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin: 解决办法_大王我亲自来巡山的博客-CSDN博客
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.7.7version>
plugin>
plugins>
build>
Cannot resolve org.apache.tomcat.embed:tomcat-embed-core:9.0.60标红解决办法
解决的博客:(2条消息) Cannot resolve org.apache.tomcat.embed:tomcat-embed-core:9.0.60标红解决办法_爱吃面包的小胖墩的博客-CSDN博客
<properties>
<java.version>1.8java.version>
<tomcat.version>9.0.60tomcat.version>
properties>
应用场景
当创建多个Module(模块)时,会有多个模块(多个Pom.xml),而这多个模块需要同一个jar包,万一出现该jar包内容改变了,就必须每个安装此jar的项目都要进行更改,这样不灵活,“不解耦”。
方法
<dependencies>
<dependency>
<groupId>项目名groupId>
<artifactId>包名artifactId>
<version>${某jar包.version}version>
dependency>
dependencies>
<parent>
<artifactId>父类项目名artifactId>
<groupId>包名groupId>
<version>版本号version>
parent>
ps:对坐标的具体介绍:(1条消息) Maven项目中依赖的groupId和artifactId标签的含义?_groupid标签_贝贝才不是小淘气的博客-CSDN博客
应用场景
其实是对parent标签补充使用标签。在父类项目中有多个子模块,其中的子模块并不是所有的模块都需要共用多个相同的jar包,这样只在子项目中使用parent标签显然不能对付此问题。
方法
在父类Pom.xml文件中使用dependencyManagement标签
引入两个依赖并使用dependencyManagement标签
<dependencyManagement>
<dependencies>
<dependency>
<groupId>xxxgroupId>
<artifactId>xxxartifactId>
<version>${xxxx.version}version>
dependency>
<dependency>
<groupId>xxxgroupId>
<artifactId>xxxartifactId>
<version>${xxx.version}version>
dependency>
dependencies>
dependencyManagement>
<parent>
<artifactId>父类项目名artifactId>
<groupId>包名groupId>
<version>xxxversion>
<relativePath>../父类项目名/pom.xmlrelativePath>
parent>
<dependencies>
<dependency>
<groupId>xxxgroupId>
<artifactId>xxxartifactId>
dependency>
dependencies>
作用
使用dependencyManagement可以统一管理项目的版本号,确保应用的各个子项目的依赖和版本一致,达到了统一管理版本号的目的,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改。
如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。如果不声明版本号的话,默认会使用父类的版本号。
(1条消息) 自定义Starter详细教程_风清扬鍀师傅的博客-CSDN博客
详细介绍了starter(自身现在能力不够,只能引用他人博客进行记录学习了)
定义
是boot工程的执行入口,运行main方法就可以启动项目
功能
springboot工程运行创建并初始化spring容器,扫描引导类所在的包加载bean对象
原理
将Tomcat服务器当做对象运行,并将对象交给Spring容器管理
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<version>2.7.7version>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcatartifactId>
<version>2.7.7version>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jettyartifactId>
dependency>
内置服务器(目前了解)
tomcat(默认)
应用面广,负载了若干较重的组件
jetty
更轻量级,负载性能远不及tomcat
undertow
负载性能勉强跑赢tomcat
定义
//传统风格资源描述形式
http://localhost/user/getById?id=1
http://localhost/user/saveUser
//REST风格描述形式
http://localhost/user/1
http://localhost/user
优点
隐藏资源的访问行为,无法通过地址得知对资源是何种操作
问题:那如何判断访问形式呢?(重点)
书写简洁
注意
REST风格代码展示
//@Controller
//把@ResponseBody提前 相当于全局变量 requestMapping映射的第一地址提前 也是当做成全局变量来使用
@RestController
@ResponseBody
@RequestMapping("/users")//映射的一级标题
public class UserController {
// @RequestMapping(value="/users",method=RequestMethod.POST)//映射的一级标题
@PostMapping
//@ResponseBody//反应主体 返回值response
public String save (){//请求参数
return "{'module:'user save'}";
}
// @RequestMapping(value = "/users/{id}",method=RequestMethod.DELETE)//映射的一级标题
@DeleteMapping("/{id}")
//@ResponseBody//反应主体 返回值response
public String delete (@PathVariable Integer id){//请求参数
return "{'module:'user delete'}"+id;
}
// @RequestMapping(value="/users",method=RequestMethod.PUT)//映射的一级标题
@PutMapping
//@ResponseBody//反应主体 返回值response
public String update (@RequestBody User user){//请求参数
return "{'module:'user update'}";
}
// @RequestMapping(value="/users{id}",method=RequestMethod.GET)//映射的一级标题
//@ResponseBody//反应主体 返回值response
@GetMapping("/{id}")
public String getById (@PathVariable Integer id){//请求参数
return "{'module:'user getById'}";
}
// @RequestMapping(value="/users",method=RequestMethod.GET)//映射的一级标题
//@ResponseBody//反应主体 返回值response
@GetMapping()
public String getAll (){//请求参数
return "{'module:'user getAll'}";
}
}
属性配置
修改服务器端口
#application.properties文件中
#在properties写键值对 key and value
server.port=xxxx
修改banner(springboot)
spring.main.banner-mode=off
logging.level.root=info
除了这些,还有很多基础配置 都可以在官方文档查到 并在properties文件中设置
配置文件
properties文件(传统文件/默认格式)
server.port=80
yaml文件
server:
port: 81
yml文件(主流)
# 键值对为主导
server:
port: 82
注意:当三个文件共存叠加时,主导权properties>yml>yaml(有内容相同时,就有先后的加载情况,如果内容不相同,都会保留下来)
语法
核心规则:数据前面要加空格
user:
-
name: zhangsan
age: 18
-
name: lisi
age: 17
#用-表示对象的更换 可以与-换行 使得更简洁明了
java程序读取yml文件的单一数据
//读取yml文件的单一数据
@Value("${country}")
private String country1;
//读取对象属性
@Value("${user.name}")
private String name;
//读取对象数组
@Value("${user1[1].age}")
private int age;
Java程序读取yml文件的全部数据
//自动装配将所有的数据封装到Environment
@Autowired
private Environment env;
@GetMapping//请求模式 get提交 无二级路径
public String getById(){
System.out.println(env.getProperty("user.name"));
System.out.println(env.getProperty("user1[1].age"));
return "spring_boot is running...";
}
Java程序读取局部数据
自定义对像封装指定数据
自定义对象(yml文件)
定义一个类(java程序)
@Component
@ConfigurationProperties(prefix = "enterprise")//通过前缀enterprise在yml文件中找到指定的类
public class Enterprise {
private String name;
private int age;
private String []subject;
}
# yml中的对象
enterprise:
name: louis
age: 20
tel: 14754856065
subject:
- java
- 前端
- 大数据
重复代码复用
使用SpEL书写规范
# 使用${属性名}引用数据
baseDir: c:\win10
tempDir: ${baseDir}\temp
# 用引号(双引号)包裹的字符串 其中的转义字符可以生效\t
tempDir2: "${baseDir}\temp \t1 \t2 t3"
名称:@SpringBootTest
类型:测试类注解
位置:测试类定义上方
作用:设置JUnit加载SpringBoot启动类
范例
//此代码在ApplicationTests类中
@SpringBootTest(classes=引导类名.class)
//如果测试类所在包的位置不同于引导类所在的包的话 需要指明引导类名.class 如果相同 则不用写~ 因为找的话是从测试类所在的包下以及引导类所在的包下是否有@SpringBootConfiguration
//@Configuration(classes=引导类.class)也可以写上
class ApplicationTests{}
//我自个代码样例
@SpringBootTest
class ApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
for (int i = 0; i < 100; i++) {
System.out.println(bookDao.getById(i));
}
}
}
@Mapper
public interface BookDao {
@Select("select * from t_order_item where id =#{id}")//sql语句查询
public Book getById(int id);
}
相关属性
classes:设置SpringBoot启动类
整合内容
核心配置:数据库连接相关信息
映射配置:SQL映射(xml/注解)
#核心配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/book
username: root
password: xxx
//映射配置@Mapper用于被容器识别
@Mapper
public interface BookDao {
@Select("select * from t_order_item where id =#{id}")//sql语句查询
public Book getById(int id);
}
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>3.0.0version>
dependency>
整合内容
@Mapper//作用mapper映射到spring容器中 让其管理
public interface BookDao extends BaseMapper<Book> {
}
//有很多的增删改查的方法可以直接调用
依赖(坐标)内容
Mybatis-plus(得自己配)
官网:Maven Repository: com.baomidou » mybatis-plus-boot-starter » 3.4.3 (mvnrepository.com)
Mysql Driver
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.3version>
dependency>
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<scope>runtimescope>
dependency>
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/book
username: root
password: xxx
#在mybatis的基础上再配置对表名的指定
mybatis-plus:
global-config:
db-config:
table-prefix: t_order_item #要查寻数据对应的表名
依赖内容
Mybatis Framework
Mysql Driver
Druid
Maven Repository: com.alibaba » druid » 1.2.15 (mvnrepository.com)
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.3.0version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.15version>
dependency>
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<scope>runtimescope>
dependency>
#两种配置都行 建议使用第二种(结果第一种可以运行...)
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/book
# username: root
# password: xxx
# type: com.alibaba.druid.pool.DruidDataSource
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/book
username: root
password: xxx
这里就先不介绍讲解SpringData JPA的用法了,只介绍如何在springboot项目中整合。
SpringData JPA依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
Mysql驱动依赖
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<scope>runtimescope>
dependency>
#自动生成数据库表(关键)
spring.jpa.hibernate.ddl-auto=update
#mysql数据库连接配置(非常重要)默认端口3306
spring.datasource.url = jdbc:mysql://localhost:3306/springbootjpa?serverTimezone=Asia/Shanghai
#数据库用户名 默认为root
spring.datasource.username = root
#数据库密码(只有有你知道)
spring.datasource.password = xxx
#mysql数据库驱动程序(重要)
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#jpa配置:在控制台显示Hibernate的sql(可选) false也行
spring.jpa.show-sql = true
#其他配置:关闭Thymeleaf 的缓存
spring.thymeleaf.cache = false
欲知如何使用整合的jpa 且听我下篇博客吧~
附:开发一点点心得
后端开发流程
实体类开发
导入lombok坐标依赖(创建springboot工程模块时,可以勾选依赖)
注意:实体类对应一个表 要加上标签@TableName 指定要查询的表
domain层 使用lombok简化实体类创建
@Data//提供了构造器和getter和setter方法 toString方法 equals hashCode
//使用lombok.Data 简化(PoJo)实体类开发
@TableName("t_order_item")//查询的表名
public class Book {
private Integer id;
private String name;
private int count;
private double price;
private double total_price;
private String order_id;
}
数据层开发
技术实现法案
MybatisPlus
Druid(数据源)
注意:Druid配置 id应该遵守auto
mybatis-plus:
global-config:
db-config:
table-prefix: t_order_item #查询的表名
id-type: auto
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #mybatisplus 日志 设置为标准输出
开发Dao接口(继承BaseMapper)
制作测试类(增删查改)
制作分页拦截器Interceptor
@Configuration
public class MPConfig {
//分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());//具体的分页拦截器
return interceptor;
}
}
表现层(控制层)
Rest风格
接收参数
前后端数据格式统一
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public List<Book> getAllBooks(){
return bookService.getAll();
}
@PostMapping
public void saveBook(@RequestBody Book book){
bookService.add(book);
}
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable Integer id){
bookService.delete(id);
}
@PutMapping
public void updateBook(@RequestBody Book book){
bookService.update(book);
}
@GetMapping("/{name}")
public void getByBookName(@RequestBody String name){
bookService.getByName(name);
}
}
前端数据获取三步走
图中遇到的问题:
路径重名 Mapping映射到spring容器的地址重名了 需要将其改掉即可
(3条消息) There is already ‘xxxController‘ bean method_Hubz131的博客-CSDN博客