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的步骤
-
添加依赖
-
在
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>
-
-
配置数据源
-
在
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
中,以便逐行读取。下面是对这段代码的逐行解释:
-
获取输入流:
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 特别有用的地方。
-
-
创建
BufferedReader
:java复制
BufferedReader br = new BufferedReader(new InputStreamReader(is));
-
InputStreamReader(is)
:这个构造函数创建一个新的InputStreamReader
,它将InputStream
包装成一个字符流。InputStreamReader
使用指定的字符集将字节流解码为字符流。如果没有指定字符集,它将使用平台默认的字符集。 -
BufferedReader(new InputStreamReader(is))
:然后,这个字符流被用来创建一个BufferedReader
。BufferedReader
是一个缓冲字符输入流,它可以提供更高效的读取操作,特别是当读取大量数据时。它可以减少读取操作的次数,因为它会从底层输入流中一次性读取多个字符到一个缓冲区中。
-
使用场景
这种读取类路径资源文件的方法通常用于读取配置文件、文本数据或其他需要在应用程序中使用的数据。例如,common.imports
文件可能包含一些需要在应用程序启动时加载的配置或资源路径。
注意事项
-
确保
common.imports
文件位于类路径的正确位置,否则getResourceAsStream
方法将返回null
。 -
处理
InputStream
和Reader
时,应该始终确保在操作完成后关闭它们,以释放系统资源。这可以通过在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配置文件其中有自动配置类的引用地址。
执行流程
-
项目启动:应用程序启动时,Spring Boot 主类(通常使用
@SpringBootApplication
注解)会触发 Spring 应用上下文的创建。 -
加载配置文件:Spring Boot 会查找并加载
application.properties
或application.yml
等配置文件。 -
识别自动配置类:Spring Boot 会扫描
resources
目录下的.imports
文件,读取其中列出的自动配置类的全限定名。 -
加载自动配置类:根据
.imports
文件中列出的自动配置类,Spring Boot 会加载这些类,并根据条件注解决定是否应用这些配置。 -
应用自动配置:如果条件满足,Spring Boot 会应用自动配置类中定义的配置,注册相应的 bean 到 Spring 应用上下文中。
-
初始化应用程序上下文:完成自动配置类的加载和 bean 的注册后,Spring Boot 会初始化应用程序上下文。
-
启动应用程序:最后,Spring Boot 会启动应用程序,应用程序上下文中的所有 bean 都会被创建和初始化。
Springboot自动配置原理:
第八课:自定义starter
mybatis自动配置的实现步骤:
1.在autoconfigure模块中,编写配置类,配置类中包含两个Bean对象
代码解释:
MyBatis 是一个流行的 Java 持久层框架,它提供了简单的方法将 SQL 查询转换为 Java 对象(Object-Relational Mapping,简称 ORM)。MyBatis 消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,使得开发者可以专注于编写 SQL 查询。
MyBatis 的主要特点:
-
简单易用:MyBatis 通过 XML 或注解方式配置 SQL 映射,简单直观。
-
灵活的 SQL 支持:MyBatis 允许编写动态 SQL,可以根据不同条件构建不同的 SQL 语句。
-
缓存机制:MyBatis 提供了一级缓存和二级缓存,以提高查询效率。
-
事务管理:MyBatis 支持声明式事务管理,简化了事务的控制。
-
代码生成:MyBatis 提供了代码生成器 iBatis Generator,可以根据数据库表结构自动生成实体类和映射文件。
-
模块化和可扩展性:MyBatis 允许开发者自定义 SQL 类型处理器、对象工厂、映射器等组件,提供了高度的可扩展性。
MyBatis 的工作原理:
-
配置:MyBatis 通过 XML 文件或注解配置数据源、事务管理器、映射器等信息。
-
SQL 映射:开发者编写 SQL 映射文件,将 SQL 查询映射到 Java 方法上。
-
创建 SqlSession:应用程序通过 SqlSessionFactory 创建 SqlSession 实例。
-
执行映射器方法:通过 SqlSession 调用映射器接口的方法,MyBatis 会自动执行对应的 SQL 查询。
-
处理结果:MyBatis 将查询结果映射到 Java 对象,并返回给应用程序。
-
关闭 SqlSession:完成数据库操作后,关闭 SqlSession 以释放资源。
MyBatis 的核心组件:
-
SqlSessionFactory:负责创建 SqlSession 实例。
-
SqlSession:是 MyBatis 的核心接口,用于执行映射器方法和获取映射器。
-
Mapper 接口:定义了数据库操作方法,MyBatis 根据映射文件自动实现这些接口。
-
映射器 XML 文件:包含了 SQL 映射语句,定义了 SQL 查询和结果映射规则。
-
TypeHandler:用于处理 Java 类型和 JDBC 类型之间的转换。
-
插件:可以扩展或自定义 MyBatis 的行为。
使用 MyBatis 的基本步骤:
-
添加 MyBatis 依赖:在项目的构建配置文件(如 Maven 的
pom.xml
)中添加 MyBatis 依赖。 -
配置数据源和事务管理器:在 MyBatis 配置文件中配置数据源和事务管理器。
-
编写 Mapper 接口:定义数据库操作方法。
-
编写映射器 XML 文件:定义 SQL 查询和结果映射规则。
-
创建 SqlSessionFactory:根据配置文件创建 SqlSessionFactory 实例。
-
执行数据库操作:通过 SqlSession 调用 Mapper 接口的方法执行数据库操作。
-
关闭 SqlSession:完成数据库操作后关闭 SqlSession。
2.编写.imports文件,用于Springboot在启动时识别自动配置类名
3.在注入依赖模块中,引入自动配置类,这样其他模块要使用mybatis的自动配置时,只需要调用starter。 4.在其他项目中,使用这个Starter模块。