目录
SpingBoot介绍
什么是SpringBoot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者
SpringBoot有神魔特点
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
Pom.xml介绍
坐标
- 组ID公司域名倒着写groupId
- artfactId项目名称不允许重复
- version项目版本
parent标签作用
定位
SpringBoot主要的作用整合SSM,使得框架的使用更加简化
原则
开箱即用
作用
1.SpringBoot在内部兼容了当下几乎所有的第三方框架
2.SpringBoot官网已经将所有兼容的版本进行了定义(几乎解决了版本冲突问题)以后几乎不写版本号
概括: parent标签中管理其他的项目版本信息.
插件说明build
概念
SpringBoot项目与Maven整合的一个插件
作用
可以通过插件 执行项目打包/测试/文档生成等操作
注意事项:
该插件不能省略
项目发布时: java -jar xxxx.jar 报错:没有主清单信息!!!!
maven命令
- clean清除缓存 即删除target文件
- install打包
注意事项
打包之后如果没有生成xxx.jar文件程序此时运行没有问题则去本地位置查找
POM文件常见报错
父版本报错解决办法
- 清缓存重启
- 仓库中找到删除回到idea之后刷新maven
插件报错
- 重启之后依然报错添加版本号
- 如果暂时不影响代码运行则不管
SpringBoot高级用法
properties文件
数据结构: KEY-VALUE
数据类型: String类型/Number数值
语法:
- 1.key-value使用=号连接
- 2.不需要添加多余的""号
- 3.pro文件在IDEA中的编码格式UTF-8(手动可改)
- pro文件在被程序读取时默认采用ISO-8859-1格式,中文必定乱码
- 4.key=value不要出现多余的空格
代码示例
xxx.properties
person.name=王狗蛋
读取配置文件
package com.jt.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/*
* 接收用户请求
* 响应用户的json串*/
@RestController
@RequestMapping()
/*1.响应用户json 可以将对象转化成为json串
* 2.如果返回值为String类型则返回本身
* json永远都是串*/
@ResponseBody
//Spring容器启动时,动态添加配置文件 /代表根目录resources文件夹 一般需要修改字符集
//关于注解赋值规范 1.必须满足key-value结构 2.如果属性值只有一个,并且是value属性则可以省略不写 3.如果还是乱码 检查pro字符集编码
@PropertySource(value = "classpath:/person.properties", encoding = "UTF-8")
public class HelloController {
// private String day="1";
/*Spring容器内部为属性赋值
语法 spel表达式 ${day}
*/
@Value("${user.day}")
private String day;
@Value("${person.name}")
private String name;
@RequestMapping("/getMsg")
public String getMsg() {
return "这个雨下几天:" + day + "\t" + name;
}
}
yml文件
- 数据结构 key-value
- 数据类型 String/Number
语法:
- 1.key:(空格)value
- 2.key与key之间有层级关系,注意缩进
- 3.字符编码都采用UTF-8
- 4.可读性较pro文件 更加友好
- 用法语properties文件基本类似
作用
- 实现了.java文件与属性赋值的解耦
- 为了实现特定的业务的赋值.
- SpringBoot整合第三方框架时,如果需要额外的配置文件时,常常采用上述的操作实现. 方便扩展
- Redis为属性赋值操作
读取properties文件时注意事项
- 使用PropertiesSource注解(value=“classpatth:/路径”,encoding="utf-8")
- 默认是字符串不需要再加双引号
- 使用@Value注解("key")
Spring自动装配
Spring容器(IOC)
- 说明: Spring容器是在内存中一大块的内存区域,存储Spring管理对象
- 数据结构: KEY-VALUE结构
- 数据类型: Map集合
- Map详细说明: Key: 类型首字母小写 Value: 对象
依赖注入原理
- 1.按照类型注入按照属性的类型 去Map集中中查找是否有改类型的对象. 如果有则注入.
- 2.按照名称注入 根据属性的name 去Map集中中查找对应的KEY
自动装配说明
- 1.如果对象在进行实例化.如果对象中的属性被 @Autowired注解修饰,则说明应该先注入属性.
- 2.先根据属性的类型,查找Map集合中是否有该类型的对象.
- 3.如果根据类型查找没有找到,则根据属性的名称按照name查找对象.
- 4.如果上述的方式都没有找到,则报错实例化对象失败.
- 原则:Spring容器中要求 接口必须单实现. 如果有多实现则通过@Qualifier(“xxxx”)区分即可
SpringBoot整合Mybatis
- 导入所需要的依赖jar包
- mybatis包
- 数据库驱动包
- JDBC包
SpringBoot整合Mybatis 添加配置文件
1.连接数据库创建配置文件
server:
port: 8090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#如果数据库密码以数字0开头 则必须使用""号包裹
#password: "01234"
#SpringBoot整合Mybatis配置 SpringBoot整合Mybatis
mybatis:
#定义别名包: 实现对象映射
type-aliases-package: com.jt.pojo
#加载映射文件一个接口对应一个映射文件
mapper-locations: classpath:/mybatis/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#不打印日志
debug: false
2.SpringBoot整合Mybatis
驼峰命名规则
表字段: user_id,user_name
对象的属性: userId,userName
resultType: 保证属性与字段名称必须一致.
Mybatis提供了驼峰命名规则:
规则: 字段user_id~~~去除_线~~~之后映射对象的属性userId
创建映射文件
<?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必须与接口一一对应 -->
<mapper namespace="com.jt.mapper.UserMapper">
<!--CRUD
定义别名包: 添加了别名包之后可以简化resultType编辑.
-->
<select id="getAll" resultType="User">
select * from demo_user
</select>
<!--驼峰命名规则
表字段: user_id,user_name
对象的属性: userId,userName
resultType: 保证属性与字段名称必须一致.
Mybatis提供了驼峰命名规则:
规则: 字段user_id~~~去除_线~~~之后映射对象的属性
userId
-->
</mapper>
创建Mapper接口
package com.jt.mapper;
import com.jt.pojo.User;
import java.util.List;
//Mybatis接口如何交给Spring容器管理!!!!!
public interface UserMapper {
//查询所有demo_user表的数据
List<User> getAll();
}
SpringBoot整合MybatisPlus
MybatisPlus
- MyBatis 是一款优秀的持久层框架
- Mybatis是一个半自动化的ORM映射框架
orm思想
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
以对象的方式操作数据库
1. 要求查询的结果集可以自动的封装为对象 (读)
2. 利用对象封装数据,之后(自动)动态的生成Sql语句执行相关操作. (更新)
SpringBoot整合Mybatis流程
- 导入依赖jar包 数据库驱动/JDBC包/Spring整合Mybatis包
- 编辑application.yml文件 配置数据源/配置Spring整合Mybatis
- 编辑Mybatis 接口文件/编辑xxx.xml映射文件
- 通过@MapperScan为接口创建代理对象.
@SpringBootTest
注解是SpringBoot程序 为了简化后端代码测试 提供了专门的测试API.
测试时需要Spring容器管理对象,同时将测试的对象获取 之后进行测试.
注意事项: 测试注解只能在测试包中运行.
Mybatis调用流程
Spring容器为接口创建代理对象. Spring容器启动对象立即创建
根据 @Autowired 注解动态注入Mapper接口的代理对象
用户通过Mapper接口调用方法.(执行业务操作)
Mybatis根据接口方法动态匹配xml的映射文件
1.根据Mapper的接口路径匹配xml映射文件中的 com.jt.mapper.UserMapper
2.根据接口的方法 匹配xml映射文件中的Sql ID 之后执行Sql语句
5.Mybatis将结果集封装为对象 之后返回.
MP入门案例
- 导入jar包
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springboot_demo3_mp2</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<!--跳过测试类打包-->
<skipTests>true</skipTests>
</properties>
<!--原则: 按需导入 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<!--springboot启动项(器)在包的内部SpringBoot
已经完成了项目的"整合"(配置) 用户拿来就用
web导入SpringMVC
-->
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--添加lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--springBoot数据库连接 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--spring整合mybatis 暂时 -->
<!-- <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>-->
<!--spring整合mybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
</project>
- 配置对象关系映射
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.stereotype.Component;
@Data
@Accessors(chain = true)
@Component
@TableName("demo_user")
public class User {
@TableId(type = IdType.AUTO )
private Integer id;
private String name;
private Integer age;
private String sex;
}
@TableName(表名)
@TableId(主键)
@TableFiled()字段 如果符合驼峰命名可以选择不写
- 继承公共API接口BaseMapper<User>接口
package com.jt.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.User;
public interface UseDao extends BaseMapper<User> {
}
- 编辑YML配置文件
server:
port: 8090
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#如果数据库密码以数字0开头 则必须使用""号包裹
#password: "01234"
#SpringBoot整合Mybatis配置 SpringBoot整合Mybatis
mybatis-plus:
#定义别名包: 实现对象映射
type-aliases-package: com.jt.pojo
#加载映射文件一个接口对应一个映射文件
mapper-locations: classpath:/mybatis/*.xml
#mapper-locations: classpath:/UserMapper.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#不打印日志
debug: false
#打印日志
logging:
level:
com.jt.mapper: debug
- 工具API测试增删改查
package com.jt;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.dao.UseDao;
import com.jt.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Collection;
@SpringBootTest
public class RunApp1 {
@Autowired
UseDao userDao;
@Test
public void test1(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("id", 231);
userDao.delete(userQueryWrapper);
System.out.println("删除成功");
}
@Test
public void deletes(){
Collection collection=new ArrayList();
collection.add(10);
collection.add(20);
userDao.deleteBatchIds(collection);
System.out.println("删除成功");
}
@Test
public void deleteOne(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("name", "吴亦凡").eq("sex", "女");
userDao.delete(userQueryWrapper);
System.out.println("SuccessFul");
}
@Test
public void testInsert(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("name", "吴凡凡");
userDao.update(new User().setName("朱军海运").setAge(100),userQueryWrapper);
System.out.println("修改成");
}
@Test
public void test(){
userDao.updateById(new User().setId(18).setName("云英").setSex("男").setAge(16));
System.out.println("修改成");
}
}
MP实现原理
- 用户执行User对象入库操作 userMapper.insert(user);
- 由于接口方法中需要传递泛型对象,则根据用户配置查找对应的泛型对象
- 根据用户的接口获取Mapper接口的父级接口BaseMapper,根据BaseMapper中的泛型对象 获取信息User.class类型
- 根据User.class 动态获取@TableName(“demo_user”) 获取对象对应的表名.之后通过@TableField(“name”)绑定与之对应的字段. 至此对象与表完成了映射.
- 根据上述的映射关系,动态的拼接Sql语句.
例子: userMapper.insert(user对象) 如何转化Sql?
**insert into 表名(字段名…) values (属性值…)
insert into demo_user(id,name,age,sex) values (“吴xx”,xx,xx,xx)
MP将动态生成的Sql交给Mybatis执行最终实现数据入库操作!!!