📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。
📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🍊 MyBatis核心知识点之MapperScannerConfigurer:概述
在当今的软件开发领域,MyBatis 作为一款优秀的持久层框架,以其简洁的配置和强大的功能,深受广大开发者的喜爱。然而,在实际的项目开发中,手动配置 Mapper 接口和 XML 映射文件往往是一项繁琐且容易出错的工作。为了解决这一问题,MyBatis 提供了 MapperScannerConfigurer,它能够自动扫描指定包下的 Mapper 接口,并生成相应的 XML 映射文件,极大地简化了 MyBatis 的配置过程。
在传统的 MyBatis 应用中,开发者需要手动编写 Mapper 接口和对应的 XML 映射文件,这不仅增加了工作量,而且容易出错。例如,在大型项目中,如果某个 Mapper 接口被误删或修改,可能会导致整个系统无法正常运行。MapperScannerConfigurer 的出现,正是为了解决这一问题。
首先,我们需要明确 MapperScannerConfigurer 的概念。它是一个配置类,用于自动扫描指定包下的 Mapper 接口,并生成相应的 XML 映射文件。通过配置 MapperScannerConfigurer,开发者可以避免手动编写 Mapper 接口和 XML 映射文件,从而提高开发效率。
其次,MapperScannerConfigurer 的作用主要体现在以下几个方面。首先,它可以自动生成 Mapper 接口和 XML 映射文件,简化了 MyBatis 的配置过程。其次,它可以减少因手动编写 Mapper 接口和 XML 映射文件而可能出现的错误,提高代码的可靠性。最后,它可以帮助开发者更好地管理 Mapper 接口和 XML 映射文件,提高项目的可维护性。
此外,MapperScannerConfigurer 还具有以下优势。首先,它支持多种注解,如 @Mapper、@MapperScan 等,方便开发者进行配置。其次,它支持自定义扫描规则,如指定扫描的包路径、排除的接口等,提高了配置的灵活性。最后,它支持多种数据库类型,如 MySQL、Oracle 等,适用于不同的项目需求。
接下来,我们将分别介绍 MapperScannerConfigurer 的概念、作用和优势,帮助读者全面了解这一 MyBatis 核心知识点。通过学习这些内容,读者将能够更好地掌握 MyBatis 的配置技巧,提高项目开发效率。
MyBatis的MapperScannerConfigurer:概念
在MyBatis框架中,MapperScannerConfigurer扮演着至关重要的角色。它是一个用于扫描指定路径下接口的配置类,能够自动生成对应的Mapper代理实现,从而简化了MyBatis的配置过程。
首先,让我们来了解一下MapperScannerConfigurer的基本概念。它是一个配置类,通过配置文件或注解的方式,指定了Mapper接口的扫描路径。当Spring容器启动时,MapperScannerConfigurer会自动扫描指定路径下的接口,并为每个接口生成对应的Mapper代理实现。
接下来,我们详细探讨一下MapperScannerConfigurer的几个关键点。
- 扫描路径:扫描路径是MapperScannerConfigurer的核心配置之一。它指定了Mapper接口所在的包路径。例如,如果我们希望扫描com.example.mapper包下的所有接口,则配置如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
-
扫描模式:MapperScannerConfigurer支持两种扫描模式:按接口名称扫描和按接口类型扫描。默认情况下,它采用按接口名称扫描模式。如果需要按接口类型扫描,可以通过设置
type属性为CLASSPATH来实现。 -
扫描结果处理:扫描完成后,MapperScannerConfigurer会为每个接口生成对应的Mapper代理实现。这些代理实现将自动注入到Spring容器中,方便我们在其他组件中使用。
-
扫描异常处理:在扫描过程中,如果遇到异常,MapperScannerConfigurer会抛出
BeanDefinitionStoreException。在实际开发中,我们需要对这类异常进行处理,以确保应用程序的稳定性。 -
配置文件设置:除了XML配置文件外,我们还可以通过注解的方式配置MapperScannerConfigurer。例如,使用
@MapperScan注解指定扫描路径:
@MapperScan("com.example.mapper")
public class Application {
// ...
}
-
Spring集成:MapperScannerConfigurer与Spring框架紧密集成。在Spring容器中,它将自动扫描指定路径下的接口,并为每个接口生成对应的Mapper代理实现。这使得MyBatis与Spring框架无缝结合,方便我们在Spring应用程序中使用MyBatis。
-
动态代理机制:MapperScannerConfigurer利用Java的动态代理机制为每个Mapper接口生成代理实现。这些代理实现实现了MyBatis的SqlSession接口,从而能够执行数据库操作。
总之,MyBatis的MapperScannerConfigurer是一个强大的配置类,它简化了MyBatis的配置过程,使得我们在开发过程中能够更加高效地使用MyBatis。通过深入了解其概念和配置方法,我们可以更好地利用这一工具,提高开发效率。
| 配置项 | 描述 | 示例 |
|---|---|---|
| 扫描路径 | 指定Mapper接口所在的包路径,MapperScannerConfigurer将自动扫描该路径下的接口 | <property name="basePackage" value="com.example.mapper" /> |
| 扫描模式 | 指定扫描接口的模式,默认为按接口名称扫描,也可以按接口类型扫描 | 默认模式:按接口名称扫描<br>按接口类型扫描:<property name="type" value="CLASSPATH" /> |
| 扫描结果处理 | 扫描完成后,为每个接口生成对应的Mapper代理实现,并自动注入到Spring容器中 | 自动注入到Spring容器中,方便其他组件使用 |
| 扫描异常处理 | 在扫描过程中遇到异常时,抛出BeanDefinitionStoreException异常 | 需要处理此类异常,确保应用程序稳定性 |
| 配置文件设置 | 可以通过XML配置文件或注解的方式配置MapperScannerConfigurer | XML配置:<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">...</bean><br>注解配置:@MapperScan("com.example.mapper") |
| Spring集成 | MapperScannerConfigurer与Spring框架紧密集成,自动扫描接口并生成代理实现 | 在Spring容器中自动扫描并生成代理实现,无缝结合MyBatis与Spring |
| 动态代理机制 | 利用Java的动态代理机制为每个Mapper接口生成代理实现,实现SqlSession接口 | 代理实现能够执行数据库操作,简化MyBatis使用 |
MapperScannerConfigurer在MyBatis与Spring的集成中扮演着至关重要的角色。它不仅简化了Mapper接口的配置过程,还通过动态代理机制,为每个Mapper接口生成代理实现,使得数据库操作更加便捷。这种自动扫描和注入的方式,极大地提高了开发效率,同时也降低了代码的复杂度。在处理扫描异常时,合理地处理
BeanDefinitionStoreException异常,可以确保应用程序的稳定性,避免因异常导致的服务中断。此外,配置文件设置提供了灵活的配置方式,无论是通过XML配置文件还是注解,都能满足不同的开发需求。
MyBatis的MapperScannerConfigurer是一个重要的配置类,它负责扫描指定包下的接口,并自动生成对应的Mapper代理实现。下面将详细阐述其作用、配置原理、扫描机制、映射器接口生成、依赖注入、动态代理、MyBatis配置文件、Spring集成以及应用场景。
作用
MapperScannerConfigurer的主要作用是简化MyBatis的配置过程。在传统的MyBatis项目中,我们需要手动编写Mapper接口和对应的XML映射文件,然后通过SqlSessionFactoryBuilder构建SqlSessionFactory,最后通过SqlSessionFactory获取SqlSession来执行SQL语句。而MapperScannerConfigurer可以自动完成这些繁琐的配置工作,使得开发者可以更加专注于业务逻辑的实现。
配置原理
MapperScannerConfigurer的配置原理主要基于Spring的Bean生命周期和AOP(面向切面编程)技术。当Spring容器启动时,MapperScannerConfigurer会扫描指定包下的接口,并将这些接口注册为Spring的Bean。然后,通过动态代理技术生成对应的Mapper代理实现,并将其注入到Spring容器中。
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
// ... 省略其他代码 ...
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
// 扫描指定包下的接口
ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
scanner.setBasePackage(basePackage);
scanner.registerFilters();
scanner.doScan(basePackage);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// ... 省略其他代码 ...
}
}
扫描机制
MapperScannerConfigurer的扫描机制主要依赖于Spring的ClassPathMapperScanner。ClassPathMapperScanner会扫描指定包下的接口,并检查这些接口是否实现了MyBatis的Mapper接口。如果接口实现了Mapper接口,ClassPathMapperScanner会动态生成对应的Mapper代理实现。
public class ClassPathMapperScanner extends ClassPathBeanDefinitionScanner {
// ... 省略其他代码 ...
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
// 检查接口是否实现了Mapper接口
return beanDefinition.getMetadata().isInterface() && beanDefinition.getMetadata().isAnnotationPresent(Mapper.class);
}
}
映射器接口生成
MapperScannerConfigurer通过动态代理技术生成对应的Mapper代理实现。动态代理技术允许在运行时创建一个代理对象,该代理对象可以拦截接口的方法调用,并执行相应的逻辑。
public class MapperProxy<T> implements InvocationHandler, Serializable {
// ... 省略其他代码 ...
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行相应的逻辑
// ...
}
}
依赖注入
MapperScannerConfigurer生成的Mapper代理实现会被注入到Spring容器中。这样,开发者可以通过Spring容器获取到Mapper代理实现,并使用其提供的API进行数据库操作。
public class SomeService {
@Autowired
private SomeMapper someMapper;
// ... 省略其他代码 ...
}
动态代理
MapperScannerConfigurer使用动态代理技术生成对应的Mapper代理实现。动态代理技术允许在运行时创建一个代理对象,该代理对象可以拦截接口的方法调用,并执行相应的逻辑。
public class MapperProxy<T> implements InvocationHandler, Serializable {
// ... 省略其他代码 ...
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行相应的逻辑
// ...
}
}
MyBatis配置文件
MapperScannerConfigurer生成的Mapper代理实现需要依赖MyBatis的配置文件。在MyBatis配置文件中,需要配置数据源、事务管理器、映射器接口等。
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.example.mapper.SomeMapper"/>
</mappers>
</configuration>
Spring集成
MapperScannerConfigurer可以与Spring框架集成,使得MyBatis的配置更加简单。在Spring配置文件中,只需要添加MapperScannerConfigurer的Bean定义即可。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
应用场景
MapperScannerConfigurer适用于以下场景:
- 需要简化MyBatis配置过程的项目。
- 需要自动生成Mapper代理实现的项目。
- 需要与Spring框架集成的项目。
通过使用MapperScannerConfigurer,开发者可以更加专注于业务逻辑的实现,提高开发效率。
| 配置类 | 主要作用 | 配置原理 | 扫描机制 | 映射器接口生成 | 依赖注入 | 动态代理 | MyBatis配置文件 | Spring集成 | 应用场景 |
|---|---|---|---|---|---|---|---|---|---|
| MapperScannerConfigurer | 简化MyBatis配置过程,自动生成Mapper代理实现,提高开发效率 | 基于Spring的Bean生命周期和AOP技术,扫描指定包下的接口,注册为Spring Bean,动态生成代理实现 | 依赖于Spring的ClassPathMapperScanner,扫描指定包下的接口,检查是否实现Mapper接口 | 通过动态代理技术生成对应的Mapper代理实现,拦截接口方法调用,执行逻辑 | 生成的Mapper代理实现被注入到Spring容器中,通过Spring容器获取并使用 | 使用动态代理技术,在运行时创建代理对象,拦截方法调用,执行逻辑 | 需要配置数据源、事务管理器、映射器接口等,依赖MyBatis配置文件 | 与Spring框架集成,通过添加Bean定义简化配置过程 | 需要简化MyBatis配置、自动生成Mapper实现、与Spring集成的项目 |
MapperScannerConfigurer的配置原理在于其巧妙地利用了Spring的Bean生命周期和AOP技术。它通过扫描指定包下的接口,将这些接口注册为Spring Bean,并动态生成对应的代理实现。这种机制不仅简化了MyBatis的配置过程,还提高了开发效率。在扫描过程中,它依赖于Spring的ClassPathMapperScanner,对指定包下的接口进行检查,确保其实现了Mapper接口。生成的Mapper代理实现随后被注入到Spring容器中,使得开发者可以通过Spring容器轻松获取并使用这些代理对象。这种设计不仅提高了代码的可维护性,还增强了系统的灵活性。
MyBatis的MapperScannerConfigurer是一个强大的配置工具,它能够自动扫描映射器接口,从而简化配置,提高开发效率。下面将详细阐述其优势。
首先,MapperScannerConfigurer能够自动扫描映射器接口,这意味着开发者无需手动配置每个映射器接口的映射文件和映射器实现类。通过在Spring配置文件中添加一行简单的配置,即可实现自动扫描,极大地简化了配置过程。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
上述代码中,basePackage属性指定了需要扫描的包路径。MyBatis会自动扫描该路径下所有接口,并将它们注册为Spring的Bean。
其次,MapperScannerConfigurer的优势之一在于提高开发效率。在传统的MyBatis开发中,开发者需要手动编写映射文件和映射器实现类,这不仅增加了工作量,而且容易出错。而MapperScannerConfigurer通过自动扫描映射器接口,使得开发者只需关注业务逻辑的实现,从而提高了开发效率。
此外,MapperScannerConfigurer与Spring框架集成,使得MyBatis在Spring项目中更加灵活。在Spring配置文件中,可以轻松地配置MapperScannerConfigurer,并将其与Spring的其他Bean进行整合。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
上述代码中,sqlSessionFactoryBeanName属性指定了MyBatis的SqlSessionFactory的Bean名称。这样,MapperScannerConfigurer就可以使用该SqlSessionFactory来创建映射器实例。
MapperScannerConfigurer还支持多种数据库。通过配置不同的数据源和SqlSessionFactory,可以轻松地切换数据库。这使得在开发过程中,可以方便地测试和切换不同的数据库。
此外,MapperScannerConfigurer具有良好的扩展性。在需要添加新的映射器接口时,只需将接口添加到扫描路径下,无需修改其他配置。这使得项目在后期维护和扩展时更加方便。
最后,MapperScannerConfigurer简化了代码结构,提升了代码可维护性。通过自动扫描映射器接口,减少了手动编写的代码量,使得项目结构更加清晰。同时,由于配置的简化,降低了出错的可能性,提高了代码的可维护性。
总之,MyBatis的MapperScannerConfigurer在简化配置、提高开发效率、集成Spring框架、灵活配置、支持多种数据库、扩展性以及简化代码结构等方面具有显著优势。这使得它在MyBatis项目中得到了广泛应用。
| 优势描述 | 详细说明 | 示例代码 |
|---|---|---|
| 自动扫描映射器接口 | 自动扫描指定包路径下的所有接口,并将其注册为Spring的Bean,无需手动配置映射文件和映射器实现类。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> |
| 提高开发效率 | 通过自动扫描映射器接口,开发者只需关注业务逻辑的实现,减少了手动编写映射文件和映射器实现类的工作量,降低了出错的可能性。 | 无需额外代码,通过配置basePackage实现 |
| 集成Spring框架 | 与Spring框架集成,使得MyBatis在Spring项目中更加灵活,可以轻松地配置MapperScannerConfigurer,并将其与Spring的其他Bean进行整合。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> |
| 灵活配置 | 支持配置不同的数据源和SqlSessionFactory,可以轻松地切换数据库,方便测试和切换不同的数据库。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> |
| 支持多种数据库 | 通过配置不同的数据源和SqlSessionFactory,可以支持多种数据库,方便在不同数据库之间进行切换。 | 无需额外代码,通过配置不同的数据源和SqlSessionFactory实现 |
| 好的扩展性 | 在需要添加新的映射器接口时,只需将接口添加到扫描路径下,无需修改其他配置,方便项目后期维护和扩展。 | 无需额外代码,通过添加新的接口到扫描路径实现 |
| 简化代码结构 | 通过自动扫描映射器接口,减少了手动编写的代码量,使得项目结构更加清晰,提高了代码的可维护性。 | 无需额外代码,通过配置basePackage实现 |
| 应用广泛 | 在MyBatis项目中广泛应用,因其简化配置、提高开发效率、集成Spring框架、灵活配置、支持多种数据库、扩展性以及简化代码结构等方面的优势。 | 无需额外代码,通过配置实现 |
自动扫描映射器接口的功能,不仅简化了MyBatis与Spring集成的配置过程,还极大地提升了开发效率。开发者无需手动编写映射文件和映射器实现类,只需关注业务逻辑的实现,从而降低了出错的可能性,并使得项目结构更加清晰,提高了代码的可维护性。这种自动化的配置方式,使得MyBatis在Spring项目中更加灵活,可以轻松地与其他Spring Bean进行整合,为开发者带来了极大的便利。
🍊 MyBatis核心知识点之MapperScannerConfigurer:配置
在大型Java项目中,MyBatis作为持久层框架,其高效的数据访问能力得到了广泛的应用。然而,在配置MyBatis时,如何高效地管理Mapper接口的扫描和注册,成为了开发人员面临的一个实际问题。为了解决这一问题,MyBatis提供了MapperScannerConfigurer配置类,它能够自动扫描指定包下的Mapper接口,并注册到SqlSessionFactory中,从而简化了MyBatis的配置过程。
引入MapperScannerConfigurer配置类的原因在于,传统的MyBatis配置方式需要手动编写XML映射文件和Mapper接口的注册代码,这不仅增加了开发工作量,而且在项目规模扩大时,管理难度也随之增加。MapperScannerConfigurer的出现,使得开发者能够通过简单的配置,实现Mapper接口的自动扫描和注册,极大地提高了开发效率和代码的可维护性。
接下来,我们将对MyBatis核心知识点之MapperScannerConfigurer的配置进行详细阐述。首先,我们将介绍配置文件的使用,包括如何配置扫描包路径、指定Mapper接口的注解等。其次,我们将探讨属性配置的细节,如扫描模式、是否添加接口到Spring容器中等。最后,通过配置示例,我们将展示如何在实际项目中应用MapperScannerConfigurer,以及如何解决可能遇到的问题。
通过本章节的学习,读者将能够掌握MapperScannerConfigurer的配置方法,了解其工作原理,并在实际项目中灵活运用,从而提高MyBatis配置的效率和项目的可维护性。
// MyBatis的MapperScannerConfigurer配置文件示例
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 基本配置 -->
<property name="basePackage" value="com.example.mapper" />
<!-- SQL映射文件位置 -->
<property name="sqlMapLocation" value="classpath:mapper/*.xml" />
<!-- 映射器接口的完全限定名 -->
<property name="mapperInterface" value="com.example.mapper.UserMapper" />
<!-- 命名空间 -->
<property name="namespace" value="com.example.mapper.UserMapper" />
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="com.example.model" />
<!-- 动态SQL -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 缓存配置 -->
<property name="cacheEnabled" value="true" />
<!-- 插件配置 -->
<property name="plugins">
<list>
<bean class="com.example.plugin.MyPlugin">
<!-- 插件配置参数 -->
</bean>
</list>
</property>
<!-- 属性配置 -->
<property name="configurationProperties">
<props>
<prop key="example.property">value</prop>
</props>
</property>
<!-- 环境配置 -->
<property name="environment" value="development" />
<!-- 事务管理 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
在MyBatis中,MapperScannerConfigurer是一个重要的配置类,它用于自动扫描指定包路径下的接口,并生成相应的Mapper代理实现。以下是对其配置文件中各个核心知识点的详细描述:
-
基本配置:
basePackage属性指定了需要扫描的包路径,MyBatis会自动扫描该路径下的接口。 -
SQL映射文件位置:
sqlMapLocation属性指定了SQL映射文件的位置,MyBatis会自动加载这些映射文件。 -
映射器接口的完全限定名:
mapperInterface属性指定了映射器接口的完全限定名,MyBatis会根据该接口生成相应的Mapper代理实现。 -
命名空间:
namespace属性指定了映射器接口的命名空间,用于在XML映射文件中引用。 -
类型别名:
typeAliasesPackage属性指定了类型别名的包路径,MyBatis会自动为该包路径下的类生成类型别名。 -
动态SQL:
sqlSessionFactoryBeanName属性指定了SQL会话工厂的Bean名称,MyBatis会根据该名称获取SQL会话工厂。 -
缓存配置:
cacheEnabled属性用于启用或禁用二级缓存。 -
插件配置:
plugins属性用于配置MyBatis插件,可以对SQL执行过程进行拦截和修改。 -
属性配置:
configurationProperties属性用于配置MyBatis的属性,如数据库连接信息等。 -
环境配置:
environment属性用于指定MyBatis的环境,如开发环境、测试环境等。 -
事务管理:
transactionManager属性用于指定事务管理器,MyBatis会根据该事务管理器进行事务管理。 -
数据库连接池:
dataSource属性用于指定数据库连接池,MyBatis会根据该连接池获取数据库连接。
通过以上配置,MyBatis可以自动扫描指定包路径下的接口,并生成相应的Mapper代理实现,从而简化了MyBatis的开发过程。
| 配置属性 | 描述 | 示例值 |
|---|---|---|
| basePackage | 指定需要扫描的包路径,MyBatis会自动扫描该路径下的接口 | com.example.mapper |
| sqlMapLocation | 指定SQL映射文件的位置,MyBatis会自动加载这些映射文件 | classpath:mapper/*.xml |
| mapperInterface | 指定映射器接口的完全限定名,MyBatis会根据该接口生成相应的Mapper代理实现 | com.example.mapper.UserMapper |
| namespace | 指定映射器接口的命名空间,用于在XML映射文件中引用 | com.example.mapper.UserMapper |
| typeAliasesPackage | 指定类型别名的包路径,MyBatis会自动为该包路径下的类生成类型别名 | com.example.model |
| sqlSessionFactoryBeanName | 指定SQL会话工厂的Bean名称,MyBatis会根据该名称获取SQL会话工厂 | sqlSessionFactory |
| cacheEnabled | 用于启用或禁用二级缓存 | true/false |
| plugins | 用于配置MyBatis插件,可以对SQL执行过程进行拦截和修改 | <list><bean class="com.example.plugin.MyPlugin"></bean></list> |
| configurationProperties | 用于配置MyBatis的属性,如数据库连接信息等 | <props><prop key="example.property">value</prop></props> |
| environment | 用于指定MyBatis的环境,如开发环境、测试环境等 | development |
| transactionManager | 用于指定事务管理器,MyBatis会根据该事务管理器进行事务管理 | ref="transactionManager" |
| dataSource | 用于指定数据库连接池,MyBatis会根据该连接池获取数据库连接 | ref="dataSource" |
在配置MyBatis时,
basePackage属性至关重要,它决定了MyBatis扫描的接口范围。例如,在开发一个用户管理系统时,可以将basePackage设置为com.example.mapper,这样MyBatis就会自动扫描该路径下的所有接口,从而实现自动生成Mapper代理实现。此外,合理配置sqlMapLocation和mapperInterface可以确保MyBatis正确加载SQL映射文件和生成对应的Mapper代理实现,从而简化开发过程。在实际应用中,还需注意namespace属性与mapperInterface保持一致,以便在XML映射文件中正确引用接口方法。
// MyBatis的MapperScannerConfigurer属性配置示例
public class MapperScannerConfigurerExample {
// 配置文件路径
private String mapperLocations;
// 扫描包路径
private String basePackage;
// 扫描模式
private String annotationClass;
// 类型别名
private String typeAliasesPackage;
// 映射器接口
private String mapperInterface;
// 扫描器配置
private Properties properties;
// 扫描器属性
private String sqlSessionFactoryBeanName;
// 扫描器配置文件
private String configLocation;
// 配置文件解析
private SqlSessionFactory sqlSessionFactory;
// 属性值解析
private Properties configuration;
// 配置文件路径
private String resource;
// 配置文件格式
private String fileEncoding;
// 配置文件加载
private ClassLoader classLoader;
// 配置文件覆盖策略
private boolean failOnMissingBean;
// 配置文件热部署
private boolean lazyInitialization;
// 配置文件版本控制
private String version;
// 配置文件与Spring集成
private ApplicationContext applicationContext;
// 配置文件与Spring Boot集成
private ConfigurableEnvironment environment;
// 配置文件与MyBatis集成
private SqlSessionFactory sqlSessionFactoryBean;
// 配置文件与数据库集成
private DataSource dataSource;
// 配置文件与项目结构
private String projectPath;
// 配置文件与开发环境
private String developmentProfile;
// 配置文件与生产环境
private String productionProfile;
// 省略getter和setter方法
}
在MyBatis中,MapperScannerConfigurer是一个重要的配置类,用于扫描指定包路径下的Mapper接口,并自动生成相应的Mapper代理对象。以下是对MapperScannerConfigurer属性配置的详细描述:
-
配置文件路径(mapperLocations):指定Mapper接口的XML文件所在路径,可以是类路径或文件系统路径。
-
扫描包路径(basePackage):指定需要扫描的Mapper接口所在的包路径。
-
扫描模式(annotationClass):指定用于标记Mapper接口的注解类,默认为
@Mapper。 -
类型别名(typeAliasesPackage):指定需要扫描的类型别名所在的包路径。
-
映射器接口(mapperInterface):指定需要扫描的Mapper接口。
-
扫描器配置(properties):用于配置扫描器相关的属性,如数据库连接信息等。
-
扫描器属性(sqlSessionFactoryBeanName):指定SqlSessionFactory的Bean名称。
-
扫描器配置文件(configLocation):指定扫描器配置文件的路径。
-
配置文件解析(sqlSessionFactory):用于解析配置文件,获取SqlSessionFactory。
-
属性值解析(configuration):用于解析配置文件中的属性值。
-
配置文件路径(resource):指定配置文件的路径。
-
配置文件格式(fileEncoding):指定配置文件的编码格式。
-
配置文件加载(classLoader):用于加载配置文件。
-
配置文件覆盖策略(failOnMissingBean):当配置文件中缺少某个Bean时,是否抛出异常。
-
配置文件热部署(lazyInitialization):是否延迟初始化配置文件。
-
配置文件版本控制(version):用于控制配置文件的版本。
-
配置文件与Spring集成(applicationContext):用于集成Spring容器。
-
配置文件与Spring Boot集成(environment):用于集成Spring Boot环境。
-
配置文件与MyBatis集成(sqlSessionFactoryBean):用于集成MyBatis。
-
配置文件与数据库集成(dataSource):用于集成数据库连接。
-
配置文件与项目结构(projectPath):用于指定项目路径。
-
配置文件与开发环境(developmentProfile):用于指定开发环境配置。
-
配置文件与生产环境(productionProfile):用于指定生产环境配置。
通过以上属性配置,可以实现对MyBatis的Mapper接口进行自动扫描和代理生成,从而简化开发过程。
| 属性名称 | 属性描述 | 示例值 |
|---|---|---|
| mapperLocations | 指定Mapper接口的XML文件所在路径,可以是类路径或文件系统路径。 | classpath:mapper/*.xml |
| basePackage | 指定需要扫描的Mapper接口所在的包路径。 | com.example.mapper |
| annotationClass | 指定用于标记Mapper接口的注解类,默认为@Mapper。 | org.apache.ibatis.annotations.Mapper |
| typeAliasesPackage | 指定需要扫描的类型别名所在的包路径。 | com.example.aliases |
| mapperInterface | 指定需要扫描的Mapper接口。 | com.example.mapper.UserMapper |
| properties | 用于配置扫描器相关的属性,如数据库连接信息等。 | <property name="dataSource" ref="dataSource" /> |
| sqlSessionFactoryBeanName | 指定SqlSessionFactory的Bean名称。 | sqlSessionFactory |
| configLocation | 指定扫描器配置文件的路径。 | classpath:mybatis-config.xml |
| sqlSessionFactory | 用于解析配置文件,获取SqlSessionFactory。 | org.apache.ibatis.session.SqlSessionFactoryBuilder.newInstance() |
| configuration | 用于解析配置文件中的属性值。 | org.apache.ibatis.session.Configuration.newInstance() |
| resource | 指定配置文件的路径。 | classpath:mybatis-config.xml |
| fileEncoding | 指定配置文件的编码格式。 | UTF-8 |
| classLoader | 用于加载配置文件。 | Thread.currentThread().getContextClassLoader() |
| failOnMissingBean | 当配置文件中缺少某个Bean时,是否抛出异常。 | true |
| lazyInitialization | 是否延迟初始化配置文件。 | true |
| version | 用于控制配置文件的版本。 | 1.0.0 |
| applicationContext | 用于集成Spring容器。 | applicationContext |
| environment | 用于集成Spring Boot环境。 | environment |
| sqlSessionFactoryBean | 用于集成MyBatis。 | sqlSessionFactoryBean |
| dataSource | 用于集成数据库连接。 | dataSource |
| projectPath | 用于指定项目路径。 | /home/user/project |
| developmentProfile | 用于指定开发环境配置。 | dev |
| productionProfile | 用于指定生产环境配置。 | prod |
在实际应用中,配置文件
mybatis-config.xml的路径通过configLocation属性指定,这确保了MyBatis能够正确加载配置信息。例如,在Spring集成MyBatis时,配置文件通常位于类路径下,因此使用classpath:mybatis-config.xml作为路径。此外,fileEncoding属性用于确保配置文件正确解析,特别是在处理不同编码的文件时,如UTF-8编码,这对于避免字符编码错误至关重要。
// 配置MapperScannerConfigurer的示例代码
public class MapperScannerConfigurerExample {
// 配置MapperScannerConfigurer
public void configureMapperScannerConfigurer() {
// 创建MapperScannerConfigurer实例
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// 设置Mapper接口的扫描包路径
mapperScannerConfigurer.setBasePackage("com.example.mapper");
// 设置SQL映射文件的位置
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
// 设置Mapper接口生成策略
mapperScannerConfigurer.setMapperInterfaceClass(MapperInterface.class);
// 执行扫描操作
mapperScannerConfigurer.afterPropertiesSet();
}
}
在上述代码中,我们首先创建了一个MapperScannerConfigurer的实例。MapperScannerConfigurer是MyBatis框架中的一个重要组件,用于自动扫描指定包路径下的Mapper接口,并生成对应的Mapper代理实现。
接下来,我们通过setBasePackage方法设置了Mapper接口的扫描包路径。这个路径可以是单个包路径,也可以是多个包路径,通过逗号分隔。在这个例子中,我们设置了com.example.mapper作为扫描包路径。
然后,我们通过setSqlSessionFactoryBeanName方法设置了SQL会话工厂的Bean名称。这个名称需要在MyBatis配置文件中定义,以便MapperScannerConfigurer能够正确地获取到SQL会话工厂。
此外,我们还可以通过setMapperInterfaceClass方法设置Mapper接口生成策略。在这个例子中,我们使用了MapperInterface.class作为生成策略,表示使用默认的生成策略。
最后,我们调用afterPropertiesSet方法执行扫描操作。这个方法会自动扫描指定包路径下的Mapper接口,并生成对应的Mapper代理实现。
通过以上配置,MyBatis框架会自动扫描指定包路径下的Mapper接口,并生成对应的Mapper代理实现,从而简化了Mapper接口的配置和使用。
| 配置步骤 | 配置方法 | 配置参数 | 配置说明 |
|---|---|---|---|
| 创建实例 | new MapperScannerConfigurer() | 无 | 初始化MapperScannerConfigurer对象 |
| 设置扫描包路径 | setBasePackage("com.example.mapper") | "com.example.mapper" | 指定Mapper接口所在的包路径,支持多个包路径,用逗号分隔 |
| 设置SQL会话工厂Bean名称 | setSqlSessionFactoryBeanName("sqlSessionFactory") | "sqlSessionFactory" | 指定MyBatis配置文件中定义的SQL会话工厂的Bean名称 |
| 设置Mapper接口生成策略 | setMapperInterfaceClass(MapperInterface.class) | MapperInterface.class | 指定Mapper接口生成策略,此处使用默认生成策略 |
| 执行扫描操作 | afterPropertiesSet() | 无 | 执行扫描操作,自动扫描指定包路径下的Mapper接口,并生成对应的Mapper代理实现 |
在配置MyBatis的Mapper接口时,通过设置扫描包路径,可以自动识别并生成对应的Mapper代理实现。这种自动化的配置方式大大简化了开发流程,提高了开发效率。同时,通过指定SQL会话工厂Bean名称,可以确保在应用程序中正确地引用MyBatis配置文件中定义的SQL会话工厂。此外,配置Mapper接口生成策略,可以灵活地控制Mapper接口的生成方式,满足不同的开发需求。在实际应用中,合理配置这些参数,有助于构建高效、可维护的MyBatis应用程序。
🍊 MyBatis核心知识点之MapperScannerConfigurer:使用
在大型Java项目中,MyBatis框架作为持久层解决方案,其核心组件之一——MapperScannerConfigurer,扮演着至关重要的角色。想象一下,一个项目中有成百上千的Mapper接口,手动配置每个接口的映射文件无疑是一项繁琐且容易出错的工作。此时,MapperScannerConfigurer便应运而生,它能够自动扫描指定包下的Mapper接口,并生成相应的映射文件,极大地简化了MyBatis的配置过程。
引入MapperScannerConfigurer的重要性在于,它不仅提高了开发效率,还降低了配置错误的风险。在传统的MyBatis配置中,每个Mapper接口都需要单独配置其对应的映射文件,这不仅增加了工作量,还可能导致配置文件过多,难以维护。而MapperScannerConfigurer通过自动扫描包,自动生成映射文件,使得开发者只需关注业务逻辑的实现,无需再为映射文件的配置而烦恼。
接下来,我们将对MapperScannerConfigurer的几个关键知识点进行详细阐述。首先,我们将探讨如何配置MapperScannerConfigurer以扫描指定包下的Mapper接口。其次,我们将介绍如何通过配置文件或注解来指定映射文件的生成规则。然后,我们将深入解析Mapper接口的实现细节,包括如何定义Mapper接口的方法以及如何与映射文件中的SQL语句进行映射。最后,我们将通过一个示例代码,展示如何在实际项目中使用MapperScannerConfigurer,并演示其自动生成映射文件和扫描接口的功能。
通过以上内容的介绍,读者将能够全面理解MapperScannerConfigurer的工作原理和实际应用,从而在开发过程中更加高效地利用MyBatis框架,提升项目开发质量和效率。
MyBatis概述 MyBatis是一个优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MapperScannerConfigurer配置 MapperScannerConfigurer是MyBatis提供的一个配置类,用于扫描指定包下的接口,并自动生成对应的Mapper代理实现。在Spring配置文件中,可以这样配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
这里,basePackage属性指定了需要扫描的包路径。
扫描包的原理 MapperScannerConfigurer通过Java的反射机制,扫描指定包下的接口,然后根据接口名动态生成对应的Mapper代理实现。这个代理实现实现了MyBatis的Mapper接口,可以像调用普通Java对象一样调用数据库操作。
扫描包的配置参数
basePackage:指定需要扫描的包路径。sqlSessionFactoryBeanName:指定MyBatis的SqlSessionFactory的Bean名称。annotationClass:指定用于标记Mapper接口的注解类,默认为org.apache.ibatis.annotations.Mapper。
扫描包的注意事项
- 确保Mapper接口和对应的XML映射文件在同一个包下。
- Mapper接口需要使用
@Mapper注解进行标记。 - XML映射文件需要配置在相应的路径下。
扫描包与注解的关系 @Mapper注解是用于标记Mapper接口的,MapperScannerConfigurer会扫描这些标记了@Mapper注解的接口,并生成对应的Mapper代理实现。
扫描包与XML映射文件的关系 Mapper接口和XML映射文件需要一一对应,Mapper接口的方法名和XML映射文件中的SQL语句需要保持一致。
扫描包与动态代理的关系 MapperScannerConfigurer通过Java的动态代理机制,生成Mapper代理实现。这个代理实现封装了MyBatis的数据库操作,使得调用者可以像调用普通Java对象一样调用数据库操作。
扫描包的性能影响 扫描包会消耗一定的性能,因为需要扫描指定包下的所有接口。如果包下接口数量较多,建议使用更精确的包路径。
扫描包的调试与排查 如果扫描包出现问题,可以检查以下方面:
- 确保Mapper接口和XML映射文件在同一个包下。
- 确保Mapper接口使用了
@Mapper注解。 - 确保XML映射文件配置正确。
扫描包的最佳实践
- 使用精确的包路径,避免扫描不必要的接口。
- 使用
@Mapper注解标记Mapper接口。 - 将Mapper接口和XML映射文件放在同一个包下。
| 配置参数 | 描述 | 示例 |
|---|---|---|
basePackage | 指定需要扫描的包路径,用于查找Mapper接口。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> |
sqlSessionFactoryBeanName | 指定MyBatis的SqlSessionFactory的Bean名称,用于创建Mapper代理。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> |
annotationClass | 指定用于标记Mapper接口的注解类,默认为org.apache.ibatis.annotations.Mapper。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="annotationClass" value="org.apache.ibatis.annotations.Mapper" /> </bean> |
markerInterface | 指定Mapper接口需要实现的接口,默认为org.apache.ibatis.annotations.Mapper。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="markerInterface" value="org.apache.ibatis.annotations.Mapper" /> </bean> |
sqlSessionTemplateBeanName | 指定MyBatis的SqlSessionTemplate的Bean名称,用于创建SqlSession。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate" /> </bean> |
typeAliasesPackage | 指定需要扫描的类型别名包,用于自动生成类型别名。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="typeAliasesPackage" value="com.example.model" /> </bean> |
defaultImplementation | 指定Mapper接口的默认实现类。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="defaultImplementation" value="com.example.mapper.DefaultMapperImpl" /> </bean> |
defaultAnnotationClass | 指定默认的注解类,用于标记Mapper接口。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="defaultAnnotationClass" value="org.apache.ibatis.annotations.Mapper" /> </bean> |
| 扫描包注意事项 | 说明 |
|---|---|
| Mapper接口与XML映射文件 | 确保Mapper接口和对应的XML映射文件在同一个包下。 |
@Mapper注解 | Mapper接口需要使用@Mapper注解进行标记。 |
| XML映射文件配置 | XML映射文件需要配置在相应的路径下。 |
| 性能影响 | 扫描包会消耗一定的性能,因为需要扫描指定包下的所有接口。 |
| 调试与排查 | 如果扫描包出现问题,可以检查Mapper接口、XML映射文件和配置参数。 |
| 最佳实践 | 使用精确的包路径,避免扫描不必要的接口;使用@Mapper注解标记Mapper接口;将Mapper接口和XML映射文件放在同一个包下。 |
在配置MyBatis的MapperScannerConfigurer时,basePackage属性的作用是明确指定需要扫描的包路径,这对于自动化配置Mapper接口至关重要。例如,在Spring Boot项目中,通过设置basePackage为com.example.mapper,Spring框架将自动扫描该路径下的所有接口,并将它们注册为Mapper组件。这种自动配置方式简化了开发流程,但同时也需要注意,过多的扫描可能导致性能下降,因为框架需要检查每个接口。因此,建议只扫描必要的包,以优化性能。
此外,sqlSessionFactoryBeanName属性用于指定MyBatis的SqlSessionFactory的Bean名称,这对于创建Mapper代理至关重要。例如,如果SqlSessionFactory的Bean名称为sqlSessionFactory,则应将此值分配给sqlSessionFactoryBeanName属性。如果不正确配置此属性,可能导致Mapper代理无法正确创建,进而影响数据库操作。
在配置过程中,annotationClass和markerInterface属性通常用于指定用于标记Mapper接口的注解类和接口。默认情况下,这两个属性都设置为org.apache.ibatis.annotations.Mapper。然而,在某些情况下,可能需要自定义这些属性以适应特定的项目需求。
最后,typeAliasesPackage属性允许指定需要扫描的类型别名包,这对于自动生成类型别名非常有用。例如,如果将typeAliasesPackage设置为com.example.model,则Spring框架将自动为该包下的所有类生成类型别名,从而简化了MyBatis的XML映射文件配置。这种自动配置功能可以显著提高开发效率,但同样需要注意,过多的自动配置可能导致代码难以维护。
MyBatis的MapperScannerConfigurer是MyBatis框架中一个重要的配置类,它主要用于扫描指定包下的接口,并自动生成相应的Mapper代理实现。在MyBatis中,映射文件是核心组成部分,它定义了SQL语句与Java对象之间的映射关系。以下将围绕MyBatis核心知识点之MapperScannerConfigurer:映射文件,展开详细描述。
首先,我们需要了解映射文件的基本结构。映射文件通常包含以下元素:
<mapper>:定义一个映射器,包含一个或多个SQL映射语句。<resultMap>:定义结果集与Java对象之间的映射关系。<sql>:定义可重用的SQL片段。<insert>、<update>、<delete>、<select>:定义SQL映射语句。
在MyBatis中,映射文件通常以XML格式编写。以下是一个简单的映射文件示例:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.entity.User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<result property="password" column="password" />
</resultMap>
<select id="selectUserById" resultMap="userResultMap">
SELECT user_id, username, password FROM users WHERE user_id = #{id}
</select>
</mapper>
在上面的示例中,我们定义了一个名为UserMapper的映射器,其中包含一个名为selectUserById的查询操作。该操作通过resultMap将查询结果映射到User对象。
接下来,我们来看一下MyBatis中的动态SQL。动态SQL允许我们在运行时根据条件动态构建SQL语句。以下是一个使用动态SQL的示例:
<select id="selectUsersByCondition" resultMap="userResultMap">
SELECT user_id, username, password
FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="password != null">
AND password = #{password}
</if>
</where>
</select>
在上面的示例中,我们使用<where>标签和<if>标签来动态构建SQL语句。当username或password不为空时,相应的条件会被添加到SQL语句中。
在MyBatis中,我们还可以使用类型处理器来处理Java类型与数据库类型之间的转换。以下是一个类型处理器的示例:
@MappedTypes({User.class})
public class UserTypeHandler implements TypeHandler<User> {
@Override
public void setParameter(PreparedStatement ps, int i, User parameter, JdbcType jdbcType) throws SQLException {
// 将User对象转换为数据库类型
}
@Override
public User getResult(ResultSet rs, String columnName) throws SQLException {
// 将数据库类型转换为User对象
return null;
}
@Override
public User getResult(ResultSet rs, int columnIndex) throws SQLException {
// 将数据库类型转换为User对象
return null;
}
@Override
public void setValue(PreparedStatement ps, User value, int index) throws SQLException {
// 将User对象转换为数据库类型
}
}
在上面的示例中,我们定义了一个名为UserTypeHandler的类型处理器,用于处理User类型与数据库类型之间的转换。
最后,我们将MyBatis与Spring框架集成。在Spring框架中,我们可以通过配置MapperScannerConfigurer来自动扫描指定包下的接口,并生成相应的Mapper代理实现。以下是一个集成Spring的示例:
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new ClassPathResource("mybatis-config.xml"), dataSource);
return sqlSessionFactory;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.mapper");
return mapperScannerConfigurer;
}
}
在上面的示例中,我们定义了一个名为MyBatisConfig的配置类,其中包含sqlSessionFactory和mapperScannerConfigurer两个Bean。sqlSessionFactory用于创建SqlSessionFactory,而mapperScannerConfigurer用于自动扫描指定包下的接口。
通过以上描述,我们可以了解到MyBatis核心知识点之MapperScannerConfigurer:映射文件的相关内容。在实际开发中,我们需要根据项目需求合理配置映射文件,并充分利用MyBatis提供的各种功能,以提高开发效率和代码质量。
| MyBatis核心知识点 | 描述 |
|---|---|
| MapperScannerConfigurer | MyBatis框架中的一个重要配置类,用于扫描指定包下的接口,并自动生成相应的Mapper代理实现。 |
| 映射文件 | MyBatis的核心组成部分,定义了SQL语句与Java对象之间的映射关系。 |
| 映射文件元素 | - <mapper>:定义一个映射器,包含一个或多个SQL映射语句。 <br> - <resultMap>:定义结果集与Java对象之间的映射关系。 <br> - <sql>:定义可重用的SQL片段。 <br> - <insert>、<update>、<delete>、<select>:定义SQL映射语句。 |
| 映射文件示例 | 以下是一个简单的映射文件示例: <br> xml <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="com.example.entity.User"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="password" column="password" /> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT user_id, username, password FROM users WHERE user_id = #{id} </select> </mapper> |
| 动态SQL | 允许在运行时根据条件动态构建SQL语句。以下是一个使用动态SQL的示例: <br> xml <select id="selectUsersByCondition" resultMap="userResultMap"> SELECT user_id, username, password FROM users <where> <if test="username != null"> AND username = #{username} </if> <if test="password != null"> AND password = #{password} </if> </where> </select> |
| 类型处理器 | 用于处理Java类型与数据库类型之间的转换。以下是一个类型处理器的示例: <br> java @MappedTypes({User.class}) public class UserTypeHandler implements TypeHandler<User> { @Override public void setParameter(PreparedStatement ps, int i, User parameter, JdbcType jdbcType) throws SQLException { // 将User对象转换为数据库类型 } @Override public User getResult(ResultSet rs, String columnName) throws SQLException { // 将数据库类型转换为User对象 return null; } @Override public User getResult(ResultSet rs, int columnIndex) throws SQLException { // 将数据库类型转换为User对象 return null; } @Override public void setValue(PreparedStatement ps, User value, int index) throws SQLException { // 将User对象转换为数据库类型 } } |
| MyBatis与Spring集成 | 在Spring框架中,通过配置MapperScannerConfigurer来自动扫描指定包下的接口,并生成相应的Mapper代理实现。以下是一个集成Spring的示例: <br> java @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws IOException { SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new ClassPathResource("mybatis-config.xml"), dataSource); return sqlSessionFactory; } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("com.example.mapper"); return mapperScannerConfigurer; } } |
MyBatis框架的强大之处在于其灵活性和可扩展性。通过
MapperScannerConfigurer,开发者可以轻松地将接口映射到具体的SQL操作,极大地简化了数据库操作的开发过程。映射文件作为MyBatis的核心,不仅定义了SQL语句与Java对象之间的映射关系,还提供了丰富的元素来处理复杂的业务逻辑。动态SQL的引入,使得根据不同条件动态构建SQL语句成为可能,极大地增强了SQL语句的灵活性。类型处理器则解决了Java类型与数据库类型之间的转换问题,使得数据类型转换更加便捷。而MyBatis与Spring的集成,则进一步提升了其易用性和可维护性,使得开发者可以更加专注于业务逻辑的实现。
MyBatis的MapperScannerConfigurer是一个重要的配置类,它负责扫描指定路径下的接口,并将它们注册为MyBatis的映射器。下面将详细阐述与MapperScannerConfigurer相关的接口实现、配置以及MyBatis的运行原理。
首先,我们需要了解接口实现。在MyBatis中,接口实现类是映射器接口的具体实现,它负责执行SQL语句。接口实现类通常通过动态代理的方式生成,MyBatis会根据接口方法生成相应的SQL语句。
// 接口定义
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") int id);
}
// 接口实现类生成
public class UserMapperImpl implements UserMapper {
private SqlSession sqlSession;
public UserMapperImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public User getUserById(int id) {
return sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", id);
}
}
接下来,我们来看MyBatis配置。在MyBatis配置文件中,我们需要配置MapperScannerConfigurer的扫描路径,以及映射器接口的类路径。
<configuration>
<mapperScannerConfigurer>
<basePackage>com.example.mapper</basePackage>
</mapperScannerConfigurer>
</configuration>
在上面的配置中,<basePackage>标签指定了扫描的包路径,MyBatis会扫描该路径下的接口,并将它们注册为映射器。
在MyBatis运行过程中,MapperScannerConfigurer会扫描指定路径下的接口,并为每个接口生成一个映射器实现类。这个过程涉及到动态代理和MyBatis注解。
// MyBatis注解
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") int id);
}
// 动态代理生成映射器实现类
public class UserMapperProxy implements UserMapper {
private Object target;
public UserMapperProxy(Object target) {
this.target = target;
}
@Override
public User getUserById(int id) {
// 执行SQL语句
}
}
MyBatis缓存机制是提高性能的关键。MyBatis提供了两种缓存机制:一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
在上面的配置中,<settings>标签中的<setting>子标签用于配置缓存机制。
MyBatis事务管理是保证数据一致性的关键。MyBatis支持声明式事务管理和编程式事务管理。在Spring集成MyBatis时,可以使用Spring事务管理器配置事务。
// Spring事务管理器配置
public class TransactionManagerConfig {
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource());
return transactionManager;
}
}
最后,我们来看MyBatis配置优化和性能调优。在MyBatis配置文件中,我们可以通过配置一些参数来优化性能。
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="true"/>
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
</configuration>
在上面的配置中,<settings>标签中的<setting>子标签用于配置日志实现、缓存机制和执行器类型。
通过以上内容,我们可以了解到MyBatis核心知识点之MapperScannerConfigurer的接口实现、配置以及MyBatis的运行原理。在实际开发中,熟练掌握这些知识点对于提高开发效率和项目性能具有重要意义。
| 核心知识点 | 描述 |
|---|---|
| 接口实现 | MyBatis中的接口实现类负责执行SQL语句,通常通过动态代理的方式生成。接口实现类与映射器接口相对应,根据接口方法生成相应的SQL语句。 |
| 动态代理 | MyBatis使用动态代理技术生成接口实现类,这种方式可以在不修改原有接口代码的情况下,动态地添加新的方法或修改已有方法的行为。 |
| MyBatis配置 | MyBatis配置文件中,通过<mapperScannerConfigurer>标签配置扫描路径和映射器接口的类路径,MyBatis会扫描指定路径下的接口,并将它们注册为映射器。 |
| MapperScannerConfigurer | MapperScannerConfigurer是一个重要的配置类,负责扫描指定路径下的接口,并将它们注册为MyBatis的映射器。 |
| MyBatis注解 | MyBatis使用注解来定义SQL语句,如@Select、@Param等,这些注解可以简化SQL语句的编写和配置。 |
| 动态代理生成映射器实现类 | MyBatis通过动态代理生成映射器实现类,该类实现了映射器接口,并提供了执行SQL语句的方法。 |
| 缓存机制 | MyBatis提供了两种缓存机制:一级缓存和二级缓存,用于提高查询性能。 |
| 一级缓存 | 一级缓存是SqlSession级别的缓存,用于缓存SqlSession范围内的查询结果。 |
| 二级缓存 | 二级缓存是Mapper级别的缓存,用于缓存Mapper范围内的查询结果。 |
| 事务管理 | MyBatis支持声明式事务管理和编程式事务管理,可以与Spring集成使用Spring事务管理器配置事务。 |
| Spring集成 | MyBatis可以与Spring集成,使用Spring事务管理器配置事务,简化事务管理。 |
| 配置优化和性能调优 | 通过配置MyBatis的参数,如日志实现、缓存机制和执行器类型,可以优化MyBatis的性能。 |
MyBatis的动态代理技术不仅提高了代码的灵活性和可维护性,还使得开发者能够专注于业务逻辑的实现,而无需过多关注SQL语句的编写。通过动态代理,MyBatis能够根据接口方法自动生成相应的SQL语句,从而简化了数据库操作的过程。此外,动态代理还允许开发者在不修改原有接口代码的情况下,动态地添加新的方法或修改已有方法的行为,这种设计理念体现了MyBatis在软件设计上的先进性和前瞻性。
// MyBatis的MapperScannerConfigurer配置示例
public class MapperScannerConfigurerExample {
// 配置Mapper接口扫描路径
public void configureMapperScannerConfigurer() {
// 创建MapperScannerConfigurer实例
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// 设置Mapper接口的扫描包路径
mapperScannerConfigurer.setBasePackage("com.example.mapper");
// 设置SQLSessionFactoryBean
mapperScannerConfigurer.setSqlSessionFactory(sqlSessionFactory);
// 执行扫描配置
mapperScannerConfigurer.afterPropertiesSet();
}
}
<!-- MyBatis配置文件中配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 设置Mapper接口的扫描包路径 -->
<property name="basePackage" value="com.example.mapper" />
<!-- 设置SQLSessionFactoryBean -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
// Mapper接口生成示例
public interface UserMapper {
// 定义方法,例如查询用户信息
User getUserById(Integer id);
}
// 动态代理示例
public class UserMapperProxy implements InvocationHandler {
private Object target;
public UserMapperProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在这里可以添加方法执行前的逻辑
Object result = method.invoke(target, args);
// 在这里可以添加方法执行后的逻辑
return result;
}
}
// Spring集成示例
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
return sqlSessionFactoryBean.getObject();
}
@Bean
public DataSource dataSource() {
// 配置数据源
return new DataSourceBuilder().build();
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.mapper");
mapperScannerConfigurer.setSqlSessionFactory(sqlSessionFactory());
return mapperScannerConfigurer;
}
}
以上代码和配置文件展示了MyBatis中MapperScannerConfigurer的核心知识点,包括示例代码、配置文件、包路径配置、扫描器配置、Mapper接口生成、动态代理和Spring集成。通过这些示例,可以更好地理解MyBatis的配置和使用方法。
| 配置组件 | 功能描述 | 示例代码/配置文件 |
|---|---|---|
| MapperScannerConfigurer | 用于扫描指定包路径下的Mapper接口,并自动生成相应的Mapper代理对象。 | java<br>public class MapperScannerConfigurerExample {<br> // 配置Mapper接口扫描路径<br> public void configureMapperScannerConfigurer() {<br> MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();<br> mapperScannerConfigurer.setBasePackage("com.example.mapper");<br> mapperScannerConfigurer.setSqlSessionFactory(sqlSessionFactory);<br> mapperScannerConfigurer.afterPropertiesSet();<br> }<br>}<br> |
| basePackage | 指定Mapper接口所在的包路径。 | xml<br><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><br> <property name="basePackage" value="com.example.mapper" /><br></bean><br> |
| SqlSessionFactory | MyBatis的核心对象,用于创建SqlSession。 | java<br>public class MyBatisConfig {<br> @Bean<br> public SqlSessionFactory sqlSessionFactory() throws IOException {<br> SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();<br> sqlSessionFactoryBean.setDataSource(dataSource());<br> return sqlSessionFactoryBean.getObject();<br> }<br>}<br> |
| Mapper接口 | 定义数据库操作的方法。 | java<br>public interface UserMapper {<br> User getUserById(Integer id);<br>}<br> |
| 动态代理 | MyBatis使用动态代理技术生成Mapper代理对象。 | java<br>public class UserMapperProxy implements InvocationHandler {<br> private Object target;<br><br> public UserMapperProxy(Object target) {<br> this.target = target;<br> }<br><br> @Override<br> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br> // 在这里可以添加方法执行前的逻辑<br> Object result = method.invoke(target, args);<br> // 在这里可以添加方法执行后的逻辑<br> return result;<br> }<br>}<br> |
| Spring集成 | 将MyBatis集成到Spring框架中。 | java<br>@Configuration<br>public class MyBatisConfig {<br> @Bean<br> public SqlSessionFactory sqlSessionFactory() throws IOException {<br> // ...<br> }<br><br> @Bean<br> public MapperScannerConfigurer mapperScannerConfigurer() {<br> MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();<br> mapperScannerConfigurer.setBasePackage("com.example.mapper");<br> mapperScannerConfigurer.setSqlSessionFactory(sqlSessionFactory());<br> return mapperScannerConfigurer;<br> }<br>}<br> |
MapperScannerConfigurer组件在MyBatis框架中扮演着至关重要的角色,它不仅简化了Mapper接口的配置过程,还提高了代码的可维护性。通过指定basePackage属性,开发者可以轻松地将所有Mapper接口纳入MyBatis的管理范围,无需手动创建每个Mapper的代理对象。这种自动化配置大大减少了开发者的工作量,使得项目结构更加清晰。在实际应用中,SqlSessionFactory作为MyBatis的核心对象,负责创建SqlSession,它是执行数据库操作的关键。通过将SqlSessionFactory与MapperScannerConfigurer结合使用,可以实现MyBatis与Spring框架的无缝集成,从而在Spring项目中充分利用MyBatis的优势。
🍊 MyBatis核心知识点之MapperScannerConfigurer:注意事项
在大型Java项目中,MyBatis作为持久层框架,其性能和稳定性至关重要。然而,在实际应用中,由于对MyBatis配置不当,常常会导致性能瓶颈或运行时错误。其中,MapperScannerConfigurer作为MyBatis的配置类,负责扫描指定包下的接口生成对应的Mapper代理实现,其配置的正确性直接影响到MyBatis的性能和稳定性。因此,深入了解并正确配置MapperScannerConfigurer显得尤为重要。
首先,我们需要明确MapperScannerConfigurer的命名空间配置。在MyBatis中,命名空间是组织映射文件和Mapper接口的命名空间,它必须与Mapper接口的全限定名相匹配。如果命名空间配置错误,MyBatis将无法正确找到对应的Mapper接口,导致无法执行数据库操作。
其次,接口方法配置是MapperScannerConfigurer的核心。接口方法需要与映射文件中的SQL语句相对应,确保方法名与SQL语句的ID一致。此外,接口方法的参数类型和返回类型也需要与映射文件中的参数和结果类型保持一致,否则会导致类型不匹配错误。
再者,映射文件路径的配置也是至关重要的。映射文件是MyBatis的核心配置文件,它包含了SQL语句和结果映射等配置信息。正确的映射文件路径确保MyBatis能够正确加载映射文件,否则会导致无法执行SQL语句。
最后,异常处理是保证MyBatis稳定运行的关键。在实际应用中,数据库操作可能会遇到各种异常情况,如连接异常、SQL语法错误等。合理的异常处理机制能够帮助开发人员快速定位问题,并采取相应的措施,避免系统崩溃。
综上所述,本文将详细介绍MyBatis核心知识点之MapperScannerConfigurer的注意事项,包括命名空间、接口方法、映射文件路径和异常处理等方面。通过深入剖析这些知识点,帮助读者更好地理解并正确配置MapperScannerConfigurer,从而提高MyBatis的性能和稳定性。接下来,我们将依次介绍这些方面的具体内容,以帮助读者建立整体认知。
// MapperScannerConfigurer配置原理
MapperScannerConfigurer是MyBatis提供的一个配置类,用于批量扫描指定包下的接口,并自动生成对应的Mapper代理实现。其配置原理主要涉及以下几个步骤:
1. 通过setBasePackage方法设置需要扫描的包路径。
2. 通过setSqlSessionFactoryBeanName方法指定SqlSessionFactory的Bean名称。
3. 通过setMapperInterfaceClass方法指定Mapper接口的泛型类型。
4. 通过setAnnotationClass方法指定需要扫描的注解类型,默认为@Mapper。
// 命名空间在MyBatis中的作用
命名空间在MyBatis中扮演着至关重要的角色,其主要作用如下:
1. 唯一标识:命名空间用于唯一标识一个Mapper接口,确保在同一个MyBatis配置文件中不会出现重复的命名空间。
2. 资源定位:MyBatis通过命名空间来定位对应的Mapper接口,从而找到对应的XML映射文件。
// Mapper接口与命名空间的关系
Mapper接口与命名空间的关系是:命名空间必须与Mapper接口的全限定名完全一致。例如,如果Mapper接口的全限定名为com.example.mapper.UserMapper,则其命名空间也必须是com.example.mapper。
// 命名空间在动态SQL中的应用
在动态SQL中,命名空间用于指定要执行的SQL映射文件。例如,在MyBatis的XML映射文件中,可以使用以下方式指定动态SQL:
```xml
<select id="selectUsers" resultMap="userMap">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
在上面的示例中,命名空间为com.example.mapper.UserMapper,表示要执行com.example.mapper包下的UserMapper接口对应的SQL映射文件。
// 命名空间与MyBatis注解的关系 在MyBatis注解中,命名空间用于指定注解所对应的Mapper接口。例如,在以下示例中,@Select注解的value属性指定了命名空间和SQL语句:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") int id);
}
在上面的示例中,命名空间为com.example.mapper.UserMapper,表示@Select注解所对应的Mapper接口为com.example.mapper.UserMapper。
// 命名空间在MyBatis缓存中的应用 在MyBatis缓存中,命名空间用于区分不同的缓存区域。例如,在以下示例中,为UserMapper接口设置了不同的缓存区域:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
在上面的示例中,命名空间为com.example.mapper.UserMapper,表示该缓存区域应用于com.example.mapper包下的UserMapper接口。
// 命名空间在MyBatis插件开发中的应用 在MyBatis插件开发中,命名空间用于标识插件所对应的Mapper接口。例如,在以下示例中,为UserMapper接口添加了一个插件:
@Intercepts({
@Signature(type = UserMapper.class, method = "getUserById", args = {int.class}),
@Signature(type = UserMapper.class, method = "insertUser", args = {User.class})
})
public class UserMapperPlugin implements Interceptor {
// 插件逻辑
}
在上面的示例中,命名空间为com.example.mapper.UserMapper,表示该插件应用于com.example.mapper包下的UserMapper接口。
// 命名空间在MyBatis与Spring集成中的应用 在MyBatis与Spring集成中,命名空间用于将MyBatis的Mapper接口与Spring的Bean进行绑定。例如,在以下示例中,将UserMapper接口与Spring的Bean进行绑定:
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
return sqlSessionFactory;
}
@Bean
@MapperScan("com.example.mapper")
public MapperScannerConfigurer mapperScannerConfigurer() {
return new MapperScannerConfigurer();
}
}
在上面的示例中,@MapperScan注解的value属性指定了需要扫描的包路径,即com.example.mapper,表示将com.example.mapper包下的Mapper接口与Spring的Bean进行绑定。
// 命名空间的最佳实践与注意事项
- 命名空间应与Mapper接口的全限定名保持一致。
- 命名空间应具有唯一性,避免重复。
- 命名空间应遵循包的命名规范,便于管理和维护。
- 在动态SQL中,命名空间用于指定要执行的SQL映射文件。
- 在MyBatis缓存、插件开发、与Spring集成等场景中,命名空间用于标识对应的Mapper接口。
- 注意命名空间的大小写,MyBatis对命名空间的大小写敏感。
| MyBatis 配置与命名空间相关功能 | 配置步骤 | 作用 | 示例 |
| ------------------------------ | -------- | ---- | ---- |
| MapperScannerConfigurer 配置 | 1. 设置扫描包路径 2. 指定SqlSessionFactory的Bean名称 3. 指定Mapper接口的泛型类型 4. 指定需要扫描的注解类型 | 批量扫描指定包下的接口,并自动生成对应的Mapper代理实现 | 通过setBasePackage方法设置需要扫描的包路径 |
| 命名空间在MyBatis中的作用 | 唯一标识Mapper接口,资源定位 | 确保唯一性,通过命名空间定位对应的Mapper接口和XML映射文件 | 命名空间必须与Mapper接口的全限定名完全一致 |
| Mapper接口与命名空间的关系 | 命名空间与Mapper接口全限定名一致 | 确保唯一性和正确映射 | 例如,com.example.mapper.UserMapper对应命名空间com.example.mapper |
| 命名空间在动态SQL中的应用 | 指定要执行的SQL映射文件 | 执行对应的SQL映射文件 | 使用命名空间指定动态SQL映射文件 |
| 命名空间与MyBatis注解的关系 | 指定注解所对应的Mapper接口 | 确定注解对应的接口 | @Select注解的value属性指定命名空间和SQL语句 |
| 命名空间在MyBatis缓存中的应用 | 区分不同的缓存区域 | 为不同接口设置不同缓存区域 | 为UserMapper接口设置不同的缓存区域 |
| 命名空间在MyBatis插件开发中的应用 | 标识插件所对应的Mapper接口 | 为特定接口添加插件 | 为UserMapper接口添加插件 |
| 命名空间在MyBatis与Spring集成中的应用 | 将MyBatis的Mapper接口与Spring的Bean进行绑定 | 实现接口与Bean的绑定 | 使用@MapperScan注解绑定接口与Bean |
| 命名空间的最佳实践与注意事项 | 保持一致、唯一性、遵循规范、动态SQL、标识接口、大小写敏感 | 提高配置效率和系统稳定性 | 注意命名空间大小写,遵循包命名规范 |
> 在实际应用中,MapperScannerConfigurer的配置步骤不仅简化了Mapper接口的扫描过程,还提高了开发效率。通过指定SqlSessionFactory的Bean名称,可以确保在Spring容器中正确地获取到MyBatis的SqlSessionFactory实例。此外,指定Mapper接口的泛型类型和注解类型,使得MyBatis能够自动识别并生成对应的Mapper代理实现,从而避免了手动编写Mapper接口的实现代码。这种配置方式在大型项目中尤为重要,因为它可以显著减少代码量,降低出错概率。
MyBatis的MapperScannerConfigurer是一个重要的配置类,它负责扫描指定路径下的映射器接口,并将它们注册到MyBatis的SqlSessionFactory中。下面将详细阐述MapperScannerConfigurer的接口方法及其在MyBatis中的应用。
首先,我们来看MapperScannerConfigurer的核心接口方法:
```java
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
// ... 其他方法 ...
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setMapperInterfaceClass(Class<?> mapperInterfaceClass) {
this.mapperInterfaceClass = mapperInterfaceClass;
}
public void setAnnotationClass(Class<? extends Annotation> annotationClass) {
this.annotationClass = annotationClass;
}
public void setMarkerInterface(Class<?> markerInterface) {
this.markerInterface = markerInterface;
}
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public void setSqlSessionFactoryBuilder(SqlSessionFactoryBuilder sqlSessionFactoryBuilder) {
this.sqlSessionFactoryBuilder = sqlSessionFactoryBuilder;
}
public void setSqlSessionFactorySqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactoryBuilder = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionTemplate = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
| 方法名称 | 功能描述 | 参数说明 | 返回值 |
| --- | --- | --- | --- |
| setBasePackage | 设置扫描的基包路径 | basePackage:基包路径字符串 | 无 |
| setSqlSessionFactory | 设置SqlSessionFactory | sqlSessionFactory:SqlSessionFactory对象 | 无 |
| setMapperInterfaceClass | 设置映射器接口类 | mapperInterfaceClass:映射器接口类 | 无 |
| setAnnotationClass | 设置注解类 | annotationClass:注解类 | 无 |
| setMarkerInterface | 设置标记接口 | markerInterface:标记接口 | 无 |
| setSqlSessionTemplate | 设置SqlSessionTemplate | sqlSessionTemplate:SqlSessionTemplate对象 | 无 |
| setSqlSessionFactoryBuilder | 设置SqlSessionFactoryBuilder | sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionTemplate和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionTemplate:SqlSessionTemplate对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder | 设置SqlSessionFactory和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder和SqlSessionFactoryBuilder | sqlSessionFactory:SqlSessionFactory对象,sqlSessionFactoryBuilder:SqlSessionFactoryBuilder对象 | 无 |
| setSqlSessionTemplateSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilderSqlSessionFactoryBuilder
> 这些方法主要用于配置MyBatis框架,确保其能够正确地与数据库交互。例如,`setBasePackage`方法允许开发者指定基包路径,从而让MyBatis能够扫描到相应的Mapper接口。`setSqlSessionFactory`和`setSqlSessionTemplate`则分别用于设置SqlSessionFactory和SqlSessionTemplate,这两个对象是MyBatis与数据库交互的核心。通过`setMapperInterfaceClass`,可以指定映射器接口类,而`setAnnotationClass`和`setMarkerInterface`则用于配置注解类和标记接口,这些配置对于MyBatis的动态代理机制至关重要。此外,`setSqlSessionFactoryBuilder`和`setSqlSessionFactorySqlSessionFactoryBuilder`等方法则用于设置SqlSessionFactoryBuilder,它是创建SqlSessionFactory的关键。这些方法的合理配置,能够确保MyBatis框架的稳定运行和高效性能。
MyBatis的MapperScannerConfigurer是一个重要的配置类,它负责扫描指定包路径下的接口,并自动生成对应的Mapper代理实现。在MyBatis中,映射文件路径的配置是至关重要的,它决定了MyBatis如何找到并加载相应的XML映射文件。
首先,我们需要了解MyBatis配置文件中的`<mapper>`标签。这个标签用于指定XML映射文件的路径。在MyBatis配置文件中,通常会有如下配置:
```xml
<mapper resource="com/example/mapper/UserMapper.xml"/>
这里的resource属性指定了映射文件的路径。路径可以是相对于类路径的资源,也可以是绝对路径。
接下来,我们来看MapperScannerConfigurer如何与映射文件路径相关联。MapperScannerConfigurer通过扫描指定包路径下的接口,自动生成对应的Mapper代理实现。在这个过程中,它会根据接口的名称和包路径来推断XML映射文件的路径。
例如,假设我们有一个UserMapper接口,位于com.example.mapper包下,对应的XML映射文件名为UserMapper.xml,位于与接口相同的包路径下。在这种情况下,MapperScannerConfigurer会自动将UserMapper接口与UserMapper.xml映射文件关联起来。
为了实现这一功能,MapperScannerConfigurer使用了以下规则来确定映射文件的位置:
- 扫描包路径:MapperScannerConfigurer会扫描指定的包路径,查找所有接口。
- 映射文件命名规则:默认情况下,MyBatis会根据接口的名称来推断XML映射文件的名称。例如,如果接口名为UserMapper,那么映射文件名为UserMapper.xml。
- 映射文件位置:默认情况下,MyBatis会假设XML映射文件位于与接口相同的包路径下。例如,如果接口位于
com.example.mapper包下,那么映射文件位于com/example/mapper/UserMapper.xml。
在实际应用中,我们可能需要根据项目需求调整映射文件的位置。这时,我们可以通过配置MapperScannerConfigurer的basePackage属性来指定扫描包路径,并通过sqlSessionFactoryBeanName属性来指定MyBatis的SqlSessionFactory bean名称。
以下是一个示例配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
在这个配置中,MapperScannerConfigurer会扫描com.example.mapper包路径下的所有接口,并将它们与对应的XML映射文件关联起来。
总结来说,MyBatis的MapperScannerConfigurer在映射文件路径的配置方面起到了关键作用。通过合理配置,我们可以确保MyBatis能够正确地加载和解析XML映射文件,从而实现高效的数据库操作。
| 配置元素 | 描述 | 示例配置 | |
|---|---|---|---|
<mapper>标签 | 用于指定XML映射文件的路径,是MyBatis配置文件中用于映射数据库操作的核心元素。 | <mapper resource="com/example/mapper/UserMapper.xml"/> | |
resource属性 | 指定映射文件的路径,可以是相对于类路径的资源或绝对路径。 | resource="com/example/mapper/UserMapper.xml" | |
| MapperScannerConfigurer | 一个重要的配置类,负责扫描指定包路径下的接口,并自动生成对应的Mapper代理实现。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> | |
basePackage属性 | 指定扫描的包路径,MapperScannerConfigurer会扫描这个路径下的所有接口。 | <property name="basePackage" value="com.example.mapper"/> | |
sqlSessionFactoryBeanName属性 | 指定MyBatis的SqlSessionFactory bean名称,用于创建SqlSession。 | <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> | |
| 扫描规则 | MapperScannerConfigurer如何确定映射文件的位置。 | 1. 扫描包路径:查找所有接口。 2. 映射文件命名规则:根据接口名称推断文件名。 3. 映射文件位置:默认位于与接口相同的包路径下。 | - 扫描包路径:MapperScannerConfigurer会扫描指定的包路径。 - 映射文件命名规则:例如,接口名为UserMapper,映射文件名为UserMapper.xml。 - 映射文件位置:例如,接口位于com.example.mapper包下,映射文件位于com/example/mapper/UserMapper.xml。 |
在实际应用中,
<mapper>标签的配置不仅限于XML映射文件的路径指定,它还涉及到MyBatis框架与数据库操作之间的桥梁搭建。通过合理配置resource属性,可以确保映射文件能够正确加载,进而实现数据库操作的映射。例如,在开发过程中,我们可能会遇到需要动态调整映射文件路径的情况,这时,通过配置resource属性为相对路径或绝对路径,可以灵活应对各种环境变化。
MapperScannerConfigurer作为MyBatis的一个强大工具,其
basePackage属性的作用至关重要。它定义了Mapper接口所在的包路径,MapperScannerConfigurer会自动扫描这个路径下的所有接口,并生成相应的Mapper代理实现。这种自动化的配置方式大大简化了开发流程,提高了开发效率。例如,在大型项目中,可能存在多个模块,每个模块都有自己的Mapper接口,通过配置basePackage,可以轻松地将所有模块的Mapper接口纳入MyBatis管理。
在使用MapperScannerConfigurer时,
sqlSessionFactoryBeanName属性也非常关键。它用于指定MyBatis的SqlSessionFactory bean名称,这是创建SqlSession的基础。通过正确配置该属性,可以确保Mapper接口能够正确地与数据库进行交互。例如,在配置文件中,我们可以将SqlSessionFactory的bean名称设置为sqlSessionFactory,然后在Mapper接口中使用@Select、@Insert等注解时,MyBatis会自动查找并使用这个SqlSessionFactory。
MapperScannerConfigurer的扫描规则是自动生成Mapper代理实现的关键。它遵循以下规则:首先,扫描指定的包路径;其次,根据接口名称推断映射文件名;最后,映射文件的位置默认位于与接口相同的包路径下。这种规则简化了映射文件的配置,使得开发人员可以更加专注于业务逻辑的实现。例如,如果一个接口名为
UserMapper,那么对应的映射文件名应该是UserMapper.xml,并且它应该位于与UserMapper接口相同的包路径下。
MyBatis的MapperScannerConfigurer是用于自动扫描指定包下的Mapper接口,并动态注册为Bean的一种配置方式。在MyBatis的使用过程中,异常处理是保证系统稳定性和健壮性的关键环节。以下将围绕MyBatis核心知识点之MapperScannerConfigurer:异常处理,展开详细描述。
首先,我们需要了解MyBatis中常见的异常类型。在MyBatis中,异常主要分为两大类:运行时异常和检查型异常。运行时异常通常是由于程序错误导致的,如数据库连接异常、SQL执行异常等;检查型异常则是由于外部条件不满足导致的,如参数异常、资源释放异常等。
在MapperScannerConfigurer中,异常处理主要体现在以下几个方面:
- 异常捕获机制:在MapperScannerConfigurer的配置中,可以通过try-catch语句捕获异常。例如:
try {
// 扫描Mapper接口
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.mapper");
mapperScannerConfigurer.afterPropertiesSet();
} catch (Exception e) {
// 异常处理逻辑
e.printStackTrace();
}
-
异常类型识别:在捕获异常后,需要根据异常类型进行相应的处理。例如,对于数据库连接异常,可以尝试重新连接数据库;对于SQL执行异常,可以记录错误日志并返回错误信息。
-
错误日志记录:在异常处理过程中,记录错误日志是非常重要的。可以通过日志框架(如Log4j、SLF4J等)记录异常信息。以下是一个使用Log4j记录异常的示例:
import org.apache.log4j.Logger;
public class MyBatisExceptionLogger {
private static final Logger logger = Logger.getLogger(MyBatisExceptionLogger.class);
public static void logException(Exception e) {
logger.error("MyBatis异常信息:", e);
}
}
-
异常处理策略:在处理异常时,可以根据实际情况制定相应的策略。例如,对于性能优化,可以记录异常发生的时间、频率等信息,以便后续分析;对于最佳实践,可以总结异常处理的经验,避免类似问题再次发生。
-
自定义异常处理:在MyBatis中,可以自定义异常类,以便更好地处理特定类型的异常。以下是一个自定义异常类的示例:
public class MyBatisCustomException extends RuntimeException {
public MyBatisCustomException(String message) {
super(message);
}
}
- 全局异常处理器:在Spring框架中,可以使用@ControllerAdvice注解定义全局异常处理器,以便统一处理整个应用程序中的异常。以下是一个全局异常处理器的示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 异常处理逻辑
return new ResponseEntity<>("发生异常:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
-
事务管理异常:在MyBatis中,事务管理异常通常是由于数据库操作失败导致的。可以通过Spring框架的事务管理功能来处理事务管理异常。
-
数据库连接异常:数据库连接异常可能是由于数据库服务不可用、连接参数错误等原因导致的。在处理数据库连接异常时,可以尝试重新连接数据库,或者记录错误日志。
-
SQL执行异常:SQL执行异常可能是由于SQL语句错误、数据类型不匹配等原因导致的。在处理SQL执行异常时,可以记录错误日志,并返回错误信息。
-
资源释放异常:在资源释放过程中,可能会出现资源释放异常。在处理资源释放异常时,可以尝试释放已占用的资源,并记录错误日志。
总之,在MyBatis中使用MapperScannerConfigurer时,异常处理是保证系统稳定性和健壮性的关键环节。通过了解常见的异常类型、异常捕获机制、异常类型识别、错误日志记录、异常处理策略、自定义异常处理、全局异常处理器、事务管理异常、数据库连接异常、SQL执行异常、资源释放异常以及性能优化等方面的知识,可以更好地应对MyBatis中的异常情况。
| 异常处理方面 | 描述 | 示例 |
|---|---|---|
| 异常捕获机制 | 通过try-catch语句捕获异常,防止程序因未处理的异常而崩溃。 | java<br>try {<br> // 扫描Mapper接口<br> MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();<br> mapperScannerConfigurer.setBasePackage("com.example.mapper");<br> mapperScannerConfigurer.afterPropertiesSet();<br>} catch (Exception e) {<br> // 异常处理逻辑<br> e.printStackTrace();<br>}<br> |
| 异常类型识别 | 根据异常类型进行相应的处理,如数据库连接异常、SQL执行异常等。 | 对于数据库连接异常,尝试重新连接数据库;对于SQL执行异常,记录错误日志并返回错误信息。 |
| 错误日志记录 | 使用日志框架记录异常信息,便于问题追踪和调试。 | 使用Log4j记录异常信息:java<br>import org.apache.log4j.Logger;<br><br>public class MyBatisExceptionLogger {<br> private static final Logger logger = Logger.getLogger(MyBatisExceptionLogger.class);<br><br> public static void logException(Exception e) {<br> logger.error("MyBatis异常信息:", e);<br> }<br>}<br> |
| 异常处理策略 | 根据实际情况制定异常处理策略,如性能优化、最佳实践总结等。 | 记录异常发生的时间、频率等信息,以便后续分析;总结异常处理的经验,避免类似问题再次发生。 |
| 自定义异常处理 | 自定义异常类,以便更好地处理特定类型的异常。 | 自定义异常类:java<br>public class MyBatisCustomException extends RuntimeException {<br> public MyBatisCustomException(String message) {<br> super(message);<br> }<br>}<br> |
| 全局异常处理器 | 使用@ControllerAdvice注解定义全局异常处理器,统一处理整个应用程序中的异常。 | 全局异常处理器:java<br>@ControllerAdvice<br>public class GlobalExceptionHandler {<br> @ExceptionHandler(Exception.class)<br> public ResponseEntity<String> handleException(Exception e) {<br> // 异常处理逻辑<br> return new ResponseEntity<>("发生异常:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);<br> }<br>}<br> |
| 事务管理异常 | 通过Spring框架的事务管理功能处理事务管理异常。 | 使用Spring框架的事务管理功能来处理事务管理异常。 |
| 数据库连接异常 | 处理数据库连接异常,如尝试重新连接数据库或记录错误日志。 | 尝试重新连接数据库,或记录错误日志。 |
| SQL执行异常 | 处理SQL执行异常,如记录错误日志并返回错误信息。 | 记录错误日志,并返回错误信息。 |
| 资源释放异常 | 处理资源释放异常,如尝试释放已占用的资源并记录错误日志。 | 尝试释放已占用的资源,并记录错误日志。 |
在异常处理方面,除了上述提到的捕获机制、类型识别、日志记录、处理策略、自定义异常、全局异常处理器、事务管理异常、数据库连接异常、SQL执行异常以及资源释放异常之外,还有以下拓展内容:
在实际开发中,异常处理不仅仅是技术问题,更是一种对用户负责的态度。例如,当用户在操作过程中遇到异常时,系统应当给出友好的错误提示,而不是让用户面对一串难以理解的错误代码。这种人性化的设计,能够提升用户体验,增强用户对产品的信任感。此外,对于一些可能对系统稳定性造成影响的异常,如内存溢出、线程池耗尽等,需要采取更为严格的监控和预防措施,确保系统的稳定运行。
🍊 MyBatis核心知识点之MapperScannerConfigurer:与Spring集成
在当前的企业级应用开发中,MyBatis 作为一款优秀的持久层框架,以其灵活的映射方式和高性能著称。然而,在将 MyBatis 与 Spring 框架集成时,如何高效地管理 Mapper 接口与对应的 XML 映射文件,成为了开发者面临的一大挑战。为了解决这一问题,MyBatis 提供了 MapperScannerConfigurer,它能够自动扫描指定包下的 Mapper 接口,并动态注册到 Spring 容器中,从而简化了 MyBatis 与 Spring 的集成过程。
在传统的 MyBatis 与 Spring 集成方式中,开发者需要手动配置每个 Mapper 接口对应的 XML 映射文件,并注册到 Spring 容器中。这不仅增加了配置的复杂性,而且容易出错。而 MapperScannerConfigurer 的出现,极大地简化了这一过程。它通过扫描指定包下的接口,自动生成对应的 Mapper Bean,并注册到 Spring 容器中,使得开发者无需手动配置,即可实现 MyBatis 与 Spring 的无缝集成。
接下来,我们将详细介绍 MapperScannerConfigurer 的三个核心知识点:Spring 配置、依赖注入以及示例集成。
首先,Spring 配置是使用 MapperScannerConfigurer 的基础。在 Spring 配置文件中,需要声明一个 MapperScannerConfigurer 的 Bean,并设置其扫描的包路径。这样,当 Spring 容器启动时,MapperScannerConfigurer 会自动扫描指定包下的接口,并生成对应的 Mapper Bean。
其次,依赖注入是 MyBatis 与 Spring 集成的重要环节。通过 MapperScannerConfigurer,生成的 Mapper Bean 会自动注入到 Spring 容器中,从而可以使用 Spring 的依赖注入功能。这使得开发者可以方便地使用 Spring 的 AOP、事务管理等特性。
最后,示例集成展示了如何将 MapperScannerConfigurer 应用于实际项目中。通过一个简单的示例,读者可以了解到如何配置 MapperScannerConfigurer,以及如何使用生成的 Mapper Bean 进行数据库操作。
总之,MyBatis 的 MapperScannerConfigurer 是一个实用且重要的知识点,它简化了 MyBatis 与 Spring 的集成过程,提高了开发效率。在接下来的内容中,我们将详细讲解 MapperScannerConfigurer 的 Spring 配置、依赖注入以及示例集成,帮助读者更好地理解和应用这一知识点。
// MyBatis简介
// MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
// MapperScannerConfigurer功能
// MapperScannerConfigurer 是 MyBatis 提供的一个用于扫描指定包下接口的配置类,它会自动为这些接口生成对应的 Mapper 实例,并将其注册到 Spring 容器中。
// 与Spring集成方式
// MapperScannerConfigurer 可以与 Spring 容器集成,通过在 Spring 配置文件中配置 MapperScannerConfigurer 的 bean 来实现。
// Mapper接口扫描配置
// 在 Spring 配置文件中,可以通过配置 MapperScannerConfigurer 的 basePackage 属性来指定需要扫描的接口所在的包。
// 扫描路径配置
// basePackage 属性的值可以是单个包路径,也可以是多个包路径,多个包路径之间用逗号分隔。
// Mapper接口命名空间配置
// MapperScannerConfigurer 还可以配置 namespace 属性,用于指定 Mapper 接口的命名空间。
// 扫描包策略
// 默认情况下,MapperScannerConfigurer 会扫描指定包下的所有接口,如果需要更细粒度的控制,可以通过配置 includeSuperClass 和 annotationClass 属性来实现。
// MyBatis配置文件引用
// 在 Spring 配置文件中,可以通过配置 MapperScannerConfigurer 的 sqlSessionFactoryBeanName 属性来引用已经配置好的 MyBatis SqlSessionFactory。
// 扫描器配置属性
// MapperScannerConfigurer 还支持配置多个属性,如 resource、typeAliasesPackage、executorType 等。
// 扫描器生命周期
// MapperScannerConfigurer 的生命周期与 Spring 容器相同,当 Spring 容器启动时,它会自动扫描指定包下的接口,并生成对应的 Mapper 实例。
// 与Spring AOP结合
// MapperScannerConfigurer 可以与 Spring AOP 结合,通过配置拦截器来实现对 Mapper 接口方法的拦截和增强。
// 异常处理
// MapperScannerConfigurer 在扫描接口和生成 Mapper 实例的过程中可能会抛出异常,可以通过配置异常处理器来处理这些异常。
// 性能优化
// 为了提高性能,可以在 MapperScannerConfigurer 中配置缓存、懒加载等属性。
// 与其他框架集成
// MapperScannerConfigurer 可以与其他框架集成,如 Spring MVC、Spring Boot 等。
// 实际应用案例
// 在实际应用中,可以通过配置 MapperScannerConfigurer 来简化 MyBatis 的配置,提高开发效率。
以上代码块展示了 MyBatis 核心知识点之 MapperScannerConfigurer 的相关配置和使用方法。在实际应用中,通过配置 MapperScannerConfigurer,可以简化 MyBatis 的配置,提高开发效率。
| 配置项 | 描述 | 示例 |
|---|---|---|
| MapperScannerConfigurer | MyBatis 提供的用于扫描接口并自动生成 Mapper 实例的配置类 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> |
| basePackage | 指定需要扫描的接口所在的包路径,支持多个包路径,用逗号分隔 | <property name="basePackage" value="com.example.mapper"/> |
| namespace | 指定 Mapper 接口的命名空间,用于 MyBatis 的 XML 映射文件中 | <property name="namespace" value="com.example.mapper"/> |
| sqlSessionFactoryBeanName | 引用已经配置好的 MyBatis SqlSessionFactory 的 bean 名称 | <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> |
| includeSuperClass | 是否扫描父类接口,默认为 true,如果父类接口不需要生成 Mapper,则设置为 false | <property name="includeSuperClass" value="false"/> |
| annotationClass | 指定用于标记接口的注解类,默认为 org.apache.ibatis.annotations.Mapper | <property name="annotationClass" value="org.apache.ibatis.annotations.Mapper"/> |
| resource | 指定 MyBatis 配置文件的位置,可以是文件路径或类路径 | <property name="resource" value="mybatis-config.xml"/> |
| typeAliasesPackage | 指定类型别名所在的包路径,用于简化 XML 映射文件中的类型引用 | <property name="typeAliasesPackage" value="com.example.model"/> |
| executorType | 指定 MyBatis 的执行器类型,默认为 ExecutorType.BATCH,可选值还有 ExecutorType.SIMPLE | <property name="executorType" value="ExecutorType.BATCH"/> |
| cacheEnabled | 是否启用二级缓存,默认为 false | <property name="cacheEnabled" value="true"/> |
| lazyLoadingEnabled | 是否启用懒加载,默认为 false | <property name="lazyLoadingEnabled" value="true"/> |
| proxyTargetClass | 是否使用 CGLIB 代理,默认为 false,如果接口没有实现类,则设置为 true | <property name="proxyTargetClass" value="true"/> |
| defaultExecutorType | 默认的执行器类型,可选值与 executorType 相同 | <property name="defaultExecutorType" value="ExecutorType.BATCH"/> |
| defaultCacheEnabled | 默认的缓存启用状态,可选值与 cacheEnabled 相同 | <property name="defaultCacheEnabled" value="true"/> |
| defaultLazyLoadingEnabled | 默认的懒加载启用状态,可选值与 lazyLoadingEnabled 相同 | <property name="defaultLazyLoadingEnabled" value="true"/> |
| defaultProxyTargetClass | 默认的代理目标类启用状态,可选值与 proxyTargetClass 相同 | <property name="defaultProxyTargetClass" value="true"/> |
| defaultExecutorType | 默认的执行器类型,可选值与 executorType 相同 | <property name="defaultExecutorType" value="ExecutorType.BATCH"/> |
| defaultCacheEnabled | 默认的缓存启用状态,可选值与 cacheEnabled 相同 | <property name="defaultCacheEnabled" value="true"/> |
| defaultLazyLoadingEnabled | 默认的懒加载启用状态,可选值与 lazyLoadingEnabled 相同 | <property name="defaultLazyLoadingEnabled" value="true"/> |
| defaultProxyTargetClass | 默认的代理目标类启用状态,可选值与 proxyTargetClass 相同 | <property name="defaultProxyTargetClass" value="true"/> |
在配置MapperScannerConfigurer时,basePackage属性至关重要,它决定了MyBatis将扫描哪些包以查找接口并生成相应的Mapper实例。例如,若你的Mapper接口位于com.example.mapper包下,只需将basePackage属性设置为该包路径,MyBatis即可自动识别并生成对应的Mapper实例。值得注意的是,basePackage支持多个包路径,通过逗号分隔即可,这为项目结构复杂时提供了极大的灵活性。此外,namespace属性同样重要,它指定了Mapper接口的命名空间,这对于MyBatis在XML映射文件中定位对应的Mapper接口至关重要。通过合理配置这两个属性,可以确保MyBatis能够正确地扫描接口并生成相应的Mapper实例,从而简化开发过程。
MyBatis 是一款优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。在 MyBatis 中,Mapper 接口和 XML 映射文件是核心组件,而 MapperScannerConfigurer 则是 MyBatis 与 Spring 集成的重要配置类。
🎉 MapperScannerConfigurer:依赖注入的魔法师
MapperScannerConfigurer 是 MyBatis 提供的一个用于扫描指定包路径下接口的配置类,它可以将接口自动转换为对应的 Mapper 实例,并通过 Spring 的依赖注入机制将它们注入到相应的 Bean 中。
📝 扫描配置文件
首先,我们需要在 Spring 配置文件中配置 MapperScannerConfigurer。以下是一个典型的配置示例:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
在这个配置中,basePackage 属性指定了需要扫描的包路径。当 Spring 容器启动时,它会自动扫描这个包路径下的所有接口,并将它们转换为对应的 Mapper 实例。
📝 扫描包路径
MapperScannerConfigurer 会根据配置的 basePackage 属性,扫描指定包路径下的所有接口。如果需要扫描多个包路径,可以将 basePackage 设置为一个以逗号分隔的列表:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackages" value="com.example.mapper,com.example.other.mapper" />
</bean>
📝 注入 Mapper 实例
当 MapperScannerConfigurer 扫描到接口时,它会自动创建对应的 Mapper 实例,并通过 Spring 的依赖注入机制将其注入到相应的 Bean 中。这样,我们就可以在 Spring 容器中通过接口名称或类型来获取对应的 Mapper 实例。
@Autowired
private UserMapper userMapper;
📝 自动装配
MapperScannerConfigurer 还支持自动装配功能。当配置了 annotationClass 属性后,它会自动扫描指定注解的接口,并将它们转换为对应的 Mapper 实例。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
</bean>
在这个配置中,我们指定了 @Repository 注解,因此只有被 @Repository 注解的接口才会被扫描和注入。
📝 配置文件解析
MapperScannerConfigurer 还支持从配置文件中读取扫描策略、扫描结果处理、扫描异常处理等配置信息。以下是一个示例:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="typeAliasesPackage" value="com.example.model" />
<property name="properties">
<props>
<prop key="mybatis.mapper-namespace">com.example.mapper.UserMapper</prop>
</props>
</property>
</bean>
在这个配置中,我们指定了 sqlSessionFactoryBeanName 属性来指定 SQL 会话工厂的 Bean 名称,typeAliasesPackage 属性来指定类型别名所在的包路径,以及 properties 属性来指定 MyBatis 的配置属性。
通过以上配置,我们可以轻松地将 MyBatis 与 Spring 集成,并实现自动注入 Mapper 实例的功能。MapperScannerConfigurer 是 MyBatis 与 Spring 集成的重要配置类,它简化了 MyBatis 的配置过程,提高了开发效率。
| 配置属性/功能 | 描述 | 示例 |
|---|---|---|
basePackage | 指定需要扫描的包路径,用于自动扫描接口并创建对应的 Mapper 实例。 | <property name="basePackage" value="com.example.mapper" /> |
basePackages | 与 basePackage 类似,但可以指定多个包路径,以逗号分隔。 | <property name="basePackages" value="com.example.mapper,com.example.other.mapper" /> |
annotationClass | 指定用于自动扫描的注解,只有被指定注解的接口才会被扫描和注入。 | <property name="annotationClass" value="org.springframework.stereotype.Repository" /> |
sqlSessionFactoryBeanName | 指定 SQL 会话工厂的 Bean 名称,用于创建 Mapper 实例。 | <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> |
typeAliasesPackage | 指定类型别名所在的包路径,用于简化 MyBatis 的配置。 | <property name="typeAliasesPackage" value="com.example.model" /> |
properties | 用于指定 MyBatis 的配置属性,如映射命名空间等。 | `<property name="properties"> |
<props> <prop key="mybatis.mapper-namespace">com.example.mapper.UserMapper</prop> </props> </property>| | 自动注入 | 通过 Spring 的依赖注入机制,将创建的 Mapper 实例注入到相应的 Bean 中。 |@Autowired private UserMapper userMapper;| | 扫描策略 | 配置文件解析中,可以指定扫描策略、扫描结果处理、扫描异常处理等配置信息。 |<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <property name="typeAliasesPackage" value="com.example.model" /> <property name="properties"> <props> <prop key="mybatis.mapper-namespace">com.example.mapper.UserMapper</prop> </props> </property> </bean>` |
在实际应用中,
basePackage和basePackages的使用取决于项目的具体需求。例如,如果项目结构较为简单,可能只需要使用basePackage即可。然而,在大型项目中,可能需要使用basePackages来指定多个包路径,以便更灵活地管理接口扫描和注入。此外,annotationClass的设置可以确保只有符合特定注解的接口被扫描和注入,这有助于提高代码的可维护性和可读性。在配置sqlSessionFactoryBeanName时,应确保其值与实际创建的 SQL 会话工厂 Bean 名称一致,以避免配置错误。通过合理配置typeAliasesPackage,可以简化 MyBatis 的配置,减少重复代码,提高开发效率。在处理properties时,应仔细设置映射命名空间等属性,以确保 MyBatis 正确解析和执行 SQL 语句。最后,通过 Spring 的自动注入机制,可以将创建的 Mapper 实例注入到相应的 Bean 中,实现接口与实现类的解耦,提高代码的灵活性和可扩展性。
// MyBatis概述
// MyBatis 是一款优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。
// 它使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。
// MapperScannerConfigurer功能与作用
// MapperScannerConfigurer 是 MyBatis 提供的一个配置类,用于扫描指定包下的接口,并自动生成对应的 Mapper 实例。
// 它简化了 MyBatis 的配置过程,使得开发者无需手动创建和配置 Mapper 接口。
// MapperScannerConfigurer配置方法
// 在 Spring 配置文件中,可以通过以下方式配置 MapperScannerConfigurer:
// <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
// <property name="basePackage" value="com.example.mapper" />
// </bean>
// 示例代码集成
// 在 Spring 配置文件中,添加以下配置:
// <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
// <property name="basePackage" value="com.example.mapper" />
// </bean>
// Mapper接口扫描与注册
// 当 MapperScannerConfigurer 加载时,它会扫描指定包下的接口,并将它们注册为 Spring 的 Bean。
// 配置文件配置
// 在 MyBatis 的配置文件中,可以配置数据源、事务管理器等,以便与 Mapper 接口一起使用。
// 与Spring集成
// MapperScannerConfigurer 可以与 Spring 框架无缝集成,使得 MyBatis 的配置更加简单。
// 示例项目搭建
// 创建一个简单的 Spring Boot 项目,并在其中集成 MyBatis 和 MapperScannerConfigurer。
// Mapper接口使用
// 在业务层中,可以通过注入 Mapper 接口来使用 MyBatis 的功能。
// 异常处理
// 当 MyBatis 执行 SQL 语句时,可能会抛出异常。可以通过捕获这些异常来处理错误。
// 性能优化
// 为了提高性能,可以对 MyBatis 进行一些优化,例如使用缓存、合理配置 SQL 语句等。
// 与其他MyBatis特性的结合
// MyBatis 提供了许多特性,如动态 SQL、插件等,可以与 MapperScannerConfigurer 结合使用,以实现更强大的功能。
以上代码块展示了 MyBatis 核心知识点之 MapperScannerConfigurer 的示例集成,包括概述、功能与作用、配置方法、示例代码集成、Mapper 接口扫描与注册、配置文件配置、与 Spring 集成、示例项目搭建、Mapper 接口使用、异常处理、性能优化以及与其他 MyBatis 特性的结合。
| 知识点 | 描述 |
|---|---|
| MyBatis 概述 | MyBatis 是一款优秀的持久层框架,简化了 JDBC 代码,使用 XML 或注解进行配置和映射。 |
| MapperScannerConfigurer 功能与作用 | 自动扫描指定包下的接口,生成对应的 Mapper 实例,简化 MyBatis 配置。 |
| MapperScannerConfigurer 配置方法 | 在 Spring 配置文件中配置 MapperScannerConfigurer,指定基础包路径。 |
| 示例代码集成 | 在 Spring 配置文件中添加 MapperScannerConfigurer 配置。 |
| Mapper 接口扫描与注册 | MapperScannerConfigurer 加载时,扫描指定包下的接口,注册为 Spring Bean。 |
| 配置文件配置 | 在 MyBatis 配置文件中配置数据源、事务管理器等,与 Mapper 接口一起使用。 |
| 与 Spring 集成 | MapperScannerConfigurer 与 Spring 框架无缝集成,简化配置。 |
| 示例项目搭建 | 创建 Spring Boot 项目,集成 MyBatis 和 MapperScannerConfigurer。 |
| Mapper 接口使用 | 在业务层注入 Mapper 接口,使用 MyBatis 功能。 |
| 异常处理 | 捕获 MyBatis 执行 SQL 语句时抛出的异常,处理错误。 |
| 性能优化 | 使用缓存、合理配置 SQL 语句等优化 MyBatis 性能。 |
| 与其他 MyBatis 特性结合 | 结合 MyBatis 的动态 SQL、插件等特性,实现更强大的功能。 |
MyBatis 框架不仅简化了数据库操作,还提供了丰富的插件机制,允许开发者根据需求定制扩展功能,如分页插件、日志插件等,极大地增强了框架的灵活性和可扩展性。此外,MyBatis 的动态 SQL 功能使得编写复杂的 SQL 语句变得更为便捷,同时减少了代码量。
🍊 MyBatis核心知识点之MapperScannerConfigurer:常见问题
在大型Java项目中,MyBatis作为ORM框架,被广泛应用于数据持久层开发。然而,在实际应用中,开发者可能会遇到各种与MyBatis配置相关的问题,其中MapperScannerConfigurer的配置问题尤为常见。MapperScannerConfigurer是MyBatis提供的一个配置类,用于自动扫描指定包下的接口,生成对应的Mapper代理实现。然而,在实际使用过程中,开发者可能会遇到诸如接口扫描失败、映射文件找不到等问题。
介绍MyBatis核心知识点之MapperScannerConfigurer:常见问题的重要性在于,它能够帮助开发者快速定位并解决在实际开发中遇到的问题,提高开发效率。在大型项目中,MapperScannerConfigurer的配置错误可能导致整个数据访问层无法正常工作,影响项目的稳定性。因此,深入了解并掌握MapperScannerConfigurer的常见问题及其解决方案,对于Java开发者来说至关重要。
接下来,我们将依次介绍以下四个常见问题:
-
MyBatis核心知识点之MapperScannerConfigurer:问题一,将探讨接口扫描失败的原因及解决方法。接口扫描失败可能是由于配置错误、包路径不正确或接口定义不规范等原因造成的。
-
MyBatis核心知识点之MapperScannerConfigurer:问题二,将分析映射文件找不到的原因及解决策略。映射文件找不到可能是由于配置路径错误、文件不存在或文件格式不正确等原因导致的。
-
MyBatis核心知识点之MapperScannerConfigurer:问题三,将讨论如何正确配置MapperScannerConfigurer以支持泛型方法。在MyBatis中,泛型方法的使用需要特别注意类型参数的指定,否则可能导致运行时异常。
-
MyBatis核心知识点之MapperScannerConfigurer:问题四,将介绍如何配置MapperScannerConfigurer以支持动态SQL。动态SQL是MyBatis的核心特性之一,正确配置动态SQL对于实现复杂的查询需求至关重要。
通过以上四个问题的介绍,读者可以全面了解MyBatis核心知识点之MapperScannerConfigurer的常见问题及其解决方法,从而在实际开发中更加得心应手。
MyBatis的MapperScannerConfigurer是MyBatis框架中一个重要的配置类,它负责扫描指定包下的Mapper接口,并自动生成对应的Mapper代理实现,从而实现数据库操作。下面将围绕MapperScannerConfigurer的核心知识点进行详细阐述。
首先,我们来看MapperScannerConfigurer的配置原理。在Spring集成MyBatis时,通常需要在Spring配置文件中配置MapperScannerConfigurer。配置文件中,我们需要指定扫描的包路径,MapperScannerConfigurer会根据这个路径扫描指定包下的所有接口,并将这些接口识别为Mapper接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
在上面的代码中,basePackage属性指定了扫描的包路径,MapperScannerConfigurer会扫描这个路径下的所有接口。
接下来,我们探讨MapperScannerConfigurer的扫描机制。当MapperScannerConfigurer启动时,它会通过反射机制扫描指定包下的所有接口。对于每个接口,它会检查该接口是否实现了MyBatis的Mapper接口。如果实现了,则认为该接口是一个Mapper接口,并生成对应的Mapper代理实现。
public interface UserMapper {
// Mapper接口方法
}
public class UserMapperImpl implements UserMapper {
// Mapper接口实现
}
在上面的例子中,UserMapper是一个Mapper接口,UserMapperImpl是它的实现类。当MapperScannerConfigurer扫描到UserMapper接口时,它会生成UserMapperImpl的代理实现。
然后,我们来看MapperScannerConfigurer的注入配置。在Spring集成MyBatis时,MapperScannerConfigurer会将生成的Mapper代理实现注入到Spring容器中。这样,我们就可以在Spring容器中通过类型或者名称注入Mapper接口。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// 使用userMapper进行数据库操作
}
在上面的例子中,UserService类通过@Autowired注解注入了UserMapper接口,从而可以使用userMapper进行数据库操作。
接下来,我们探讨MapperScannerConfigurer的动态代理机制。当MapperScannerConfigurer生成Mapper代理实现时,它会使用Java的动态代理技术。动态代理可以让我们在不修改原始接口的情况下,为接口添加额外的功能,如日志记录、事务管理等。
public interface UserMapper {
// Mapper接口方法
}
public class UserMapperProxy implements InvocationHandler {
private Object target;
public UserMapperProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 添加额外功能,如日志记录、事务管理等
return method.invoke(target, args);
}
}
在上面的例子中,UserMapperProxy是一个动态代理类,它实现了InvocationHandler接口。当调用UserMapper接口的方法时,实际上是通过UserMapperProxy的invoke方法进行调用的。
此外,我们还需要关注MapperScannerConfigurer的SQL映射文件管理。在MyBatis中,SQL映射文件是Mapper接口实现数据库操作的关键。MapperScannerConfigurer会自动查找与Mapper接口同名的XML文件,并将XML文件中的SQL语句映射到Mapper接口的方法上。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
在上面的XML文件中,我们定义了一个selectById方法,该方法对应数据库中的user表。
最后,我们分析MapperScannerConfigurer的应用场景。在开发中,我们通常会将数据库操作相关的代码封装成Mapper接口,并通过MapperScannerConfigurer自动生成Mapper代理实现。这样,我们可以将数据库操作与业务逻辑分离,提高代码的可维护性和可扩展性。
在性能优化方面,我们可以通过以下策略来提高MapperScannerConfigurer的性能:
- 减少扫描的包路径,只扫描必要的包。
- 使用缓存技术,如MyBatis的二级缓存,减少数据库访问次数。
- 优化SQL语句,提高查询效率。
总之,MyBatis的MapperScannerConfigurer在Spring集成MyBatis中扮演着重要角色。通过理解其配置原理、扫描机制、注入配置、动态代理、SQL映射文件管理等方面的知识,我们可以更好地利用MapperScannerConfigurer,提高开发效率。
| 核心知识点 | 详细描述 |
|---|---|
| 配置原理 | 在Spring集成MyBatis时,通过配置文件指定扫描的包路径,MapperScannerConfigurer根据路径扫描接口,识别为Mapper接口并生成代理实现。 |
| 扫描机制 | MapperScannerConfigurer启动时,通过反射机制扫描指定包下的所有接口,检查接口是否实现MyBatis的Mapper接口,实现则生成代理实现。 |
| 注入配置 | MapperScannerConfigurer将生成的Mapper代理实现注入到Spring容器中,通过类型或名称注入Mapper接口,实现数据库操作。 |
| 动态代理机制 | 使用Java动态代理技术,在不修改原始接口的情况下,为接口添加额外功能,如日志记录、事务管理等。 |
| SQL映射文件管理 | MapperScannerConfigurer自动查找与Mapper接口同名的XML文件,将XML文件中的SQL语句映射到Mapper接口的方法上。 |
| 应用场景 | 将数据库操作封装成Mapper接口,通过MapperScannerConfigurer自动生成代理实现,实现数据库操作与业务逻辑分离,提高代码可维护性和可扩展性。 |
| 性能优化策略 | 1. 减少扫描的包路径,只扫描必要的包。 2. 使用缓存技术,如MyBatis的二级缓存,减少数据库访问次数。 3. 优化SQL语句,提高查询效率。 |
在实际应用中,Spring集成MyBatis的配置原理不仅涉及简单的包路径扫描,更是一个复杂的配置过程。通过合理配置,可以实现接口与数据库操作的解耦,使得业务逻辑更加清晰。例如,在大型项目中,通过精确控制扫描范围,可以有效避免不必要的性能损耗。此外,动态代理机制的应用,使得在不修改原始接口的前提下,可以轻松实现日志记录、事务管理等高级功能,极大地提高了系统的可维护性和灵活性。
MyBatis的MapperScannerConfigurer是MyBatis框架中一个重要的配置类,它负责扫描指定包下的Mapper接口,并自动生成对应的Mapper代理对象,从而实现接口与XML映射文件的绑定。下面将围绕MapperScannerConfigurer的核心知识点进行详细阐述。
首先,我们来看一下MapperScannerConfigurer的配置原理。在Spring框架中,MapperScannerConfigurer通过实现BeanDefinitionParser接口来解析XML配置文件中的<mybatis:scan>标签。当Spring容器启动时,它会读取配置文件中的<mybatis:scan>标签,并调用MapperScannerConfigurer的parse方法。
public class MapperScannerConfigurer implements BeanDefinitionParser {
// ... 省略其他代码 ...
@Override
public BeanDefinition parse(Element element) {
// 解析XML配置,获取扫描包路径等信息
// ... 省略其他代码 ...
return createBeanDefinition();
}
}
接下来,我们探讨一下MapperScannerConfigurer的扫描机制。MapperScannerConfigurer通过扫描指定包下的接口,并检查这些接口是否实现了MyBatis的Mapper接口。如果接口符合条件,则将其注册为Spring的Bean。
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
// ... 省略其他代码 ...
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
// 扫描指定包下的接口
// ... 省略其他代码 ...
}
}
在扫描过程中,MapperScannerConfigurer会为每个符合条件的接口生成一个Mapper代理对象。这个代理对象通过动态代理技术实现,使得接口与XML映射文件进行绑定。
public class MapperProxy<T> implements InvocationHandler, Serializable {
// ... 省略其他代码 ...
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 调用MyBatis的XML映射文件进行数据库操作
// ... 省略其他代码 ...
}
}
此外,MapperScannerConfigurer还支持注入策略,允许用户自定义Mapper接口的注入方式。默认情况下,MapperScannerConfigurer会将Mapper代理对象注入到对应的接口实现类中。
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
// ... 省略其他代码 ...
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 注入策略,将Mapper代理对象注入到对应的接口实现类中
// ... 省略其他代码 ...
}
}
在Spring集成方面,MapperScannerConfigurer与Spring框架紧密结合,使得MyBatis在Spring项目中得以顺利使用。通过配置文件解析,MapperScannerConfigurer可以轻松地读取并解析XML配置文件中的<mybatis:scan>标签。
public class MapperScannerConfigurer implements BeanDefinitionParser {
// ... 省略其他代码 ...
@Override
public BeanDefinition parse(Element element) {
// 解析XML配置,获取扫描包路径等信息
// ... 省略其他代码 ...
return createBeanDefinition();
}
}
最后,我们讨论一下性能优化。在MyBatis中,MapperScannerConfigurer的性能优化主要体现在以下几个方面:
- 扫描机制:通过合理配置扫描包路径,减少不必要的接口扫描,提高扫描效率。
- 动态代理:使用Cglib或JDK动态代理技术,提高代理对象的创建速度。
- 注入策略:根据实际需求,选择合适的注入策略,减少资源消耗。
总之,MyBatis的MapperScannerConfigurer在实现接口与XML映射文件的绑定方面发挥着重要作用。通过深入了解其配置原理、扫描机制、动态代理技术、注入策略、Spring集成和性能优化等方面,我们可以更好地利用MyBatis框架,提高项目开发效率。
| 核心知识点 | 描述 |
|---|---|
| 配置原理 | MapperScannerConfigurer通过实现BeanDefinitionParser接口解析XML配置文件中的<mybatis:scan>标签,并在Spring容器启动时读取配置文件中的<mybatis:scan>标签,调用parse方法进行解析。 |
| 扫描机制 | MapperScannerConfigurer扫描指定包下的接口,检查这些接口是否实现了MyBatis的Mapper接口。符合条件的接口被注册为Spring的Bean。 |
| 动态代理 | 为每个符合条件的接口生成一个Mapper代理对象,通过动态代理技术实现接口与XML映射文件的绑定。 |
| 注入策略 | 支持注入策略,允许用户自定义Mapper接口的注入方式,默认情况下将Mapper代理对象注入到对应的接口实现类中。 |
| Spring集成 | MapperScannerConfigurer与Spring框架紧密结合,通过配置文件解析,可以轻松地读取并解析XML配置文件中的<mybatis:scan>标签。 |
| 性能优化 | 1. 扫描机制:合理配置扫描包路径,减少不必要的接口扫描,提高扫描效率。2. 动态代理:使用Cglib或JDK动态代理技术,提高代理对象的创建速度。3. 注入策略:根据实际需求,选择合适的注入策略,减少资源消耗。 |
MapperScannerConfigurer在MyBatis与Spring的集成中扮演着至关重要的角色。它不仅简化了Mapper接口的配置过程,还提供了灵活的注入策略,使得开发者可以更加专注于业务逻辑的实现。通过动态代理技术,MapperScannerConfigurer能够为每个符合条件的接口生成代理对象,实现接口与XML映射文件的绑定,从而在运行时动态地调用相应的SQL语句。此外,其性能优化策略,如合理配置扫描包路径、使用高效的动态代理技术以及根据需求选择合适的注入策略,都显著提升了整个系统的性能和效率。
MyBatis的MapperScannerConfigurer是MyBatis框架中一个重要的配置类,它负责扫描指定包下的接口,并自动生成对应的Mapper代理实现。下面将围绕MapperScannerConfigurer的核心知识点进行详细阐述。
首先,我们来看配置原理。MapperScannerConfigurer通过解析XML配置文件或注解来获取扫描的包路径,然后通过反射机制动态创建Mapper接口的代理实现。具体来说,它通过MapperScannerConfigurer的setBasePackage方法设置扫描的包路径,然后通过MapperFactoryBean创建Mapper接口的代理实现。
接下来,我们探讨扫描机制。MapperScannerConfigurer的扫描机制主要依赖于Spring的BeanDefinitionRegistryPostProcessor接口。当Spring容器启动时,MapperScannerConfigurer会先于其他Bean初始化,从而在Bean初始化过程中自动扫描指定包下的接口,并注册相应的Mapper代理实现。
在映射器接口生成方面,MyBatis通过动态代理技术生成Mapper接口的代理实现。具体来说,MapperScannerConfigurer会创建一个MapperFactoryBean,该Bean实现了FactoryBean接口,用于创建Mapper接口的代理实现。代理实现中包含了MyBatis的SqlSession,用于执行数据库操作。
注入策略是MapperScannerConfigurer的另一个重要方面。在Spring容器中,MapperScannerConfigurer会将生成的Mapper代理实现注入到相应的Bean中。这样,我们就可以在Spring容器中直接使用Mapper接口进行数据库操作。
配置文件解析是MapperScannerConfigurer的核心功能之一。它通过解析XML配置文件或注解来获取扫描的包路径、Mapper接口的名称等信息。在XML配置文件中,我们可以通过<package>标签指定扫描的包路径,通过<sqlSessionTemplate>标签指定SqlSessionTemplate的Bean名称。
动态代理技术在MapperScannerConfigurer中扮演着重要角色。通过动态代理,MyBatis可以实现对Mapper接口的代理实现,从而在无需编写额外代码的情况下,实现数据库操作。动态代理的实现主要依赖于Java的Proxy类和InvocationHandler接口。
与Spring集成是MapperScannerConfigurer的另一个重要特点。通过将MapperScannerConfigurer集成到Spring容器中,我们可以方便地在Spring项目中使用MyBatis进行数据库操作。在Spring项目中,我们只需在配置文件中添加MapperScannerConfigurer的Bean定义,并设置相应的扫描包路径即可。
性能优化是MapperScannerConfigurer需要关注的一个方面。为了提高性能,我们可以通过以下方式优化MapperScannerConfigurer:
- 减少扫描的包路径,只扫描必要的包。
- 使用缓存技术,如二级缓存,减少数据库访问次数。
- 优化SQL语句,提高查询效率。
异常处理是MapperScannerConfigurer需要考虑的一个问题。在数据库操作过程中,可能会出现各种异常,如连接异常、SQL异常等。为了提高系统的稳定性,我们需要对异常进行处理。在MapperScannerConfigurer中,我们可以通过自定义异常处理策略来实现。
应用案例:在Spring项目中,我们可以通过以下步骤使用MapperScannerConfigurer:
- 在Spring配置文件中添加MapperScannerConfigurer的Bean定义。
- 设置扫描的包路径。
- 在相应的Bean中注入Mapper接口。
通过以上步骤,我们可以在Spring项目中方便地使用MyBatis进行数据库操作。总之,MapperScannerConfigurer是MyBatis框架中一个重要的配置类,它通过扫描指定包下的接口,自动生成对应的Mapper代理实现,从而简化了数据库操作的开发过程。
| 核心知识点 | 描述 |
|---|---|
| 配置原理 | MapperScannerConfigurer通过解析XML配置文件或注解来获取扫描的包路径,然后通过反射机制动态创建Mapper接口的代理实现。具体来说,它通过setBasePackage方法设置扫描的包路径,然后通过MapperFactoryBean创建Mapper接口的代理实现。 |
| 扫描机制 | MapperScannerConfigurer的扫描机制依赖于Spring的BeanDefinitionRegistryPostProcessor接口。当Spring容器启动时,MapperScannerConfigurer会先于其他Bean初始化,从而在Bean初始化过程中自动扫描指定包下的接口,并注册相应的Mapper代理实现。 |
| 映射器接口生成 | MyBatis通过动态代理技术生成Mapper接口的代理实现。MapperScannerConfigurer创建一个MapperFactoryBean,该Bean实现了FactoryBean接口,用于创建Mapper接口的代理实现。代理实现中包含了MyBatis的SqlSession,用于执行数据库操作。 |
| 注入策略 | MapperScannerConfigurer将生成的Mapper代理实现注入到相应的Bean中,使得在Spring容器中可以直接使用Mapper接口进行数据库操作。 |
| 配置文件解析 | MapperScannerConfigurer通过解析XML配置文件或注解来获取扫描的包路径、Mapper接口的名称等信息。在XML配置文件中,通过<package>标签指定扫描的包路径,通过<sqlSessionTemplate>标签指定SqlSessionTemplate的Bean名称。 |
| 动态代理技术 | 动态代理技术在MapperScannerConfigurer中用于实现对Mapper接口的代理实现,依赖于Java的Proxy类和InvocationHandler接口。 |
| 与Spring集成 | MapperScannerConfigurer集成到Spring容器中,方便在Spring项目中使用MyBatis进行数据库操作。只需在配置文件中添加MapperScannerConfigurer的Bean定义,并设置相应的扫描包路径即可。 |
| 性能优化 | 为了提高性能,可以通过减少扫描的包路径、使用缓存技术、优化SQL语句等方式优化MapperScannerConfigurer。 |
| 异常处理 | MapperScannerConfigurer需要考虑异常处理,如连接异常、SQL异常等,通过自定义异常处理策略提高系统稳定性。 |
| 应用案例 | 在Spring项目中使用MapperScannerConfigurer的步骤包括:添加MapperScannerConfigurer的Bean定义、设置扫描的包路径、在相应的Bean中注入Mapper接口。 |
MapperScannerConfigurer在Spring框架中扮演着至关重要的角色,它不仅简化了MyBatis的配置过程,还极大地提升了开发效率。通过解析XML配置文件或注解,它能够自动扫描指定包路径下的Mapper接口,并动态生成代理实现。这种机制不仅减少了手动配置的繁琐,还使得MyBatis与Spring的集成变得更为无缝。在实际应用中,合理配置MapperScannerConfigurer,不仅可以提高数据库操作的性能,还能通过优化SQL语句和采用缓存技术来进一步提升系统性能。
MyBatis的MapperScannerConfigurer是MyBatis与Spring集成的重要组件,它负责扫描指定路径下的Mapper接口,并自动生成对应的映射器实现类,实现依赖注入和动态代理。下面将围绕MapperScannerConfigurer的核心知识点进行详细阐述。
首先,我们来看MapperScannerConfigurer的配置原理。在Spring配置文件中,我们通常通过以下方式配置MapperScannerConfigurer:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
这里,basePackage属性指定了Mapper接口所在的包路径。MapperScannerConfigurer会扫描这个包路径下的所有接口,并自动生成对应的映射器实现类。
接下来,我们深入探讨MapperScannerConfigurer的扫描机制。当Spring容器启动时,MapperScannerConfigurer会执行以下步骤:
- 获取指定包路径下的所有接口。
- 遍历这些接口,检查它们是否实现了MyBatis的
Mapper接口。 - 对于每个实现了
Mapper接口的接口,生成对应的映射器实现类。 - 将生成的映射器实现类注册到Spring容器中。
在这个过程中,MapperScannerConfigurer利用了Java的反射机制来动态获取接口信息,并生成对应的映射器实现类。下面是一个简单的示例代码:
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
private String basePackage;
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
try {
ClassPathScanner scanner = new ClassPathScanner(registry);
scanner.addIncludeFilter(new AnnotationTypeFilter(Mapper.class));
scanner.scan(basePackage);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Do nothing
}
}
在上面的代码中,我们通过ClassPathScanner来扫描指定包路径下的接口,并使用AnnotationTypeFilter来过滤实现了Mapper接口的接口。
接下来,我们来看MapperScannerConfigurer如何实现映射器接口生成。当MapperScannerConfigurer扫描到实现了Mapper接口的接口时,它会生成对应的映射器实现类。这个映射器实现类继承自SqlSessionTemplate,并实现了接口中的方法。下面是一个简单的示例代码:
public class MyMapperProxy<T> implements InvocationHandler {
private final Class<T> mapperInterface;
private final SqlSession sqlSession;
public MyMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {
this.mapperInterface = mapperInterface;
this.sqlSession = sqlSession;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String statementId = mapperInterface.getName() + "." + method.getName();
return sqlSession.selectOne(statementId, args);
}
}
在上面的代码中,我们通过MyMapperProxy类实现了动态代理,并在代理方法中调用MyBatis的SqlSession来执行SQL语句。
此外,MapperScannerConfigurer还涉及到依赖注入和动态代理。在Spring容器中,MapperScannerConfigurer会将生成的映射器实现类注册为Bean,并注入到需要使用Mapper接口的Bean中。这样,我们就可以在需要使用Mapper接口的Bean中直接注入Mapper实现类,实现依赖注入。
最后,我们来看MapperScannerConfigurer的扫描路径配置和扫描策略。在Spring配置文件中,我们可以通过以下方式配置扫描路径:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
这里,basePackage属性指定了Mapper接口所在的包路径,而sqlSessionFactoryBeanName属性指定了MyBatis的SqlSessionFactory的Bean名称。这样,MapperScannerConfigurer会使用指定的SqlSessionFactory来创建SqlSession,并执行SQL语句。
在扫描策略方面,MapperScannerConfigurer提供了多种策略,如按类名生成映射器实现类、按接口名生成映射器实现类等。这些策略可以根据实际需求进行选择。
总之,MyBatis的MapperScannerConfigurer在MyBatis与Spring集成中扮演着重要角色。通过深入理解其配置原理、扫描机制、映射器接口生成、依赖注入、动态代理等核心知识点,我们可以更好地利用MyBatis和Spring的优势,提高开发效率。
| 核心知识点 | 描述 | 示例 |
|---|---|---|
| MapperScannerConfigurer配置 | 通过在Spring配置文件中配置MapperScannerConfigurer,指定Mapper接口所在的包路径,实现自动扫描和生成映射器实现类。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> |
| 扫描机制 | MapperScannerConfigurer在Spring容器启动时,执行以下步骤:获取指定包路径下的所有接口,检查它们是否实现了MyBatis的Mapper接口,生成对应的映射器实现类,并将它们注册到Spring容器中。 | ClassPathScanner scanner = new ClassPathScanner(registry); scanner.addIncludeFilter(new AnnotationTypeFilter(Mapper.class)); scanner.scan(basePackage); |
| 映射器接口生成 | 当MapperScannerConfigurer扫描到实现了Mapper接口的接口时,它会生成对应的映射器实现类,该类继承自SqlSessionTemplate并实现了接口中的方法。 | MyMapperProxy<T> implements InvocationHandler |
| 依赖注入 | MapperScannerConfigurer将生成的映射器实现类注册为Bean,并注入到需要使用Mapper接口的Bean中,实现依赖注入。 | MapperScannerConfigurer会将生成的映射器实现类注册为Bean,并注入到需要使用Mapper接口的Bean中 |
| 扫描路径配置 | 在Spring配置文件中,通过basePackage属性指定Mapper接口所在的包路径,通过sqlSessionFactoryBeanName属性指定MyBatis的SqlSessionFactory的Bean名称。 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> |
| 扫描策略 | MapperScannerConfigurer提供了多种策略,如按类名生成映射器实现类、按接口名生成映射器实现类等。 | 根据实际需求选择合适的策略进行配置。 |
MapperScannerConfigurer的配置不仅简化了MyBatis映射器的管理,还提高了开发效率。通过指定包路径,自动扫描和生成映射器实现类,使得开发者无需手动编写映射器实现代码,从而降低了出错的可能性。此外,这种配置方式也使得项目结构更加清晰,易于维护。在实际应用中,可以根据项目需求,灵活配置扫描策略,如按类名或接口名生成映射器实现类,以适应不同的开发场景。

博主分享
📥博主的人生感悟和目标

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。
- 《Java项目实战—深入理解大型互联网企业通用技术》基础篇的购书链接:https://item.jd.com/14152451.html
- 《Java项目实战—深入理解大型互联网企业通用技术》基础篇繁体字的购书链接:http://product.dangdang.com/11821397208.html
- 《Java项目实战—深入理解大型互联网企业通用技术》进阶篇的购书链接:https://item.jd.com/14616418.html
- 《Java项目实战—深入理解大型互联网企业通用技术》架构篇待上架
- 《解密程序员的思维密码--沟通、演讲、思考的实践》购书链接:https://item.jd.com/15096040.html
面试备战资料
八股文备战
| 场景 | 描述 | 链接 |
|---|---|---|
| 时间充裕(25万字) | Java知识点大全(高频面试题) | Java知识点大全 |
| 时间紧急(15万字) | Java高级开发高频面试题 | Java高级开发高频面试题 |
理论知识专题(图文并茂,字数过万)
| 技术栈 | 链接 |
|---|---|
| RocketMQ | RocketMQ详解 |
| Kafka | Kafka详解 |
| RabbitMQ | RabbitMQ详解 |
| MongoDB | MongoDB详解 |
| ElasticSearch | ElasticSearch详解 |
| Zookeeper | Zookeeper详解 |
| Redis | Redis详解 |
| MySQL | MySQL详解 |
| JVM | JVM详解 |
集群部署(图文并茂,字数过万)
| 技术栈 | 部署架构 | 链接 |
|---|---|---|
| MySQL | 使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群 | Docker-Compose部署教程 |
| Redis | 三主三从集群(三种方式部署/18个节点的Redis Cluster模式) | 三种部署方式教程 |
| RocketMQ | DLedger高可用集群(9节点) | 部署指南 |
| Nacos+Nginx | 集群+负载均衡(9节点) | Docker部署方案 |
| Kubernetes | 容器编排安装 | 最全安装教程 |
开源项目分享
| 项目名称 | 链接地址 |
|---|---|
| 高并发红包雨项目 | https://gitee.com/java_wxid/red-packet-rain |
| 微服务技术集成demo项目 | https://gitee.com/java_wxid/java_wxid |
管理经验
【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718
希望各位读者朋友能够多多支持!
现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目:Java程序员廖志伟
- 🌥 哔哩哔哩:Java程序员廖志伟
- 🎏 个人社区:Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
2795

被折叠的 条评论
为什么被折叠?



