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;
}
@Autowired
和 @Resource
是在 Spring 框架中用于注入依赖的两个常用注解,它们有以下区别:
@Autowired
是 Spring 框架提供的注解,用于实现依赖注入。@Resource
是 JavaEE
规范中的注解,也可以用于实现依赖注入。在 Spring 中,它由 Spring 进行了解析和处理。@Autowired
按照类型进行自动装配。它会根据目标类型从容器中查找匹配的 Bean,并将其注入到相应的字段、方法参数或者构造函数中。@Resource
可以按照名称进行自动装配,也可以按照类型进行自动装配。如果通过 name
属性指定了名称,则会根据指定的名称从容器中查找匹配的 Bean 进行注入;如果没有指定名称,则按照类型进行注入。@Autowired
默认要求依赖的 Bean 必须存在且唯一,如果找到多个匹配的 Bean,则会抛出异常。@Resource
允许依赖的 Bean 不存在或者存在多个匹配的 Bean,它可以通过 name
属性指定名称来解决多个匹配的问题。@Autowired
是 Spring 框架提供的注解,它支持更多的高级特性,例如可选依赖、自定义限定符等。@Resource
是 JavaEE
规范中的注解,相对来说功能较为简单,不支持一些高级特性。MyBatis
默认开启的缓存级别。当多个线程从数据库中查询相同的数据时,第一次查询的结果会被缓存到当前线程的一级缓存中。SqlSession
,当 SqlSession
关闭或者执行了明确的清空缓存操作时,一级缓存会被清空。SqlSessionFactory
级别的缓存,可以被多个 SqlSession
共享。MyBatis
不开启二级缓存,需要手动在配置文件中进行配置。SqlSession
,其中的数据会被保存在内存中,提供了更高级别的缓存共享机制。缓存实现:
MyBatis
提供了多种缓存的实现,包括默认的 PerpetualCache
,以及可配置的 LruCache
、FifoCache
、ScheduledCache
等。 缓存配置:
MyBatis
的配置文件中进行配置。 #
是建议使用的占位符符号,可以避免 SQL 注入问题,并且支持各种类型的参数。而 $
是直接替换参数值的符号,一般不建议使用,因为它存在潜在的 SQL 注入风险,并且效率相对较低。
#
符号用于预编译的 SQL 语句中,参数会被替换为一个占位符 ?
。MyBatis
会将参数值通过安全的预编译方式注入到 SQL 语句中,避免了 SQL 注入的风险。$
符号用于直接拼接 SQL 语句中,参数会被替换为实际的参数值。这种方式是字符串替换,并没有经过预编译处理,可能存在潜在的 SQL 注入风险。#
可以接收任意对象作为参数,并且 MyBatis
会根据参数的类型,使用合适的方式进行处理。它可以应对各种类型的参数,例如基本数据类型、String、集合对象等。$
只接收字符串作为参数,并且直接将参数值拼接到 SQL 语句中。因此,使用 $
符号时,必须确保参数值的安全性,避免 SQL 注入问题。一般来说,不建议直接使用 $
符号,除非你有明确的理由和控制参数的来源。#
使用的是预编译功能,可以提高 SQL 的执行效率。参数的实际值不会直接拼接到 SQL 语句中,而是作为占位符的参数被传递给数据库驱动,让数据库进行解析和处理。$
是直接替换参数的值到 SQL 语句中,没有预编译的过程。因此,每次传入的参数值都会被直接拼接到 SQL 语句中,可能会导致 SQL 的重复编译和执行效率低下。<resultMap>
中的 <association>
元素配置关联关系,并在 <select>
语句中使用嵌套查询(select
元素)来完成。<resultMap>
中的 <collection>
元素配置关联关系,并在 <select>
语句中使用嵌套查询(select
元素)来完成。<select>
语句中使用连接查询(JOIN
或者子查询)来关联两个表,并通过查询结果将关联对象的数据映射到主对象的属性上。<select>
语句中使用连接查询(JOIN
或者子查询)来关联两个表,并通过查询结果将关联对象的数据映射到主对象的集合属性上。区别:
powered by kaifamiao