当前位置: 首页 > news >正文

Springboot学习笔记 3.13

目录

一、Springboot入门

第四节课:SpringBoot整合MyBatis

 MyBatis简介

2. SpringBoot整合MyBatis的步骤

添加依赖

配置数据源 

      3. 配置User类(往下都是业务代码,让你熟悉流程)

      4. 设置mapper接口(@Mapper是mabatis的,而@Repository是SpringAcess的,都是访问数据层的)

      5. 设置servic接口和类

      6. 设置controller类

总结:

第五课:bean管理

 bean注册:

@Bean(应该在启动类的包及子包里面,不然扫描不到)

​编辑 @import(配置类可以不位于启动类的子包下面,直接在启动类里面引用配置类)

第六课:注册条件

第七课:自动配置原理

我现在有两个类,一个province一个country,问如果实现在项目启动时自动将这两个Bean对象注入ioc容器?

Springboot自动配置原理: 

 第八课:自定义starter

​编辑 mybatis自动配置的实现步骤: 


一、Springboot入门

第四节课:SpringBoot整合MyBatis

本课简介:

 MyBatis简介
  • MyBatis是一个持久层框架,用于简化数据库操作,支持SQL语句的编写和映射。

2. SpringBoot整合MyBatis的步骤
  1. 添加依赖
    • pom.xml中引入MyBatis和数据库驱动的依赖。

    xml

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.x.x</version> <!-- 根据实际情况选择版本 -->
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
  2. 配置数据源 
    • application.yml中配置数据库连接信息。

    spring:
      application:
        name: springboot-mybatis
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis
        username: root
        password: 123456
      3. 配置User类(往下都是业务代码,让你熟悉流程)

              1.封装的User表类

package com.itheima.spingbootmybatis.pojo;

public class User {
    
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;

    public User() {
    }

    public User(Integer id, String name, Short age, Short gender, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }

    public Short getGender() {
        return gender;
    }

    public void setGender(Short gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", phone='" + phone + '\'' +
                '}';
    }
}
      4. 设置mapper接口(@Mapper是mabatis的,而@Repository是SpringAcess的,都是访问数据层的)
package com.itheima.spingbootmybatis.mapper;

import com.itheima.spingbootmybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {

    @Select("select * from user where id = #{id}")//这个注释
的作用就是直接在接口上定义SQL语句,简化映射文件的使用
    public User findByid(Integer id);
}
      5. 设置servic接口和类

接口:

package com.itheima.spingbootmybatis.service;

import com.itheima.spingbootmybatis.pojo.User;

public interface UserService {

    public User findByid(Integer id);
}

实现类:

package com.itheima.spingbootmybatis.service.impl;

import com.itheima.spingbootmybatis.mapper.UserMapper;
import com.itheima.spingbootmybatis.pojo.User;
import com.itheima.spingbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {


    @Autowired//依赖注入
    private UserMapper userMapper;
    @Override//重写父方法
    public User findByid(Integer id) {
        return userMapper.findByid(id);
    }
}
      6. 设置controller类
package com.itheima.spingbootmybatis.controller;

import com.itheima.spingbootmybatis.pojo.User;
import com.itheima.spingbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {


    @Autowired
    private UserService userService;
    @RequestMapping("/findByid")//配置访问路径
    public User findByid(Integer id){
        return userService.findByid(id);
    }
}

总结:

很显然,我们在整个业务代码中并没有使用配置文件中的信息,是Springboot自动识别参数并连接的数据库,配置文件中的信息我们一般只管写,不管读,只有特定情况下才需要去读取;

第五课:bean管理

 bean扫描:在启动类的@SptingBootApplication注解中,组合了@ComponentScan注解,它会扫描启动类所在包和子包下的文件

 bean注册:

 如果要注册的bean对象来自于第三方(非自定义),是无法使用@Component以及衍生注解声明bean的

@Bean(应该在启动类的包及子包里面,不然扫描不到)

配置类(声明了@Configuration的类文件): 

 如何去测试是否注入容器中?

SpringApplication会返回容器,调用容器的getBean方法就可以查看对应的Bean对象是否创建。

Spring自动注入 

 @import(配置类可以不位于启动类的子包下面,直接在启动类里面引用配置类)

如何优雅(主要是学他是怎么读取一个文件的) 

启动类@import一个importSelector的实现类.class

 ImportSelector的实现类会读取配置文件common.imports,读取配置文件中的类名,返回String数组,注意!selectImports方法它是被Springboot自动调用的,从而返回含有所有类名的字符串数组。

inputStream那段代码解释:

