SpringBoot02_Mybatis和配置文件

关于本文的大体框架在上一篇博客

一、SpringBoot 整合 Mybatis

(一)配置文件

​ 引入 springboot 与 mybatis 整合包以及 java-connector

copy
<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。image-20230507153206920

copy
#开发环境 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

copy
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

copy
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

copy
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

copy
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 文件,遥遥领先。

copy
package com.qlu.springboot01.mapper; @Mapper public interface BookMapper { @Select("select * from book") List<Book> listAll(); }

​ 可以看到他基本上是跑出来了

image-20230507154849516

(三)解决 db 与 pojo 的对应关系

​ 我们都知道在 java 中多单词属性采用的是驼峰命名法,在 db 中多单词字段采用的是短横线隔开的方式。在上面 Service 中 listAll 返回值要求是一个的是一个 Book 的 List ,就是把我们从数据库查出来的 book 的各个字段的值挨个 new 成 POJO 中的 Book 对象,但是 db 中的 book 字段与 POJO 不匹配,自然就是 null。

​ 在Springboot中,可以通过设置map-underscore-to-camel-case属性为true来开启驼峰功能。

copy
#数据库中字段与pojo字段对应 mybatis: configuration: map-underscore-to-camel-case: true

image-20230507160902526

二、SpringBoot 配置文件

(一)Maven 插件打包

​ 在 Idea 自动生成的 SpringBoot 项目会自动引入 Maven 的打包插件,默认将程序打为 jar 包。

copy
<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>

image-20230515181438741

​ 你还可以自定义打包后的名字,如下

image-20230516192228382

(二)自定义 Application

​ 在入门篇的时候,我们说过可以自定义引导类来调用 run 方法,下面是自行创建对象调用 SpringApplication 的成员方法,比如添加监视器等。

copy
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); } }

image-20230515114359601

(三)配置文件的使用

​ 在 SpringBoot 中有着 “约定大于配置” 的说法,所有的配置文件都是以 application 开头的,不管是 properties 还是 yml。

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种[标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

1、yml 文件的基本用法

copy
#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作为默认的配置文件

copy
#工程根目录:./config/ #工程根目录:./ #classpath:/config/ #classpath:/

​ 加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置,如果是一个 pom 工程,工程的根目录指的是父工程和父工程下的 /config 。

​ 感兴趣可以自己试一下,这里就不截图了。

image-20230515195139642

如果在不同的目录中存在多个配置文件,properties优先级大于yml优先级,它的读取顺序是:

copy
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、运行时配置文件的读取

​ 如果在部署时显式的指定端口 / 目录,则会根据显式指定内容配置

copy
java -jar xxxx.jar --server.port = 8087

​ 也可以通过指定配置spring.config.location来改变默认配置,一般在项目已经打包后,我们可以通过指令 来加载外部的配置;

copy
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中优先级依次为

copy
1、显式指定(即指定端口/路径 --server.port = 8087) 2、显式指定配置文件 / 配置文件位置 2、jar 包同目录

4、多环境开发

​ 除了像下面这样选择激活某个环境,也可以在打包后使用 java -jar 选择配置文件中有的环境。

​ 所以说上面的前提条件是 “内部的”。

copy
#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 = "环境名称" 即可

image-20230515201308422

(四)配置文件的注入

1、value 普通值(String、boolean 、Interger..)

copy
#注入值 bootversion: 1.1.0
copy
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; }

image-20230516102412646

2、注入对象

​ 配置文件中写入对象信息

copy
#person person: name: lisi age: 22 flag: true birth: 2022/01/01 map: {k1: v1,k2: v2} list: - a1 - a2 - a3

​ bean 放到容器中管理

copy
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; }
copy
@RequestMapping("h2") public Map person() { Map<String,Object> map = new HashMap(); map.put("mesg","success"); System.out.println(person); return map; }

image-20230516111944419

​ 根据这个原理,我们就可以把一些配置打成对象的形式放在 yml 文件中作为配置了,比如说 jdbc

copy
#jdbcvalue jdbc: url: jdbc:mysql://3306 username: 12345 password: 12345
copy
package com.qlu.springboot01.bean; @Component @Data @ConfigurationProperties(prefix = "jdbc") public class JdbcValue { private String url; private String username; private String password; }
copy
@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; }

image-20230516113904043

posted @   Purearc  阅读(346)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
🚀