SpringBoot 用法

环境切换

业务需求

软件一般会在多个不同的环境中运行. 开发阶段有一个dev环境.开发完成会进行测试.则会有测试环境.最终项目部署到用户的服务中 生产环境.
问题: 如果每次切换环境,如果都需要手动的修改配置文件,则造成诸多的不便.
需求: 如果能够简化环境切换带来的影响.

多环境编辑

要求: 如果采用多环境测试,则要求每个环境中的数据项(配置属性)都应该保持一致. 否则缺失可能导致项目启动异常.
多环境配置: 关键语法"—" 环境分割
定义环境名称:

spring:
  config:
    activate:
      on-profile: prod #此处写的是环境的名称

默认环境名称:

#默认环境选项
spring:
  profiles:
    #默认环境配置名称
    active: test  #选择使用哪个环境

全部配置:

#默认环境选项
spring:
  profiles:
    #默认环境配置名称
    active: test

#环境分割
---
#YML文件语法
## 1.YML数据结构k-v结构
## 2.k与v 需要使用 :"空格" 连接
## 3.YMl配置文件有父子级关系 所以注意缩进项的位置
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 80    #配置端口
  servlet:      #web项目发布路径
    context-path: /  #/表示根目录

#定义dept属性值 YML文件默认支持UTF-8
dept:
  id: 100
  name: 财务部

#环境分割线
---

# 每个环境都应该有自己的名称
spring:
  config:
    activate:
      on-profile: test
server:
  port: 8080    #配置端口
  servlet:      #web项目发布路径
    context-path: /  #/表示根目录

#定义dept属性值 YML文件默认支持UTF-8
dept:
  id: 100
  name: 集團本部

热部署

需求说明

在开发阶段每次修改完源码都要重启服务器,程序才能生效. 能否让程序自动的完成监控,重启服务器.

引入jar包

<!--支持热部署  缺点:IDEA使用特别占内存 配置了热部署之后内存开销将会增加   -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

配置IDEA环境
组合键: ctrl + shift + alt + / 或者 ctrl + alt + a

springboot 监测数据库的表的变化_spring

勾选自动编译

springboot 监测数据库的表的变化_spring_02

启动IDEA自动编译

springboot 监测数据库的表的变化_jar包_03

mac版本的idea的热部署的环境的配置

1):IntelliJ IDEA–Preferences……进入Preferences配置页面,或者用快捷键 command+,

springboot 监测数据库的表的变化_jar包_04

2):连续按两次shift键,打开选择框,输入reg,选择“Registry……”

springboot 监测数据库的表的变化_xml_05

3):勾选.running,点Close关闭。

springboot 监测数据库的表的变化_spring_06

4):项目中选择“Edit Configurations……” 这一步可以不做

springboot 监测数据库的表的变化_jar包_07

springboot 监测数据库的表的变化_xml_08

SpringBoot整合Mybatis

导入数据库

安装SqlYog

1).解压安装包

springboot 监测数据库的表的变化_jar包_09

运行sql文件

根据资料中的破解码 完成破解 输入用户名和密码 点解链接

springboot 监测数据库的表的变化_jar包_10

正确的展现

springboot 监测数据库的表的变化_xml_11

导入数据库
1).新建数据库

在空白处右键创建数据库

springboot 监测数据库的表的变化_spring_12

在空白处右键点击(倒入文件夹创建创建表)

springboot 监测数据库的表的变化_jar包_13

导入数据

springboot 监测数据库的表的变化_xml_14

创建SpringBoot项目

创建项目

springboot 监测数据库的表的变化_xml_15

勾选依赖jar包

springboot 监测数据库的表的变化_xml_16

springboot 监测数据库的表的变化_xml_17

springboot 监测数据库的表的变化_xml_18

pom.xml文件

注意⚠️:
当使用此jar包就必须连接数据库否则会报错

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
	</dependency>
<!--springboot整合mybatis
       springboot的启动项    内部都已经完成了配置    需要自己手动的编辑yml文件-->