这段 Java 代码是用来读取类路径(classpath)上的一个资源文件,并将其内容加载到 BufferedReader 中,以便逐行读取。下面是对这段代码的逐行解释:

  1. 获取输入流

    java复制

    InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
    • CommonImportSelector.class.getClassLoader():这行代码获取 CommonImportSelector 类的类加载器。类加载器负责加载类文件,并且每个类都有一个与之关联的类加载器。

    • .getResourceAsStream("common.imports"):这个方法调用是类加载器的一部分,它尝试找到类路径上的名为 common.imports 的资源文件,并返回一个 InputStream 对象。这个流可以用于读取文件内容。

    • 在 Java 中,CommonImportSelector.class 通常用于获取当前类 CommonImportSelector 的 Class 对象。这个 Class 对象包含了许多有用的方法和信息,比如获取类的名称、访问修饰符、父类、实现的接口等。在 Spring 框架中,Class 对象还可以用来获取类的类加载器(ClassLoader),这是 CommonImportSelector.class 特别有用的地方。

  2. 创建 BufferedReader

    java复制

    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    • InputStreamReader(is):这个构造函数创建一个新的 InputStreamReader,它将 InputStream 包装成一个字符流。InputStreamReader 使用指定的字符集将字节流解码为字符流。如果没有指定字符集,它将使用平台默认的字符集。

    • BufferedReader(new InputStreamReader(is)):然后,这个字符流被用来创建一个 BufferedReaderBufferedReader 是一个缓冲字符输入流,它可以提供更高效的读取操作,特别是当读取大量数据时。它可以减少读取操作的次数,因为它会从底层输入流中一次性读取多个字符到一个缓冲区中。

使用场景

这种读取类路径资源文件的方法通常用于读取配置文件、文本数据或其他需要在应用程序中使用的数据。例如,common.imports 文件可能包含一些需要在应用程序启动时加载的配置或资源路径。

注意事项

  • 确保 common.imports 文件位于类路径的正确位置,否则 getResourceAsStream 方法将返回 null

  • 处理 InputStreamReader 时,应该始终确保在操作完成后关闭它们,以释放系统资源。这可以通过在 finally 块中调用 close 方法或使用 try-with-resources 语句来实现。

  • 如果文件编码不是平台默认编码,可能需要在创建 InputStreamReader 时指定正确的字符集,例如 new InputStreamReader(is, "UTF-8")

这段代码是 Java 应用程序中读取资源文件的常见模式,特别是在需要动态加载配置或数据时。

 配置文件common.imports

总结:优雅个鬼,太复杂了,弯弯绕绕的,实现的也不过是将类名封装到一个配置文件中(恼怒) 

第六课:注册条件

第一个@ConditionalOnProperty格式,当name指定的属性并不全都存在,该Bean对象不会被注入ioc容器,只有全都存在才会注入:

第二个@ConditionalOnMissingBean,当ioc容器不存在某个Bean对象时,注入该Bean,否则不注入:

第三个@ConditionalOnClass,当ioc容器中存在某个类时,注入该Bean,否则不注入:

第七课:自动配置原理

我现在有两个类,一个province一个country,问如果实现在项目启动时自动将这两个Bean对象注入ioc容器?

 1表示一个配置类,2是自动配置类,3代表配置文件,4代表.imports配置文件其中有自动配置类的引用地址。

执行流程

  1. 项目启动:应用程序启动时,Spring Boot 主类(通常使用 @SpringBootApplication 注解)会触发 Spring 应用上下文的创建。

  2. 加载配置文件:Spring Boot 会查找并加载 application.propertiesapplication.yml 等配置文件。

  3. 识别自动配置类:Spring Boot 会扫描 resources 目录下的 .imports 文件,读取其中列出的自动配置类的全限定名。

  4. 加载自动配置类:根据 .imports 文件中列出的自动配置类,Spring Boot 会加载这些类,并根据条件注解决定是否应用这些配置。

  5. 应用自动配置:如果条件满足,Spring Boot 会应用自动配置类中定义的配置,注册相应的 bean 到 Spring 应用上下文中。

  6. 初始化应用程序上下文:完成自动配置类的加载和 bean 的注册后,Spring Boot 会初始化应用程序上下文。

  7. 启动应用程序:最后,Spring Boot 会启动应用程序,应用程序上下文中的所有 bean 都会被创建和初始化。

Springboot自动配置原理: 

 第八课:自定义starter

 mybatis自动配置的实现步骤: 

1.在autoconfigure模块中,编写配置类,配置类中包含两个Bean对象

代码解释:

MyBatis 是一个流行的 Java 持久层框架,它提供了简单的方法将 SQL 查询转换为 Java 对象(Object-Relational Mapping,简称 ORM)。MyBatis 消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,使得开发者可以专注于编写 SQL 查询。

