springboot的使用,数据库的连接,热部署的使用,mybaties

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

在这里插入图片描述

勾选自动编译
在这里插入图片描述

启动IDEA自动编译

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

3):勾选compiler.automake.allow.wher.app.running,点Close关闭。

在这里插入图片描述

4):项目中选择“Edit Configurations……” 这一步可以不做
在这里插入图片描述

在这里插入图片描述

SpringBoot整合Mybatis

导入数据库
安装SqlYog
1).解压安装包
在这里插入图片描述

运行sql文件
根据资料中的破解码 完成破解 输入用户名和密码 点解链接
在这里插入图片描述

正确的展现
在这里插入图片描述

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

在空白处右键创建数据库
在这里插入图片描述

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

请添加图片描述

导入数据
在这里插入图片描述

创建SpringBoot项目
创建项目
在这里插入图片描述

勾选依赖jar包请添加图片描述

请添加图片描述

请添加图片描述

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://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/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接口/映射文件

在这里插入图片描述

将Mapper接口交给容器管理

在这里插入图片描述

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接口的路径
在这里插入图片描述

检查mapper.xml引入过程
在这里插入图片描述

检查mapper.xml映射文件
在这里插入图片描述

检查方法名称
检查mapper接口方法名称,与标签的ID是否一致.
在这里插入图片描述

清空/重新编译项目
1).clean项目
在这里插入图片描述

build项目
在这里插入图片描述

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

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

关于数据库密码问题

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

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

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

在这里插入图片描述

Mybatis入库练习

新增用户信息

编辑Mapper接口
在这里插入图片描述

编辑测试类
请添加图片描述


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

在mapper接口的代码

业务调用请添加图片描述

编辑Mapper.xml 文件


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

更新练习

更新的信息

Mapper接口
在这里插入图片描述

编辑Mapper.xml映射文件

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

在这里插入图片描述

编辑测试类
在这里插入图片描述

下图中的红线报错解决办法
请添加图片描述

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

请添加图片描述

编辑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创建项目的部分包

请添加图片描述

请添加图片描述


版权声明:本文为weixin_58276266原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。