3.3 Spring 整合
什么是 Spring
Spring 是一个广泛应用的轻量级的开源框架,旨在简化企业级应用开发的复杂性。 它通过核心的 BeanFactory 实现了底层类的实例化和生命周期管理。
- String 项目地址:https://spring.io/
dbvisitor-spring 特性
- 广泛的版本支持
- SpringBoot 2/3
- Spring 4.0.0 最低
- 多种配置方式
- application.properties 配置文件
- 注解化
- Spring XML 方式配置
配置方法
首先引入依赖包,当前版本:6.0.1
- SpringBoot 项目
- 非 SpringBoot 项目
<dependency>
<groupId>net.hasor</groupId>
<artifactId>dbvisitor-spring-starter</artifactId>
<version>最新版本的版本号</version>
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>dbvisitor-spring</artifactId>
<version>最新版本的版本号</version>
</dependency>
选用 HikariCP 作为数据库链接池
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
- 基于 application.properties 配置文件
- 基于注解化配置
- 基于 XML 配置
# Spring JDBC 数据源配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/devtester
spring.datasource.username=root
spring.datasource.password=123456
# 必选
dbvisitor.mapper-packages=com.example.demo.dao
dbvisitor.mapper-locations=classpath:dbvisitor/mapper/*.xml
@Configuration
@MapperScan(basePackages = "com.example.demo.dao",
mapperLocations = "classpath:dbvisitor/mapper/*.xml")
public class DemoApplication {
...
}
<!-- Configuration -->
<bean id="configuration" class="net.hasor.dbvisitor.spring.support.ConfigurationBean">
<property name="mapperResources" value="classpath*:dbvisitor/mapper/*Mapper.xml"/>
</bean>
<!-- Session -->
<bean id="session" class="net.hasor.dbvisitor.spring.support.SessionBean">
<property name="configuration" ref="configuration"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- userMapper -->
<bean id="userMapper" class="net.hasor.dbvisitor.spring.support.MapperBean">
<property name="session" ref="session"/>
<property name="mapperInterface" value="com.example.demo.dao.UserMapper"/>
</bean>
如果为每个 Mapper 单独添加 XML 配置较为繁琐,那么可以通过 MapperScannerConfigurer
来扫描注册。
<!-- Mapper Scanner -->
<bean class="net.hasor.dbvisitor.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.demo.dao"/>
<property name="session" ref="session"/>
</bean>
注入 Mapper
public class ServiceTest {
@Resource // 或 @Autowired
private UserMapper userMapper;
...
}
使用事务
- 基于注解化配置
- 基于 XML 配置
@Configuration
public class DsConfig {
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
通过 @Transactional 注解进行事务控制
import org.springframework.transaction.annotation.Transactional;
public class TxExample {
@Transactional(propagation = Propagation.REQUIRES)
public void exampleMethod() {
...
}
}
样例工程
Example
- 基于 application.properties 的 SpringBoot2 案例、SpringBoot3 案例
- 基于 XML 配置的 Example 工程
- 基于 XML 配置并使用 MapperScannerConfigurer 扫描器案例
配置项说明
application.properties 配置项
属性名 | 描述 |
---|---|
dbvisitor.mapper-packages | 可选 要扫描加载的 Mapper 接口定义所在的包名,如果有多个包使用 , 号分割 |
dbvisitor.mapper-locations | 可选 要扫描加载的 Mapper 映射文件所在路径,默认值为 classpath*:/dbvisitor/mapper/**/*.xml ,如果有多个可以通过一下任意一个字符进行分割 ,; \t\n |
dbvisitor.mapper-disabled | 可选 使用 true/false 表示是否禁用 dbvisitor.mapper-packages 扫描到的 Mapper 接口。默认值为 false 当与某些框架合用同一个 mapper 文件时如果遇到冲突可考虑设置为 true |
dbvisitor.mapper-name-generator | 可选 用于自定义生成 mapper bean 名字的生成器类名。需要实现 BeanNameGenerator 接口,默认为:空。 |
dbvisitor.marker-annotation | 可选 设置一个扫描路径当扫描到的 Mapper 接口身上标有某个特定类型的注解时才会被认作 Mapper 接口类。默认为:net.hasor.dbvisitor.mapper.MapperDef |
dbvisitor.marker-interface | 可选 设置一个扫描路径当扫描到的 Mapper 接口实现了某个特定接口时才会被认作 Mapper 接口类。默认为:net.hasor.dbvisitor.mapper.Mapper |
dbvisitor.mapper-factory-bean | 可选 创建 Mapper 的工厂类,默认为 net.hasor.dbvisitor.spring.support.MapperBean |
dbvisitor.ref-session | 可选 用于自定义 Mapper Bean 所使用的 Session Bean 的名字。 |
dbvisitor.mapper-lazy-init | 可选 Mapper Bean 的 lazyInit 属性,默认为 false |
dbvisitor.mapper-scope | 可选 Mapper Bean 所处的 Spring 作用域,默认值为 AbstractBeanDefinition.SCOPE_DEFAULT 确定。如果设置建议为 singleton。 |
dbvisitor.auto-mapping | 可选 是否将类型下的所有字段都自动和数据库中的列进行映射匹配,true 表示自动。false 表示必须通过 @Column 注解声明 |
dbvisitor.camel-case | 可选 表名和属性名,根据驼峰规则转换为带有下划线的表名和列名 |
dbvisitor.use-delimited | 可选 强制在生成 表名/列名/索引名 时候增加标识符限定,例如:通过设置该属性来解决列名为关键字的问题。默认是 false 不设置。 |
dbvisitor.case-insensitive | 可选 是否对表名列名敏感,默认 true 不敏感 |
dbvisitor.ignore-nonexist-statement | 可选 在 Mapper 接口方法映射到 XML 过程中是否忽略缺失的映射。默认是 false,遇到缺失会报错。 |
dbvisitor.dialect | 可选 默认使用的数据库方言 |
@MapperScan 注解属性详解
属性名 | 描述 |
---|---|
value、basePackages、basePackageClasses | 参考 dbvisitor.mapper-packages 配置 |
mapperLocations | 参考 dbvisitor.mapper-locations 配置 |
nameGenerator | 参考 dbvisitor.mapper-name-generator 配置 |
annotationClass | 参考 dbvisitor.marker-annotation 配置 |
markerInterface | 参考 dbvisitor.marker-interface 配置 |
sessionRef | 参考 dbvisitor.ref-session 配置 |
factoryBean | 参考 dbvisitor.mapper-factory-bean 配置 |
lazyInit | 参考 dbvisitor.mapper-lazy-init 配置 |
defaultScope | 参考 dbvisitor.mapper-scope 配置 |
mapperDisabled | 参考 dbvisitor.mapper-disabled 配置 |
tip
注解配置优先级高于配置文件(推荐 application.properties,配置更简单)
ConfigurationBean 属性详解
属性名 | 描述 |
---|---|
mapperResources | 参考 dbvisitor.mapper-locations 配置 |
mapperInterfaces | 参考 dbvisitor.marker-interface 配置,ConfigurationBean 会加载 Mapper 上声明的资源引用。 |
typeRegistry | 用于自定义 类型处理 注册器 |
javaTypeHandlerMap | 用于将自定义 TypeHandler 作为某 Java 类型的处理器 |
jdbcTypeHandlerMap | 用于将自定义 TypeHandler 作为某 JDBC 类型的处理器 |
ruleRegistry | 用于自定义 规则 注册器 |
ruleHandlerMap | 用于注册自定义规则 |
autoMapping | 参考 dbvisitor.auto-mapping 配置 |
camelCase | 参考 dbvisitor.camel-case |
caseInsensitive | 参考 dbvisitor.case-insensitive |
useDelimited | 参考 dbvisitor.use-delimited |
dialectName | 参考 dbvisitor.dialect |
ignoreNonExistStatement | 参考 dbvisitor.ignore-nonexist-statement |
SessionBean 属性详解
属性名 | 描述 |
---|---|
configuration | SessionBean 创建的 Session 所使用的 Configuration |
dataSource | 所使用的 DataSource |
dsAdapter | AbstractDsAdapter 类型对象,该类决定了如何从 dataSource 中获取 Connection |
dsAdapterClass | dsAdapter 类型名,Class 类型。于 dsAdapterName 属性等价 |
dsAdapterName | dsAdapter 类型名,String 类型。于 dsAdapterClass 属性等价 |
MapperBean 属性详解
属性名 | 描述 |
---|---|
session | MapperBean 创建 Mapper 对象所使用的 Session |
mapperInterface | MapperBean 创建的具体 Mapper |
MapperScannerConfigurer 属性详解
属性名 | 描述 |
---|---|
basePackage | 参考 dbvisitor.mapper-packages 配置 |
nameGeneratorName | 参考 dbvisitor.mapper-name-generator 配置,类型名 |
nameGenerator | 参考 dbvisitor.mapper-name-generator 配置,对象化 |
annotationClassName | 参考 dbvisitor.marker-annotation 配置,类型名 |
annotationClass | 参考 dbvisitor.marker-annotation 配置,类型 |
markerInterfaceName | 参考 dbvisitor.marker-interface 配置,类型名 |
markerInterface | 参考 dbvisitor.marker-interface 配置,类型 |
session | 参考 dbvisitor.ref-session 配置,对象 |
sessionRef | 参考 dbvisitor.ref-session 配置,引用的 Bean 名 |
mapperFactoryBeanClassName | 参考 dbvisitor.mapper-factory-bean 配置,类型名 |
mapperFactoryBeanClass | 参考 dbvisitor.mapper-factory-bean 配置,类型 |
mapperDisabled | 参考 dbvisitor.mapper-disabled 配置 |
lazyInit | 参考 dbvisitor.mapper-lazy-init 配置 |
defaultScope | 参考 dbvisitor.mapper-scope 配置 |
dependsOn | Mapper 在创建时依赖的前置 Bean |