Java学习笔记---SpringBoot高级用法

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对象>

  1. 单例:容器中只保存一个对象,Spring容器管理对象的生命周期,和容器几乎同生共死(人在塔在) spring容器默认:单例对象

  2. 多例:如果用户需要使用,则新创建一个对象交给用户使用,由用户管理对象的生命周期。

  3. bean配置文件说明

    <bean id="唯一标识" class="类的路径">	与Map集合进行关联	
    

关于环境代码报错

数据库问题

Mysql数据库版本:教师机 5.5 高版本的数据库6.0以上.

在这里插入图片描述

IDEA版本问题

修改mybatis的路径

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_54177999/article/details/117459222
今日推荐