<dependency>
		<groupId>org.mybatis.springframework.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>2.1.4</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http:///POM/4.0.0 https:///xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.jt</groupId>
	<artifactId>springboot_demo_2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_demo_2</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>

		<!--
			spring-boot-starter 启动项
			当程序解析到该jar包时,就会按照jar包内的配置实例化对象
			包括数据源的配置. 加载数据源......当使用此jar包就必须连接数据库否则会报错
		-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

		<!--引入数据库驱动 连接数据库的jar包-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<!--只对当前项目有效-->
			<!--<optional>true</optional>-->
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<!--true该jar包文件父子项目之间不传递.-->
			<!--<optional>true</optional>-->
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!--spring整合mybatis-plus -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.2</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!--在项目打包时将lombok包除外.-->
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

配置连接数据库的文件

server:
  port: 8090

#SpringBoot 开箱即用
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    #检查密码是否正确
    password: root

#SpringBoot整合MybatisPlus配置
mybatis:
  #定义别名包
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

执行sql语句是配置文件

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace
	1.Mapper.xml配置文件的唯一标识
	2.需要与Mapper接口保持一致.
	  UserMapper.findAll();  通过方法映射Sql语句!!!
路径是:mapper层的代码的路径
-->
<mapper namespace="com.jt.mapper.DemoUserMapper">

	<!--编辑更新操作  #mybatis中的一种表达式写法 
        这个地方 的ID必须与mapper层的接口的方法相同进行映射;
-->
	<update id="updateUser">
		update demo_user set name=#{nowName} where name=#{oldName}
		and sex=#{sex}
	</update>


	<!--
		完成用户入库操作 id="与方法名称保持一致"
		sql结束时不需要添加;号 在Mysql数据库中执行;号没有问题,
		但是如果在Oracle中执行则必然报错.
	-->
	<insert id="insertUser">
		insert into demo_user(id,name,age,sex)
			value(null,#{name},#{age},#{sex})
	</insert>


<!--除了select标签无论任何标签里面有什么sql语句都可以写,因为select标签需要有返回值类型,但最好不要混用-->


	<!--查询标签必须有返回值
		resultType :直接返回POJO对象的数据  单表查询
		resultMap: 适用于多表关联查询的结果封装 一般采用第三方对象接收

		问题:能否将不变的包路径进行优化???
		解决方案: 定义别名包即可
		说明:
			resultType="包名.类名"  resultType="com.jt.pojo.DemoUser"
		如果在application.xml文件里定义别名包
		type-aliases-package: com.jt.pojo,那么在resultType就不用写包路径;
		resultType="DemoUser" 可以直接返回对象的名称
	    程序解析时: 首先根据别名包的名称进路径的拼接 com.jt.pojo.DemoUser
	-->
	<select id="findAll" resultType="DemoUser">
		select * from demo_user
	</select>

	<!--更新操作的标签就是为了方便程序员开发时使用,程序
	执行时没有任何的差别,所以可以混用
	<insert id="">
	</insert>-->
</mapper>

Mavenjar包作用范围

1.test范围是指测试范围有效,在编译和打包时都不会使用这个依赖
2.compile范围是指编译范围内有效,在编译和打包时都会将依赖存储进去
3.provided依赖,在编译和测试过程中有效,最后生成的war包时不会加入 例如:
servlet-api,因为servlet-api tomcat服务器已经存在了,如果再打包会冲突
4.runtime在运行时候依赖,在编译时候不依赖
默认依赖范围是compile

数据源配置

#SpringBoot 开箱即用
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

关于参数说明:

1.serverTimezone=GMT%2B8 %2B “+” 号 新版本的驱动要求必须配置时区
2.&useUnicode=true&characterEncoding=utf8 使用Unicode编码 要求字符UTF-8编码
3.&autoReconnect=true 是否自动重连.
4.&allowMultiQueries=true 是否允许批量操作 同时执行多个sql!

Mybatis相关

#SpringBoot整合Mybatis配置
mybatis:
  #定义别名包
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true
编辑Mapper接口/映射文件

springboot 监测数据库的表的变化_jar包_19

将Mapper接口交给容器管理

springboot 监测数据库的表的变化_spring_20

Mybatis测试

编辑测试类,注意包路径的写法.

package com.jt;

import com.jt.mapper.DemoUserMapper;
import com.jt.pojo.DemoUser;
import org.apache.catalina.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class TestSpringBoot {

    @Autowired
    private DemoUserMapper userMapper;

    //数据的查询
    @Test
    public void testFindAll(){
        //代理的测试  jdk动态代理
        System.out.println(userMapper.getClass());
        System.out.println(userMapper.findAll());
    }

}

关于绑定异常

报错说明
绑定异常: mapper的接口与xml的映射文件之间绑定异常.
改错:将resources里的下一级目录是有点进行代替,而在创建目录点时候将目录的名字使用点了

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jt.mapper.DemoUserMapper.findAll

代码排查:

1).检查Mapper接口的路径

