SpringBoot02_Mybatis和配置文件

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

一、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。image-20230507153206920

#开发环境
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();
}

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

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来开启驼峰功能。

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

image-20230507160902526

二、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>

image-20230515181438741

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

image-20230516192228382

(二)自定义 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);
    }
}



image-20230515114359601

(三)配置文件的使用

​ 在 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 。

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

image-20230515195139642

如果在不同的目录中存在多个配置文件,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 = "环境名称" 即可

image-20230515201308422

(四)配置文件的注入

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

image-20230516102412646

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

image-20230516111944419

​ 根据这个原理,我们就可以把一些配置打成对象的形式放在 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;
}

image-20230516113904043

posted @ 2023-05-18 15:15  Purearc  阅读(329)  评论(0编辑  收藏  举报