SpringBoot高级用法
SpringBoot配置文件说明
关于配置文件说明
解释:Spring程序启动时,需要加载默认的配置文件,默认名称:application.properties
修改字符集编码
说明:下列操作修改的是IDEA中解析代码时的字符集格式
properties配置文件说明
语法:
1.数据结构 key-value结构
2.写法 key=value “key2”=“value2”
3.数据类型 properties的数据类型都是字符串 所以无需添加"号
4.弊端 配置信息没有层级结构,必须写配置的全名
5.程序通过IO流 进行pro文件的加载时 默认的字符集编码IS0-8859-1
YML配置文件说明
#关于YML配置文件说明
# 1.数据结构 key=value
# 2.数据类型 默认都是字符串 如果需要类型转化,则框架已经在内部完成
# 3.yml写法: 1.key: (空格)value 2.有层级结构 编辑时注意
# 4.字符集编码: 默认程序加载时都是UTF-8
server:
port: 8080
#项目发布的路径
servlet:
# /缺省值 localhost:8080/jt/xxxx请求路径
context-path: /
SpringBoot为属性赋值
业务说明
说明:由于业务需要 某些属性信息,如果直接写死在代码中则后期的扩展性不好,所以需要动态赋值,由于对象一般都是有Spring容器管理,所以该赋值的操作也应该有Spring容器赋值
编辑YML配置文件
server:
port: 8080
# 项目发布的路径
server:
# / 缺省值 localhost:8080/jt/xxxx请求路径
context-path: /
# 2.为属性赋值 hello代表前缀 key=hello.msg
hello:
msg: "您好SpringBoot"
为属性赋值
@RestController //向前端返回JSON 特殊格式的字符串
public class HelloController{
//需求:从容器中获取属性数据 springel=spel表达式
@Value("${hello.msg}") //自动生成get/set方法
private String msg; // = “您好SpringBoot”
}
热部署
解释说明
说明:热部署一般在开发阶段比较适用,但是在发布阶段一般会取消该功能。
作用:当程序进行修改一段时间之后,tomcat服务器会自动重启
缺点:Eclipse中兼容完美立即重启,IDEA3~5秒之后完成了重启
添加热部署jar包
在项目的pom.xml文件中CV导入
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
修改IDEA配置
说明:为了能让IDEA自动热部署
组合键:ctrl + alt + shift + /
Lombok包
注解式自动生成Get,Set,toString
<!-- 注解式自动生成Get,Set,toString 类似方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
自带注解含义:
@Data 写在指定类上,为指定类自动化生成get,set,toString 等方法
@Accessors(chain = true) 开启链式加载
@NoArgsConstructor 无参构造方法
@AllArgsConstructor 全参构造方法
导入数据库
检查数据库是否可用
在DOS命令窗口输入cmd打开命令窗口输入指令:mysql -u账号 -p密码
检查数据库服务项
说明:有时启动计算机时可能出现异常情况,导致mysql数据库服务不能正常启动,展示效果标识数据库连接异常
检查:检查MYSQL服务项 是否可用
Spring容器
说明:Spring容器 = HashMap<k,v>
@Controller
public class HelloController{
}
// 实例化:反射机制
SpringBoot整合MyBatis
配置pom.xml文件
<?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>com.jt</groupId>
<artifactId>springboot_demo_2</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<name>springboot_demo_2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<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>
<!-- 注解式自动生成Get,Set,toString 类似方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
准备主启动类
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class);
}
}
若启动后端口被占用解决方案
在module下的resources包中创建一个application.yml文件输入以下代码
server: port: 8090 #8090是新的端口号 可自指定
创建pojo包
在主启动类创建一个子包
此包用来存储程序所需的被实例化对象类
在这里插入图片描述
pom.xml中添加jar
引入数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version></version>
</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.1.4</version>
</dependency>
创建一个application.yml文件引入数据源信息
server:
port: 8090
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdbserverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
# 密码不能以0开头,如果0开头 则使用"012345" password: root#Mybatis整合mybatis: #定义别名包 type-aliases-package: com.jt.demo.pojo mapper-locations: classpath:/mybatis/mappers/*.xml #开启驼峰映射 configuration: map-underscore-to-camel-case: true
关于Mybatis总结
什么是Mybatis?
Mybatis是持久层的框架,主要与数据库进行交互,Mybatis在内部封装了JDBC。
Mybatis称之为“半自动化的ORM框架”
JDBC源码
package cn.tedu.example.jdbc;
import java.sql.*;
import java.util.Scanner;
/**
* 测试JDBC
* 用来把java程序和数据库连接起来,目的是通过java代码操作数据库
* @author Cloud
*/
public class TestJdbc extends JDBCUtils{
public static void main(String[] args) {
// //普通方式
method();
// //SQL注入攻击解决方案
method2();
// //JDBC连接SQL,java 练习
method1();
// 查询user表中武洋洋的所有数据
method3();
// 向dept表中插入数据
method4();
}
private static void method4() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest","root","root");
String sql = "insert into dept(dname,loc) values(?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,"销售部");
ps.setString(2,"二区");
//专门执行增删改的SQL
ps.executeUpdate(sql);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
private static void method3() {
String[] str = {
"jdbc:mysql://localhost:3306/jdbctest","root","root"};
Connection conn = JDBCUtils.getConnection(str);
String[] pw1 = {
"武洋洋","123456"};
String str1 = "select id,name,pwd from user where name = ? and pwd = ?";
JDBCUtils.getPreparedStatement(str1,pw1);
}
/**
* 使用JDBC通过java查询数据库中user表的数据
*/
private static void method1() {
try {
//注册驱动jar包
Class.forName("com.mysql.jdbc.Driver");
//连接数据库
Connection con = DriverManager.getConnection(
//域名:服务器名://数据库的端口号/数据库名
"jdbc:mysql://localhost:3306/jdbctest",
// 数据库账号 数据库密码
"root","root");
//获取传输器
Statement st = con.createStatement();
//执行SQL语句
String sql = "select id,name,pwd from user where name = '武洋洋' and pwd = '123456'";
ResultSet rs = st.executeQuery(sql);
//处理|解析结果集
while(rs.next()){
String id = rs.getString(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println(id+"\n"+name+"\n"+pwd);
}
//释放资源
rs.close();
st.close();
con.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
/**
* 使用JDBC查询 user 表的数据
*/
private static void method() {
try {
//1.注册驱动jar包
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库
// getConnection(1,2,3) 1是要连接哪个数据库 2是用户名 3是密码
Connection con = DriverManager.getConnection(
//协议:服务器名字://数据库的端口号/数据库名
"jdbc:mysql://localhost:3306/jdbctest",
"root","root");
//3.获取传输器
Statement st = con.createStatement();
//4.执行SQL
String sql = "select id,name,pwd from user where name = 'jack' and pwd = '123456'";
ResultSet rs = st.executeQuery(sql);
//5.处理|解析结果集
// 遍历user表中的所有数据 next()是用来判断是否有数据的若没有数据则返回false
while (rs.next()){
String id = rs.getString(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println(id+"\t"+name+"\t"+pwd);
}
//6.释放资源
rs.close();
st.close();
con.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
/**
*SQL注入攻击的解决方案
* 是指当用户只输入数据时,而已包含了特殊的SQL
* 导致只需要名字不需要输入密码也可以查看所有数据
* 名字输入后两种值,都会产生SQL攻击问题:jack'# 或 jack' or '1=1
*/
public static void method2(){
Scanner sc = new Scanner(System.in);
//解决SQL注入问题
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbctest";
String name = "root";
String pwd = "root";
Connection con = DriverManager.getConnection(url,name,pwd);
//此处的?称为占位符
String sql = "select id,name,pwd from user where name = ? and pwd = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,sc.nextLine());
ps.setString(2,sc.nextLine());
ResultSet rs = ps.executeQuery();
while (rs.next()){
String id = rs.getString(1);
String name1 = rs.getString(2);
String pwd1 = rs.getString(3);
System.out.println(id+"\t"+name1+"\t"+pwd1);
}
//6.释放资源
rs.close();
ps.close();
con.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
//暴露SQL注入问题
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbctest";
String name = "root";
String pwd = "root";
Connection con = DriverManager.getConnection(url,name,pwd);
Statement st = con.createStatement();
System.out.println("请输入用户名");
String n = sc.nextLine();
System.out.println("请输入密码");
String p = sc.nextLine();
String sql = "select id,name,pwd from user where name ='"+n+"'and pwd ='"+p+"'";
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
String id = rs.getString(1);
String name1 = rs.getString(2);
String pwd1 = rs.getString(3);
System.out.println(id+"\t"+name1+"\t"+pwd1);
}
//6.释放资源
rs.close();
st.close();
con.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
ORM思想
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
总结:以面向对象的方式操作数据库,
难点:1.对象应该与表形成一对一的映射
2.对象中的属性应该与表中的字段一对一映射
分类:
1.更新操作:手写SQL,参数一般采用对象的方式封装,之后通过 #{属性} 执行
2.查询操作:手写SQL,结果集自动的封装
思考:为什么Mybatis这么多年都没有实现全自动化的ORM呢???
原因:Mybatis认为:用于自己手写的SQL的执行效率是最高的,并且也更加通用,比如:多表关联。
总结:性能问题,如果做成全自动化,面向对象的话会影响性能
扩展
全自动化ORM
user对象(…) userMapper.insert(user); 程序自动入库 配置繁琐
Spring补充
Spring内部数据结构
1.数据的结构:Map 理解为容器
2.数据的内容:Key-Value
-Key:一般都是类名的首字母小写 HelloController>>>>helloController
-Value:一般存储的是经过反射等机制实例化的对象
Map<helloController,controller对象>
-
单例:容器中只保存一个对象,Spring容器管理对象的生命周期,和容器几乎同生共死(人在塔在) spring容器默认:单例对象
-
多例:如果用户需要使用,则新创建一个对象交给用户使用,由用户管理对象的生命周期。
-
bean配置文件说明
<bean id="唯一标识" class="类的路径"> 与Map集合进行关联
关于环境代码报错
数据库问题
Mysql数据库版本:教师机 5.5 高版本的数据库6.0以上.
IDEA版本问题
修改mybatis的路径