springboot 监测数据库的表的变化_spring_21

检查mapper.xml引入过程

springboot 监测数据库的表的变化_spring_22

检查mapper.xml映射文件

springboot 监测数据库的表的变化_jar包_23

检查方法名称

检查mapper接口方法名称,与标签的ID是否一致.

springboot 监测数据库的表的变化_spring_24

清空/重新编译项目

1).clean项目

springboot 监测数据库的表的变化_spring_25

build项目

springboot 监测数据库的表的变化_xml_26

将我的代码全部复制 测试一下. 只粘贴pom.xml 和src文件.

检查目录层级,是否使用/进行分割.

关于数据库密码问题

默认的数据库密码 root/root
创建数据库密码时 以数字0开头 012345
问题解释: 数据密码在进行编译时. 如果遇到首字母为0则自动删除.
解决方案: 如果以特殊数字开头 则 “012345” 使用引号包裹

关于Mapper接口代理对象创建流程

说明: 当springBoot启动时,加载pom.xml文件.实例化对象的流程图.

springboot 监测数据库的表的变化_spring_27

Mybatis入库练习

新增用户信息

编辑Mapper接口

springboot 监测数据库的表的变化_jar包_28

编辑测试类

springboot 监测数据库的表的变化_xml_29

//新增用户
    @Test
    public void testInsert(){
        DemoUser user = new DemoUser();
        user.setId(null).setName("mybatis信息").setAge(18).setSex("男");
        userMapper.insertUser(user);
    }
在mapper接口的代码

业务调用

springboot 监测数据库的表的变化_jar包_30

编辑Mapper.xml 文件

<!--
		完成用户入库操作 id="与方法名称保持一致"
		sql结束时不需要添加;号 在Mysql数据库中执行;号没有问题,
		但是如果在Oracle中执行则必然报错.
	-->
	<insert id="insertUser">
		insert into demo_user(id,name,age,sex)
			values(null,#{name},#{age},#{sex})
	</insert>
更新练习
更新的信息

Mapper接口

springboot 监测数据库的表的变化_jar包_31

编辑Mapper.xml映射文件

在mapper.xml文件中 实现更新操作

springboot 监测数据库的表的变化_jar包_32

编辑测试类

springboot 监测数据库的表的变化_xml_33

下图中的红线报错解决办法

springboot 监测数据库的表的变化_jar包_34

红色方框内的点表示下一级目录,所以不能使用手直接敲点创建目录

springboot 监测数据库的表的变化_xml_35

编辑mapper的代码

package com.jt.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.DemoUser;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
//@mapper 此注解有启动类@mapperscan进行代替  由于接口不能直接创建对象 所以需要使用代理进行,此处使用的是动态代理;
public interface DemoUserMapper  {
   
    List<DemoUser> findAll();

    void insertUser(DemoUser user);

    void updateUser(String oldName, String nowName, String sex);
}

编辑pojo的代码

package com.jt.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)    //重写set方法

public class DemoUser {
    
    private Integer id;
   
    private String name;
    private Integer age;
    private String sex;
}

编辑启动类

package com.jt;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication  //标识主启动类的注解
@MapperScan("com.jt.mapper")    //将Mapper接口交给容器管理
public class SpringBootRun {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootRun.class,args);
    }
}

创建测试类

package com.jt.springboot;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootApplicationTests {


    @Autowired
    private UserMapper userMapper;  //这是一个jdk动态的代理对象

    @Test
    void contextLoads() {
       
       list<DemoUser> listuser = userMapper.findall();
        System.out.println(listuser);
    }

}

mybatis创建项目的部分包

springboot 监测数据库的表的变化_jar包_36

springboot 监测数据库的表的变化_xml_37