11. SpringBoot用法
1.1 Lombok用法
1.1.1 常用注解
1.1.2 关于Lombok使用说明
问题:Lombok的使用需要添加jar包和安装插件。未来项目在Linux服务器中进行部署。问 Linux服务器中是否需要安装lombok的插件
答案: 不需要 lombok插件编译器有效. xxx.java文件 编译为xxx.class文件
1.2 SpringBoot测试方法说明
1.2.1 方法说明
SpringBoot为了简化程序测试过程,springBoot针对于测试方法,开发了一个注解@SpringBootTest.
规则说明:
1. 当运行@Test注解标识的方式时,SpringBoot程序启动.
2. SpringBoot启动,内部Spring容器启动.基于IOC管理对象,DI注入对象
3. 可以在任意的测试类中注入想要的对象.
注意事项:测试类的包路径,必须在主启动类的同包及子包中编辑.
1.2.2 测试方法说明
package com.jt;
import com.jt.controller.HelloController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest //测试类启动,Spring容器启动
class SpringbootDemo1ApplicationTests {
@Autowired
private HelloController helloController;
//通过测试方法,可以自己调用,检查流程是否正常
@Test
void contextLoads() {
System.out.println(helloController.hello());
}
}
2. 前后端调用补充知识
2.1 Axios的简化写法
2.1.1 编辑WebController
package com.jt.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin //标识跨域的
@RequestMapping("/web")
public class WebController {
/**
* URL: http://localhost:8080/web/hello
* 类型: get
* 返回值: String
*/
@GetMapping("/hello")
public String hello(){
return "好好学习,天天向上";
}
}
2.1.2 编辑页面HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Axios测试</title>
<script src="../js/axios.js"></script>
</head>
<body>
<h1>Axios简化测试3</h1>
<script>
/* 简化方式1: 抽取后端服务器地址 */
axios.defaults.baseURL = "http://localhost:8080"
/* 简化方式2: 箭头函数使用 如果参数只有一个可以省略括号 */
axios.get("/web/hello")
.then( promise => {
alert(promise.data) //嵌套结构
})
/* 简化方式3: async await简化调用 重点
问题描述: 如果ajax如果嵌套的层级较多,则引发"回调地狱"问题
解决问题: 能否将axios中的then进行简化.
语法:
1. 使用async关键字标识函数
2. 通过await标识ajax请求
3. 必须同时出现
*/
async function getHello(){ //定义函数
//let {data: result,status: code} = await axios.get("/web/hello")
let {data: result} = await axios.get("/web/hello")
alert(result)
}
//调用函数
getHello()
/* let result1 = axios.get("/web/hello")
let result2 = axios.get("/web/hello",参数:result1)
let result3 = axios.get("/web/hello",参数:result2)
let result4 = axios.get("/web/hello",参数:result3) */
</script>
</body>
</html>
显示效果
2.2 跨域问题
2.2.1 同源策略
要素:
1. 浏览器URL中的地址 例子:http://localhost:8848/webDemo/demo/3-axios.html
2. Ajax请求的URL地址 例子: http://localhost:8080/web/hello
要求: 上述要素必须满足 协议/域名/端口号都相同时.表示满足同源策略.
说明:如果满足同源策略,则称之为 “同域访问” 反之称之为 “跨域访问” 跨域访问浏览器一般都会报错
注意:http端口号默认80,https协议默认443端口,域名代替ip地址而存在的(但是ip不能代替域名)
2.2.2 关于跨域案例讲解
案例1:
浏览器地址: http://localhost:8080/xx/xxx
Ajax地址: https://localhost:8080/yy/yyyy 跨域请求:协议不同
案例2:
前提: 域名与IP地址对应
浏览器地址: http://www.jt.com:8080/xx/xxx
Ajax地址: http://10.4.5.2:8080/yy/yyyy 跨域请求:域名不同
案例3:
浏览器地址: http://www.jt.com/xx/xxx
Ajax地址: http://www.jt.com:80/yy/yyyy 同域请求:http端口号默认80
案例4:
浏览器地址: https://www.jt.com:443/xx/xxx
Ajax地址: https://www.jt.com:443/yy/yyyy 同域请求: https协议默认443端口
案例5:
迷惑: IP表示同一个网段
浏览器地址: http://192.168.10.2:80/xx/xxx
Ajax地址: http://192.168.11.2:80/yy/yy 跨域请求: 域名不匹配
2.2.3 跨域解决方案
1.jsonp 方式跨域 淘汰了.
2.CORS 跨域资源共享
跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。总结: CORS要求在服务器端标识哪个网址可以跨域
3. Mybatis
3.1 Mybatis介绍
3.1.1 需求分析
//利用jdbc,完成新增的功能
private static void method2() throws Exception{
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取数据库的连接
//数据传输协议 数据库的ip 端口号 数据库名
String url = "jdbc:mysql://localhost:3306/cgb2107";
Connection c = DriverManager.getConnection(url,"root","root");
//3,获取传输器
Statement s = c.createStatement();
//4,利用传输器执行 增删改的SQL
//executeUpdate()用来执行增删改的SQL,只返回影响行数
int rows = s.executeUpdate(
"INSERT INTO emp(ename,job) VALUES('rose','副总')");
//5,释放资源
//r.close();//结果集
s.close();//传输器
c.close();//连接
}
说明: 传统的JDBC代码需要繁琐的API. 开发效率低. 代码重复冗余.
3.1.2 Mybatis介绍
官网地址: https://mybatis.org/mybatis-3/zh/index.html
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
3.1.3 Mybatis源码
3.1.4 Mybatis特点
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
3.2 Mybatis 环境搭建
3.2.1 准备数据库
说明: 利用sqlYog工具导入数据库
创建一个表四个属性
3.2.2 创建项目mybatis_demo1
3.2.3 导入jar包文件
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--添加lombok的包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.2.4 数据映射
持久层:
1.数据表: 用户的数据信息, 持久化到本地磁盘中
2.POJO: 程序通过对象封装数据信息.映射关系: 一个POJO对象要求映射一张数据表
1.对象名称 映射数据表表名.
2. 对象的属性 映射数据表中的字段。
数据表结构:
编辑POJO对象
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
3.2.5 编辑mybatis-config.xml配置文件
说明: 在resource的目录中添加 该文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--核心配置文件--> <configuration> <!--环境配置标签--> <environments default="development"> <!--编辑开发环境--> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--Mybatis加载Mapper映射文件--> <mappers> <mapper resource="mybatis/mappers/UserMapper.xml"/> </mappers> </configuration>
3.2.6 编辑UserMapper.xml映射文件
说明: 由于mybatis需要操作数据库.编辑Sql语句. 采用xml映射文件维护Sql语句.
关系:
1.一个接口对应一个xml映射文件
2.一个接口方法对应一个映射文件的Sql.
<?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是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="com.jt.mapper.UserMapper">
<!--id 表示接口方法
resultType 返回值结果类型
-->
<select id="findAll" resultType="com.jt.pojo.User">
select * from demo_user
</select>
</mapper>
3.2.7 mybatis加载mapper映射文件
<!--Mybatis加载Mapper映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
3.3 Mybatis 入门案例
package com.jt; import com.jt.mapper.UserMapper; import com.jt.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestMybatis { /** * 规则说明: * 1.创建SqlSessionFactory 工厂模式 * 2.获取SqlSession 理解:数据库链接+传输器对象 * 3.获取Mapper接口对象 * 4.完成业务调用 * 5.关闭链接 */ @Test public void demo1() throws IOException { //1.1 指定配置文件的根目录 String resource = "mybatis-config.xml"; //1.2 通过IO流 加载配置文件 org.apache.ibatis.io;包路径 InputStream inputStream = Resources.getResourceAsStream(resource); //1.3 实例化工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2 获取SqlSession 通过sqlSession可以直接操作数据库 SqlSession sqlSession = sqlSessionFactory.openSession(); //3 获取接口对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //4.调用接口方法 List<User> userList = userMapper.findAll(); System.out.println(userList); //5.暂时手动关闭链接 sqlSession.close(); } }
3.4 Mybatis常见报错解析
3.4.1 jar包添加异常
说明: 在dependencies 根标签中添加jar包
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--添加lombok的包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.4.2 配置文件名称异常
3.4.3 数据源配置异常
数据版本要求: Mysql5.5以上版本 mariaDB 10以上的版本
驱动异常:
3.4.4 映射文件加载异常
3.4.5 接口与映射文件不匹配报错