关于本文的大体框架在上一篇博客
一、SpringBoot 整合 Mybatis
(一)配置文件
引入 springboot 与 mybatis 整合包以及 java-connector
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
在 yml 配置文件中设置练级数据库参数,需要注意:yml 文件的值与前面的 ":" 之间有空格;不要把 username 写成 name,否则会有奇怪的 404 错误:Public Key Retrieval is not allowed。
#开发环境
server:
port: 8080
servlet:
context-path: /springboot01
#链接数据库参数
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC&allowPublicKeyRetrieval=true
name
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
(二)完成业务逻辑
要是一路从 spring 、mybatis 过来的相比下面的完全能理解。
sql
CREATE TABLE `book` (
`id` int NOT NULL AUTO_INCREMENT,
`book_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`book_author` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1.POJO
package com.qlu.springboot01.pojo;
@Data
@Accessors(chain = true)
public class Book {
private Long id;
private String bookName;
private String bookAuthor;
private Date createTime;
private Date updateTime;
}
2.controller
package com.qlu.springboot01.controller;
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/list")
public List<Book> list() {
return bookService.findAll();
}
}
3.service
package com.qlu.springboot01.service;
public interface BookService {
/**
* 查询所有
* @return
*/
List<Book> findAll();
}
//——————————————————————————————————————————————————————————————————
package com.qlu.springboot01.service.impl;
@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public List<Book> findAll() {
return bookMapper.listAll();
}
}
4.dao
直接采用注解的方式在对应的方法上写,再也不用 xml 文件,遥遥领先。
package com.qlu.springboot01.mapper;
@Mapper
public interface BookMapper {
@Select("select * from book")
List<Book> listAll();
}
可以看到他基本上是跑出来了
(三)解决 db 与 pojo 的对应关系
我们都知道在 java 中多单词属性采用的是驼峰命名法,在 db 中多单词字段采用的是短横线隔开的方式。在上面 Service 中 listAll 返回值要求是一个的是一个 Book 的 List ,就是把我们从数据库查出来的 book 的各个字段的值挨个 new 成 POJO 中的 Book 对象,但是 db 中的 book 字段与 POJO 不匹配,自然就是 null。
在Springboot中,可以通过设置map-underscore-to-camel-case属性为true来开启驼峰功能。
#数据库中字段与pojo字段对应
mybatis:
configuration:
map-underscore-to-camel-case: true
二、SpringBoot 配置文件
(一)Maven 插件打包
在 Idea 自动生成的 SpringBoot 项目会自动引入 Maven 的打包插件,默认将程序打为 jar 包。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
你还可以自定义打包后的名字,如下
(二)自定义 Application
在入门篇的时候,我们说过可以自定义引导类来调用 run 方法,下面是自行创建对象调用 SpringApplication 的成员方法,比如添加监视器等。
package com.qlu.springboot01;
@SpringBootApplication
public class Application {
public static void runServer(String[] args) {
SpringApplication.run(Application.class,args);
}
}
package com.qlu.springboot01;
@SpringBootApplication
public class Application {
public static void runServer(String[] args){
// SpringApplication.run(Application.class,args);
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.run(Application.class,args);
}
}
(三)配置文件的使用
在 SpringBoot 中有着 “约定大于配置” 的说法,所有的配置文件都是以 application 开头的,不管是 properties 还是 yml。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种[标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
1、yml 文件的基本用法
#properties 扁平化、键值对
server.port=9999
#yml 树状
server:
port: 7777
servlet:
context-path: /springboot01
相较于 properties 文件的键值对的 k-v 形式,yml 配置文件的机构是树状的,本质上也是键值对的数据;
yml 的 value 前面的 空格 不可省略,且 yml 配置中使用 缩进 来控制层级关系,相同缩进的在同一层次;
yml 的属性和值对大小写敏感,当有特殊字符(%、$等)应该使用单引号包起来。
2、配置文件的加载顺序
springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件
#工程根目录:./config/
#工程根目录:./
#classpath:/config/
#classpath:/
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置,如果是一个 pom 工程,工程的根目录指的是父工程和父工程下的 /config 。
感兴趣可以自己试一下,这里就不截图了。
如果在不同的目录中存在多个配置文件,properties优先级大于yml优先级,它的读取顺序是:
1、config/application.properties
2、config/application.yml
3、application.properties
4、application.yml
5、resources/config/application.properties
6、resources/config/application.yml
7、resources/application.properties
8、resources/application.yml
3、运行时配置文件的读取
如果在部署时显式的指定端口 / 目录,则会根据显式指定内容配置
java -jar xxxx.jar --server.port = 8087
也可以通过指定配置spring.config.location来改变默认配置,一般在项目已经打包后,我们可以通过指令 来加载外部的配置;
java -jar xxxx.jar --spring.config.location=D:\config\application.yml
java -jar xxxx.jar --spring.config.location=D:\config/
若不指定配置,则会在部署的时候自动加载 jar 包同级的配置文件,如果在发布时仅仅是指定了配置文件的位置目录,也会优先加载同 jar 包目录下的配置文件。
PS:要是你啥都不指定,jar包同目录也没有,那就是用的你内部的配置文件。
实测在2.7.11中优先级依次为
1、显式指定(即指定端口/路径 --server.port = 8087)
2、显式指定配置文件 / 配置文件位置
2、jar 包同目录
4、多环境开发
除了像下面这样选择激活某个环境,也可以在打包后使用 java -jar 选择配置文件中有的环境。
所以说上面的前提条件是 “内部的”。
#application.yml 激活某个环境
spring:
profiles:
active: dev
#开发环境 dev application-dev.yml
server:
port: 8080
#测试环境 test application-test.yml
server:
port: 8081
#生产环境 pro application-pro.yml
server:
port: 8082
使用命令
java -jar "模块" --spring.profiles.active = "环境名称" 即可
(四)配置文件的注入
1、value 普通值(String、boolean 、Interger..)
#注入值
bootversion: 1.1.0
package com.qlu.springboot01.controller;
@RestController
@RequestMapping("hello")
public class HelloController {
@Value("${bootversion}")
private String version;
@Autowired
private Person person;
@RequestMapping("h1")
public Map hello() {
Map<String,Object> map = new HashMap();
map.put("version",version);
return map;
}
2、注入对象
配置文件中写入对象信息
#person
person:
name: lisi
age: 22
flag: true
birth: 2022/01/01
map: {k1: v1,k2: v2}
list:
- a1
- a2
- a3
bean 放到容器中管理
package com.qlu.springboot01.bean;
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
private String name;
private Integer age;
private boolean flag;
private Date brith;
private Map map;
private List list;
}
@RequestMapping("h2")
public Map person() {
Map<String,Object> map = new HashMap();
map.put("mesg","success");
System.out.println(person);
return map;
}
根据这个原理,我们就可以把一些配置打成对象的形式放在 yml 文件中作为配置了,比如说 jdbc
#jdbcvalue
jdbc:
url: jdbc:mysql://3306
username: 12345
password: 12345
package com.qlu.springboot01.bean;
@Component
@Data
@ConfigurationProperties(prefix = "jdbc")
public class JdbcValue {
private String url;
private String username;
private String password;
}
@Autowired
private JdbcValue jdbc;
@RequestMapping("h3")
public Map jdbc() {
Map<String,Object> map = new HashMap();
map.put("mesg","jdbc");
System.out.println(jdbc);
return map;
}