MyBatis 的主要特点:

  1. 简单易用:MyBatis 通过 XML 或注解方式配置 SQL 映射,简单直观。

  2. 灵活的 SQL 支持:MyBatis 允许编写动态 SQL,可以根据不同条件构建不同的 SQL 语句。

  3. 缓存机制:MyBatis 提供了一级缓存和二级缓存,以提高查询效率。

  4. 事务管理:MyBatis 支持声明式事务管理,简化了事务的控制。

  5. 代码生成:MyBatis 提供了代码生成器 iBatis Generator,可以根据数据库表结构自动生成实体类和映射文件。

  6. 模块化和可扩展性:MyBatis 允许开发者自定义 SQL 类型处理器、对象工厂、映射器等组件,提供了高度的可扩展性。

MyBatis 的工作原理:

  1. 配置:MyBatis 通过 XML 文件或注解配置数据源、事务管理器、映射器等信息。

  2. SQL 映射:开发者编写 SQL 映射文件,将 SQL 查询映射到 Java 方法上。

  3. 创建 SqlSession:应用程序通过 SqlSessionFactory 创建 SqlSession 实例。

  4. 执行映射器方法:通过 SqlSession 调用映射器接口的方法,MyBatis 会自动执行对应的 SQL 查询。

  5. 处理结果:MyBatis 将查询结果映射到 Java 对象,并返回给应用程序。

  6. 关闭 SqlSession:完成数据库操作后,关闭 SqlSession 以释放资源。

MyBatis 的核心组件:

  1. SqlSessionFactory:负责创建 SqlSession 实例。

  2. SqlSession:是 MyBatis 的核心接口,用于执行映射器方法和获取映射器。

  3. Mapper 接口:定义了数据库操作方法,MyBatis 根据映射文件自动实现这些接口。

  4. 映射器 XML 文件:包含了 SQL 映射语句,定义了 SQL 查询和结果映射规则。

  5. TypeHandler:用于处理 Java 类型和 JDBC 类型之间的转换。

  6. 插件:可以扩展或自定义 MyBatis 的行为。

使用 MyBatis 的基本步骤:

  1. 添加 MyBatis 依赖:在项目的构建配置文件(如 Maven 的 pom.xml)中添加 MyBatis 依赖。

  2. 配置数据源和事务管理器:在 MyBatis 配置文件中配置数据源和事务管理器。

  3. 编写 Mapper 接口:定义数据库操作方法。

  4. 编写映射器 XML 文件:定义 SQL 查询和结果映射规则。

  5. 创建 SqlSessionFactory:根据配置文件创建 SqlSessionFactory 实例。

  6. 执行数据库操作:通过 SqlSession 调用 Mapper 接口的方法执行数据库操作。

  7. 关闭 SqlSession:完成数据库操作后关闭 SqlSession。

2.编写.imports文件,用于Springboot在启动时识别自动配置类名

3.在注入依赖模块中,引入自动配置类,这样其他模块要使用mybatis的自动配置时,只需要调用starter。 4.在其他项目中,使用这个Starter模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/100805.html

相关文章:

  • 若依前后端不分离字典修改---formatter对原值进行修改
  • 场外基金和ETF场内基金有何区别?ETF佣金最低是多少?
  • 从头开始学C语言第三十六天——函数指针和函数指针数组
  • 【C/C++算法】从浅到深学习---分治算法之快排思想(图文兼备 + 源码详解)
  • Html 页面图标的展示列表
  • 本地文件夹同步软件,本地文件夹同步备份方法
  • MYSQL数据库(一)
  • 六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南
  • doip诊断第二版优化
  • [GWCTF 2019]我有一个数据库1 [CVE phpMyAdmin漏洞]
  • Android并发编程:线程池与协程的核心区别与最佳实践指南
  • Java线程特性
  • 1.1 斐波那契数列模型:LeetCode 1137.第 N 个泰波那契数
  • sqli-labs靶场 less 12
  • python笔记之函数
  • 时序数据库:InfluxDB命令行操作
  • 机械波的产生与传播
  • 鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:相对布局
  • Redis常用的数据结构及其使用场景
  • 机器学习之回归算法
  • Verilog中X态的危险:仿真漏掉的bug
  • 【初阶数据结构】栈
  • 七年级角的概念
  • NNI 适配 TensorRT10教程
  • 人工智能之数学基础:幂法和反幂法求特征值和特征向量
  • Linux练习——有关硬盘、联网、软件包的管理
  • java项目之基于ssm的医院门诊挂号系统(源码+文档)
  • 001 使用单片机实现的逻辑分析仪——吸收篇
  • sort命令:排序
  • JS判断变量是否为空的方法