开发喵星球

2023.11.9 听写

2023.11.9 听写

1.注入Bean的方式

​ Spring容器中支持的依赖注入方式主要有Setter方法注入、构造函数注入、字段注入。

​ 1.Setter方法注入

​ 通过在 Setter 方法上使用@Autowired注解来进行注入。具有可选择性和灵活性高的特点

@Service
public class MyService {
    private MyRepository repository;

    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

​ 2.构造函数注入

​ 通过在类的构造函数上使用@Autowired注解将依赖注入到 Bean 中。

@Service
public class MyService {
    private final MyRepository repository;

    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}

​ 3.字段注入

​ 可以使用@Autowired注解直接在字段上注入依赖。

@Service
public class MyService {
    @Autowired
    private MyRepository repository;
}

2.Autowired与Resource的区别

@Autowired@Resource 是在 Spring 框架中用于注入依赖的两个常用注解,它们有以下区别:

  1. 注解来源:
    • @Autowired 是 Spring 框架提供的注解,用于实现依赖注入。
    • @ResourceJavaEE 规范中的注解,也可以用于实现依赖注入。在 Spring 中,它由 Spring 进行了解析和处理。
  2. 注入方式:
    • @Autowired 按照类型进行自动装配。它会根据目标类型从容器中查找匹配的 Bean,并将其注入到相应的字段、方法参数或者构造函数中。
    • @Resource 可以按照名称进行自动装配,也可以按照类型进行自动装配。如果通过 name 属性指定了名称,则会根据指定的名称从容器中查找匹配的 Bean 进行注入;如果没有指定名称,则按照类型进行注入。
  3. 是否允许多个匹配:
    • @Autowired 默认要求依赖的 Bean 必须存在且唯一,如果找到多个匹配的 Bean,则会抛出异常。
    • @Resource 允许依赖的 Bean 不存在或者存在多个匹配的 Bean,它可以通过 name 属性指定名称来解决多个匹配的问题。
  4. 扩展性:
    • @Autowired 是 Spring 框架提供的注解,它支持更多的高级特性,例如可选依赖、自定义限定符等。
    • @ResourceJavaEE 规范中的注解,相对来说功能较为简单,不支持一些高级特性。

3.Mybatis中缓存

  1. 一级缓存(本地缓存):

    • 一级缓存是 MyBatis 默认开启的缓存级别。当多个线程从数据库中查询相同的数据时,第一次查询的结果会被缓存到当前线程的一级缓存中。
    • 一级缓存的作用范围仅限于一个 SqlSession,当 SqlSession 关闭或者执行了明确的清空缓存操作时,一级缓存会被清空。
  2. 二级缓存(全局缓存):

    • 二级缓存是基于 SqlSessionFactory 级别的缓存,可以被多个 SqlSession 共享。
    • 默认情况下,MyBatis 不开启二级缓存,需要手动在配置文件中进行配置。
    • 二级缓存的生命周期跨越多个 SqlSession,其中的数据会被保存在内存中,提供了更高级别的缓存共享机制。
  3. 补充:

    缓存实现:

​ 缓存配置:

4.#与$的区别

# 是建议使用的占位符符号,可以避免 SQL 注入问题,并且支持各种类型的参数。而 $ 是直接替换参数值的符号,一般不建议使用,因为它存在潜在的 SQL 注入风险,并且效率相对较低。

  1. 解析方式:
    • # 符号用于预编译的 SQL 语句中,参数会被替换为一个占位符 ?MyBatis 会将参数值通过安全的预编译方式注入到 SQL 语句中,避免了 SQL 注入的风险。
    • $ 符号用于直接拼接 SQL 语句中,参数会被替换为实际的参数值。这种方式是字符串替换,并没有经过预编译处理,可能存在潜在的 SQL 注入风险。
  2. 限制条件:
    • # 可以接收任意对象作为参数,并且 MyBatis 会根据参数的类型,使用合适的方式进行处理。它可以应对各种类型的参数,例如基本数据类型、String、集合对象等。
    • $ 只接收字符串作为参数,并且直接将参数值拼接到 SQL 语句中。因此,使用 $ 符号时,必须确保参数值的安全性,避免 SQL 注入问题。一般来说,不建议直接使用 $ 符号,除非你有明确的理由和控制参数的来源。
  3. 预编译能力:
    • # 使用的是预编译功能,可以提高 SQL 的执行效率。参数的实际值不会直接拼接到 SQL 语句中,而是作为占位符的参数被传递给数据库驱动,让数据库进行解析和处理。
    • $ 是直接替换参数的值到 SQL 语句中,没有预编译的过程。因此,每次传入的参数值都会被直接拼接到 SQL 语句中,可能会导致 SQL 的重复编译和执行效率低下。

5.Mybatis中可以进行一对一、一对多的的查询方法是什么,区别是什么

  1. 使用嵌套查询(Nested Select):
    • 对于一对一查询,可以使用 <resultMap> 中的 <association> 元素配置关联关系,并在 <select> 语句中使用嵌套查询(select 元素)来完成。
    • 对于一对多查询,可以使用 <resultMap> 中的 <collection> 元素配置关联关系,并在 <select> 语句中使用嵌套查询(select 元素)来完成。
    • 嵌套查询是通过执行多条 SQL 语句来获取关联对象的数据,并将结果合并到主对象中。这种方式适用于关联对象数据较多,需要分开查询的情况。
  2. 使用连接查询(Join Query):
    • 对于一对一查询,可以在 <select> 语句中使用连接查询(JOIN 或者子查询)来关联两个表,并通过查询结果将关联对象的数据映射到主对象的属性上。
    • 对于一对多查询,可以在 <select> 语句中使用连接查询(JOIN 或者子查询)来关联两个表,并通过查询结果将关联对象的数据映射到主对象的集合属性上。
    • 连接查询是通过一条 SQL 语句完成所有关联查询的操作,将关联对象的数据直接映射到主对象中。这种方式适用于关联对象数据较少,可一次查询完成的情况。

区别:

   
分类:学员日志 作者:开发喵 发表于:2023-11-09 16:50:38 阅读量:103
  >>


powered by kaifamiao